在 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 身份验证的主要内容,如果未能解决你的问题,请参考以下文章