在 keycloak 中跳过 kerberos sso 身份验证

Posted

技术标签:

【中文标题】在 keycloak 中跳过 kerberos sso 身份验证【英文标题】:Skip kerberos sso authentication in keycloak 【发布时间】:2021-12-06 04:23:06 【问题描述】:

在某些情况下,我们需要跳过通过 Kerberos 进行的自动登录。 根据documentation,这应该通过参数?prompt=login来完成:

提示 - Keycloak 支持以下设置:

登录 - 将忽略 SSO,并且始终显示 Keycloak 登录页面,即使用户已通过身份验证

这在大多数情况下都有效(我们也使用 NTLM waffle 实现),但使用 Kerberos,用户始终会自动登录。 任何提示或想法为什么? 是否有其他方法可以强制转发到登录页面?

编辑:我需要跳过 Kerberos 身份验证的原因是因为我需要使用必须输入用户名+密码的管理员帐户登录。

EDIT2:我们使用的是 Keycloak.x 版本 14.0.0,也适用于版本 15.0.2。

【问题讨论】:

您能说一下在哪些情况下您希望跳过 Kerberos 身份验证吗? 刚刚添加了更多信息,请参阅编辑: 您在特定客户端或所有客户端上都需要这个吗?如果它只是一个特定的客户端,您是否需要对该客户端进行 kerberos 身份验证? 我需要能够跳过所有客户端的身份验证。 如果没有自定义编码,我认为这是不可能的。 【参考方案1】:

参数?prompt=login 只会在您的身份验证流程中跳过Cookie 身份验证器。 Cookie 身份验证器的执行将被标记为已尝试但不成功。因此 Keycloak 将回退到替代身份验证器。我假设 Kerberos 身份验证器被配置为替代方案。如果是这种情况,您将(自动)由 Kerberos 身份验证器进行身份验证。

如果您只需要对特定客户端进行此行为,您可能希望在没有 Kerberos 身份验证器的情况下为该客户端创建额外的身份验证流程。使用Authentication flow overrides 为客户端配置新流程。

【讨论】:

为了测试,我禁用了“Cookie 身份验证器”,因此“Kerberos”和“身份提供程序重定向器”以及“表单”设置为“ALTERNATIVE”。但是 ?prompt=login 仍然不起作用。我希望不要使用替代流程,但似乎是目前唯一的解决方案。您认为这是 Keycloak 中的错误吗?因为使用 NTLM 它可以工作。也许我会尝试他们的论坛。【参考方案2】:

我刚刚创建了一个功能请求,并在代码方面提供了可能的解决方案。skip kerberos SSO authentication to use login-form

也许能够用包含login 参数处理的自定义SpnegoAuthenticator 覆盖默认值。 我在 kerberos 环境中对其进行了修补和测试,它确实有效。

@Override
public void authenticate(AuthenticationFlowContext context) 
// +++ BEGIN CHANGE +++
    AuthenticationSessionModel session = context.getAuthenticationSession();
    Map<String, String> clientNotes = session.getClientNotes();

    if ("login".equals(clientNotes.get("prompt"))) 
        logger.info("skip SPNEGO authenticator because of client requests login prompt: " + clientNotes); //$NON-NLS-1$
        context.attempted();
        return;
    
// +++ END CHANGE +++

    HttpRequest request = context.getHttpRequest();
    String authHeader = request.getHttpHeaders().getRequestHeaders().getFirst(HttpHeaders.AUTHORIZATION);
    if (authHeader == null) 
        Response challenge = challengeNegotiation(context, null);
        context.forceChallenge(challenge);
        return;
    

【讨论】:

以上是关于在 keycloak 中跳过 kerberos sso 身份验证的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ddd (gdb) 中跳过过去的循环

Python:有条件地在抓取过程中跳过url

在chartJS中跳过y轴上的小数点

仅在 node_modules 中跳过库检查

Keycloak Kerberos 阻止登录对话框

FOR /F 这是在批处理文件中跳过一行的正确方法