在 keycloak 中跳过 kerberos sso 身份验证

Skip kerberos sso authentication in keycloak

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

prompt - Keycloak supports these settings:

  • login - SSO will be ignored and the Keycloak login page will be always shown, even if the user is already authenticated

这在大多数情况下都有效(我们也使用 NTLM waffle 实现)但使用 Kerberos 时,用户始终会自动登录。

任何提示或想法为什么?
是否有其他方法可以强制转发到登录页面?

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

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

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

如果您只需要针对特定​​客户端执行此操作,则可能需要为该客户端创建一个没有 Kerberos 身份验证器的附加身份验证流程。使用 Authentication flow overrides 为客户端配置新流程。

我刚刚创建了一个功能请求,其中包含代码方面的可能解决方案。
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;
    }