我有一个web应用程序,它使用keydove/openid connect对windows广告的用户进行身份验证。
用户将不会在windows ad域中的工作站上使用浏览器。
web应用服务器(带有key斗篷适配器的tomcat)正在windows ad域中运行。
该web应用程序配置为keydepot/openid connect。key斗篷领域配置为使用windows ad kerberos/ldap。
用户浏览器将转发到keydrope登录,并在成功登录后转发回web应用。
web应用程序需要使用kerberos票证/gss凭据连接到ibm i。ibm i是使用windows ad为sso/eim配置的。它可以工作。
我为gss凭证转发配置了keydepot客户端。
我尝试使用key斗篷客户机从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);
“OtherClaimes”Map为空。所以反序列化会抛出一个空指针异常和消息
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)
我错过了什么?
2条答案
按热度按时间v440hwme1#
由于“用户将不会在windows ad域中的工作站上使用浏览器”,Key斗篷将永远不会从浏览器接收gss凭据,因此无法将其转发到java web应用程序。
据我在keydrope documentation kerberos一节中所发现的,keydrope不支持kerberos约束的委托(还没有),因此不能模拟用户,即根据其登录名代表最终用户生成tgt。
从我的观点来看,java web应用程序必须调用kerberos约束的委派s4u2self进行模拟,然后使用s4u2proxy为预期的spn请求tgs以与ibm i服务进行身份验证。
您可以通过以下示例来实现这一目标:
https://github.com/ymartin59/java-kerberos-sfudemo
https://github.com/tellisnz/collared-kerberos
d4so4syb2#
为了使浏览器能够协商(spnego),它需要在ad域上(还需要在ad级别设置委派,使用msds allowedtodelegateto字段),以便kc在后端服务上模拟用户。我希望您得到401(未经授权),您的浏览器无法响应,因为它将无法获得kerberos票证。理论上,您可以对web服务器进行基本身份验证,在您的web应用程序上获取kerberos票证并将其转发到后端。。。