我有一个使用Keycloak / OpenID Connect验证Windows AD用户身份的Web应用。
用户将不会在Windows AD域中的工作站上使用浏览器。
Web App服务器(带有Keycloak适配器的Tomcat)正在Windows AD域中运行。
已为Keycloak / OpenID Connect配置了Web App。 将Keycloak领域配置为使用Windows AD Kerberos / LDAP。
用户浏览器将转发到keycloak登录,成功登录后,将转发回Web应用。
Web应用程序需要使用Kerberos票证/ GSS凭证连接到IBM i 使用Windows AD为SSO / EIM配置了IBM i。可以。
我为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)
我想念什么?
答案 0 :(得分:0)
要使浏览器能够进行协商(SPNEGO),它必须位于AD域上(也需要使用msDS-AllowedToDelegateTo字段在AD级别上设置委托),以便KC可以模拟用户在后端服务上。 我希望您得到一个401(未授权)的浏览器无法响应,因为它将无法获得kerberos票。 从理论上讲,您可以对Web服务器进行基本身份验证,在Web应用程序上获得kerberos票证,然后将其转发到后端...
答案 1 :(得分:0)
由于“用户将不会在Windows AD域中的工作站上使用浏览器”,Keycloak将永远不会从浏览器接收GSS凭据,因此无法将其转发到Java Web App。
据我在Keycloak documentation Kerberos section中发现,Keycloak不支持Kerberos约束委派(尚未),因此无法模拟用户-即根据最终用户的登录名代表最终用户生成TGT。
从我的角度来看,您的Java Web App必须调用Kerberos约束委派S4U2Self进行模拟,然后使用S4U2Proxy为预期的SPN请求TGS,以使IBM i服务生效。
您可以报告以下示例以实现目标: