浏览器不在AD域中时的Keycloak GSS凭据委派

时间:2018-12-06 17:50:05

标签: java active-directory openid-connect keycloak kerberos-delegation

我有一个使用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)

我想念什么?

2 个答案:

答案 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服务生效。

您可以报告以下示例以实现目标: