1

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

我错过了什么?

4

2 回答 2

1

由于“用户不会在 Windows AD 域中的工作站上使用浏览器”,Keycloak 将永远不会从浏览器接收 GSS 凭据,因此无法将它们转发到您的 Java Web 应用程序。

据我在Keycloak 文档 Kerberos 部分中发现,Keycloak 不支持 Kerberos 约束委派(尚),因此无法模拟用户 - 即根据其登录名代表最终用户生成 TGT。

从我的角度来看,您的 Java Web 应用程序必须调用 Kerberos 约束委派 S4U2Self 进行模拟,然后使用 S4U2Proxy 为预期的 SPN 请求 TGS 以使用 IBM i 服务进行身份验证。

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

于 2019-07-18T06:01:36.420 回答
0

为了让浏览器能够协商 (SPNEGO),它需要位于 AD 域上(也需要在 AD 级别设置委托,使用 msDS-AllowedToDelegateTo 字段),以便 KC 在后端模拟用户服务。我希望您得到一个 401(未经授权),您的浏览器无法响应,因为它无法获得 kerberos 票证。理论上,您可以对 Web 服务器进行基本身份验证,在您的 Web 应用程序上获取 kerberos 票证并将其转发到后端......

于 2019-02-08T00:01:06.220 回答