在 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;
}
在某些情况下,我们需要跳过通过 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;
}