浏览器不在 AD 域中时的 Keycloak GSS 凭据委派
Keycloak GSS Credential delegation when browser not in AD Domain
我有一个 Web 应用程序使用 Keycloak/OpenID 连接来验证用户到 Windows AD。
用户将不会在 Windows AD 域中的工作站上使用浏览器。
Web 应用程序服务器(Tomcat 带有 Keycloak 适配器)在 Windows AD 域中 运行。
Web 应用程序配置为 Keycloak/OpenID 连接。
Keycloak 领域配置为使用 Windows AD Kerberos/LDAP.
用户浏览器转发到 keycloak 登录并在成功登录后转发回网络应用程序。
Web 应用程序需要使用 Kerberos ticket/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)
我错过了什么?
为了使浏览器能够协商 (SPNEGO),它需要在 AD 域中(还需要在 AD 级别设置委派,使用 msDS-AllowedToDelegateTo 字段)以便 KC 模拟后端服务上的用户。
我希望您得到一个 401(未经授权),您的浏览器无法响应,因为它无法获得 kerberos 票证。
理论上您可以对 Web 服务器进行基本身份验证,在您的 Web 应用程序上获取 Kerberos 票证并将其转发到后端...
作为 "Users will not be using a browser on a workstation in the Windows AD domain",Keycloak 永远不会从浏览器接收 GSS 凭据,因此无法将它们转发到您的 Java Web 应用程序。
据我在 Keycloak documentation Kerberos section 中发现,Keycloak 不支持 Kerberos 约束委派(目前),因此无法模拟用户 - 即根据其登录名代表 end-user 生成 TGT .
从我的角度来看,您的 Java Web 应用程序必须调用 Kerberos Constrained Delegation S4U2Self 进行模拟,然后使用 S4U2Proxy 为预期的 SPN 请求 TGS 以使用 IBM i 服务进行验证。
您可以报告以下示例以实现该目标:
我有一个 Web 应用程序使用 Keycloak/OpenID 连接来验证用户到 Windows AD。
用户将不会在 Windows AD 域中的工作站上使用浏览器。
Web 应用程序服务器(Tomcat 带有 Keycloak 适配器)在 Windows AD 域中 运行。
Web 应用程序配置为 Keycloak/OpenID 连接。 Keycloak 领域配置为使用 Windows AD Kerberos/LDAP.
用户浏览器转发到 keycloak 登录并在成功登录后转发回网络应用程序。
Web 应用程序需要使用 Kerberos ticket/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)
我错过了什么?
为了使浏览器能够协商 (SPNEGO),它需要在 AD 域中(还需要在 AD 级别设置委派,使用 msDS-AllowedToDelegateTo 字段)以便 KC 模拟后端服务上的用户。 我希望您得到一个 401(未经授权),您的浏览器无法响应,因为它无法获得 kerberos 票证。 理论上您可以对 Web 服务器进行基本身份验证,在您的 Web 应用程序上获取 Kerberos 票证并将其转发到后端...
作为 "Users will not be using a browser on a workstation in the Windows AD domain",Keycloak 永远不会从浏览器接收 GSS 凭据,因此无法将它们转发到您的 Java Web 应用程序。
据我在 Keycloak documentation Kerberos section 中发现,Keycloak 不支持 Kerberos 约束委派(目前),因此无法模拟用户 - 即根据其登录名代表 end-user 生成 TGT .
从我的角度来看,您的 Java Web 应用程序必须调用 Kerberos Constrained Delegation S4U2Self 进行模拟,然后使用 S4U2Proxy 为预期的 SPN 请求 TGS 以使用 IBM i 服务进行验证。
您可以报告以下示例以实现该目标: