我有一个使用 Keycloak/OpenID Connect 向 Windows AD 验证用户身份的 Web 应用程序。
用户不会在 Windows AD 域中的工作站上使用浏览器。
Web App 服务器(带有 Keycloak 适配器的 Tomcat)正在 Windows AD 域中运行。
为 Keycloak/OpenID Connect 配置了 Web 应用程序。Keycloak 领域配置为使用 Windows AD Kerberos/LDAP。
用户浏览器转发到 keycloak 登录并在成功登录后转发回 Web 应用程序。
Web 应用程序需要使用 Kerberos 票证/GSS 凭证连接到 IBM i IBM i 使用 Windows AD 配置为 SSO/EIM。有用。
我为 GSS 凭据转发配置了 Keycloak 客户端。
我尝试使用 Keycloak 客户端从 Servlet 请求中获取 GSS 凭据
// Obtain accessToken in your application.
KeycloakPrincipal<KeycloakSecurityContext> kcp = (KeycloakPrincipal<KeycloakSecurityContext>)request.getUserPrincipal();
AccessToken at = kcp.getKeycloakSecurityContext().getToken();
String username = at.getPreferredUsername();
wtr.append("Windows User: ").append(username).append(newLine);
// Retrieve kerberos credential from accessToken and deserialize it
Map<String, Object> otherClaims = at.getOtherClaims();
Object otherClaim = otherClaims.get(KerberosConstants.GSS_DELEGATION_CREDENTIAL);
String serializedGSSCred = (String) otherClaim;
GSSCredential gssCredential = KerberosSerializationUtils.deserializeCredential(serializedGSSCred);
“otherClaims”映射为空。所以反序列化会抛出一个带有消息的空指针异常
org.keycloak.common.util.KerberosSerializationUtils$KerberosSerializationException: Null credential given as input. Did you enable kerberos credential delegation for your web browser and mapping of gss credential to access token?, Java version: 1.8.0_152, runtime version: 1.8.0_152-b16, vendor: Oracle Corporation, os: 6.2
at org.keycloak.common.util.KerberosSerializationUtils.deserializeCredential(KerberosSerializationUtils.java:70)
我错过了什么?