如何使用 keycloak-saml 适配器将第三方 IdP SAML 属性映射到我的本地应用程序角色
How to map third party IdP SAML attributes to my local application roles using keycloak-saml adapter
我的设置是:
- EAP 6.4.18
- keycloak-saml 适配器
- 第三方 IdP 服务器(不是 keycloak 服务器)
我正在尝试保护 EAR 中的一个 Web 应用程序。目前我的 standalone.xml 看起来像这样:
<subsystem xmlns="urn:jboss:domain:keycloak-saml:1.3">
<secure-deployment name="myapp.war">
<SP entityID="https://mydomain/myapp/" sslPolicy="EXTERNAL" nameIDPolicyFormat="urn:oasis:names:tc:SAML:2.0:nameid-format:persistent" logoutPage="/logout.jsp" forceAuthentication="false" isPassive="false" turnOffChangeSessionIdOnLogin="false">
<Keys>
<Key signing="true" encryption="false">
<KeyStore password="pass" file="/path-to/keyStore.jks">
<PrivateKey alias="sp" password="pass"/>
<Certificate alias="sp"/>
</KeyStore>
</Key>
</Keys>
<IDP entityID="...entityID...">
<SingleSignOnService signRequest="true" validateResponseSignature="true" requestBinding="POST" bindingUrl="...sso dinding..." assertionConsumerServiceUrl="https://mydomain/myapp/saml"/>
<SingleLogoutService validateRequestSignature="true" validateResponseSignature="true" signRequest="true" signResponse="true" requestBinding="POST" responseBinding="POST" postBindingUrl="...slo binding..." redirectBindingUrl="...redirect..."/>
<Keys>
<Key signing="true" encryption="false">
<KeyStore password="pass" file="/path-to/keyStore.jks">
<Certificate alias="idp"/>
</KeyStore>
</Key>
</Keys>
</IDP>
</SP>
</secure-deployment>
</subsystem>
这部分工作得很好。我被重定向到 IdP,我可以登录了。问题是我的应用程序角色和 IdP 返回的角色不匹配。
如何配置这两者之间的角色映射,以便用户在会话中具有正确的角色?
Ty.
注:
我已经用 picketlink 子系统做了类似的事情。下面我使用了一个属性文件来做这样的映射。我认为 keycloak 适配器可以做类似的事情,但是 "keycloak-saml:1.1" 模式似乎没有办法 select 安全域。
<security-domain name="my-realm">
<authentication>
<login-module code="org.picketlink.identity.federation.bindings.jboss.auth.SAML2LoginModule" flag="optional">
<module-option name="password-stacking" value="useFirstPass"/>
</login-module>
<login-module code="org.jboss.security.auth.spi.RoleMappingLoginModule" flag="optional">
<module-option name="password-stacking" value="useFirstPass"/>
<module-option name="rolesProperties" value="${jboss.server.config.dir}/rolesMapping-roles.properties"/>
<module-option name="replaceRole" value="true"/>
</login-module>
</authentication>
有了 picketlink 子系统,我可以 select 我的安全域和角色映射将会发生。
<service-provider name="myapp.war" security-domain="my-realm"...
这是我缺少的配置:
<RoleMappingsProvider id="properties-based-role-mapper">
<Property name="properties.file.location" value="/opt/mappers/roles.properties"/>
</RoleMappingsProvider>
"properties-based-role-mapper" 的实现 class 是:org.keycloak.adapters.saml.PropertiesBasedRoleMapper
这里有更多信息:https://www.keycloak.org/docs/latest/securing_apps/#_saml-general-config
问题是我正在查看不提供该选项的架构版本 1.1。 1.3 版可以,完美运行。
我希望这 question/answer 可以帮助那里的人。
干杯。
我的设置是:
- EAP 6.4.18
- keycloak-saml 适配器
- 第三方 IdP 服务器(不是 keycloak 服务器)
我正在尝试保护 EAR 中的一个 Web 应用程序。目前我的 standalone.xml 看起来像这样:
<subsystem xmlns="urn:jboss:domain:keycloak-saml:1.3">
<secure-deployment name="myapp.war">
<SP entityID="https://mydomain/myapp/" sslPolicy="EXTERNAL" nameIDPolicyFormat="urn:oasis:names:tc:SAML:2.0:nameid-format:persistent" logoutPage="/logout.jsp" forceAuthentication="false" isPassive="false" turnOffChangeSessionIdOnLogin="false">
<Keys>
<Key signing="true" encryption="false">
<KeyStore password="pass" file="/path-to/keyStore.jks">
<PrivateKey alias="sp" password="pass"/>
<Certificate alias="sp"/>
</KeyStore>
</Key>
</Keys>
<IDP entityID="...entityID...">
<SingleSignOnService signRequest="true" validateResponseSignature="true" requestBinding="POST" bindingUrl="...sso dinding..." assertionConsumerServiceUrl="https://mydomain/myapp/saml"/>
<SingleLogoutService validateRequestSignature="true" validateResponseSignature="true" signRequest="true" signResponse="true" requestBinding="POST" responseBinding="POST" postBindingUrl="...slo binding..." redirectBindingUrl="...redirect..."/>
<Keys>
<Key signing="true" encryption="false">
<KeyStore password="pass" file="/path-to/keyStore.jks">
<Certificate alias="idp"/>
</KeyStore>
</Key>
</Keys>
</IDP>
</SP>
</secure-deployment>
</subsystem>
这部分工作得很好。我被重定向到 IdP,我可以登录了。问题是我的应用程序角色和 IdP 返回的角色不匹配。
如何配置这两者之间的角色映射,以便用户在会话中具有正确的角色?
Ty.
注:
我已经用 picketlink 子系统做了类似的事情。下面我使用了一个属性文件来做这样的映射。我认为 keycloak 适配器可以做类似的事情,但是 "keycloak-saml:1.1" 模式似乎没有办法 select 安全域。
<security-domain name="my-realm">
<authentication>
<login-module code="org.picketlink.identity.federation.bindings.jboss.auth.SAML2LoginModule" flag="optional">
<module-option name="password-stacking" value="useFirstPass"/>
</login-module>
<login-module code="org.jboss.security.auth.spi.RoleMappingLoginModule" flag="optional">
<module-option name="password-stacking" value="useFirstPass"/>
<module-option name="rolesProperties" value="${jboss.server.config.dir}/rolesMapping-roles.properties"/>
<module-option name="replaceRole" value="true"/>
</login-module>
</authentication>
有了 picketlink 子系统,我可以 select 我的安全域和角色映射将会发生。
<service-provider name="myapp.war" security-domain="my-realm"...
这是我缺少的配置:
<RoleMappingsProvider id="properties-based-role-mapper">
<Property name="properties.file.location" value="/opt/mappers/roles.properties"/>
</RoleMappingsProvider>
"properties-based-role-mapper" 的实现 class 是:org.keycloak.adapters.saml.PropertiesBasedRoleMapper
这里有更多信息:https://www.keycloak.org/docs/latest/securing_apps/#_saml-general-config
问题是我正在查看不提供该选项的架构版本 1.1。 1.3 版可以,完美运行。
我希望这 question/answer 可以帮助那里的人。
干杯。