OpenLiberty SAML Web SSO 2.0组映射失效,403权限错误求助
OpenLiberty SAML Web SSO 2.0角色映射失效导致403禁止访问
问题概述
测试OpenLiberty的SAML Web Single Sign-On 2.0功能,身份认证环节正常,但角色/组映射功能失效,访问应用时出现403禁止访问错误。
相关配置
server.xml中的SAML配置
<samlWebSso20 id="defaultSP" nameIDFormat="email" userIdentifier="cn" groupIdentifier="memberOf" mapToUserRegistry="No" authFilterRef="myAuthFilter"/>
server.xml中的应用安全绑定配置
<application location="guide-getting-started.war" type="war" id="guide-getting-started.war" name="ctxrt-saml-test" contextRoot="ctxrt-saml-test"> <application-bnd> <security-role name="XXXX_admin_view"> <group name="XXXX_admin_view" /> </security-role> </application-bnd> </application>
Web应用安全约束配置
<security-constraint> <web-resource-collection> <url-pattern>/*</url-pattern> <http-method>GET</http-method> </web-resource-collection> <auth-constraint> <role-name>XXXX_admin_view</role-name> </auth-constraint> </security-constraint>
IdP返回的SAML响应片段
SAML2.0 Response [...] SAML 2.0 AttributeStatement uid xxxxxxx memberOf CN=XXXX_admin_view,OU=XXXX,OU=Applications,OU=Groups,DC=[xxxx],DC=fr cn xxxxx
服务器日志信息
- 角色映射日志:
Added the following subject to role mapping for application: ctxrt-saml-test. group:[IdP-realmName]/CN=XXXX_admin_view,OU=XXXX,OU=Applications,OU=Groups,DC=[xxxx],DC=fr
- 授权失败日志:
CWWKS9104A: Authorization failed for user [user_cn] while invoking ctxrt-saml-test on /. The user is not granted access to any of the required roles: [XXXX_admin_view].
已尝试的配置(均未生效)
- 将安全角色绑定的组名设为
[IdP-realmName]/CN=XXXX_admin_view,OU=XXXX,OU=Applications,OU=Groups,DC=[xxxx],DC=fr - 将安全角色绑定的组名设为
CN=XXXX_admin_view,OU=XXXX,OU=Applications,OU=Groups,DC=[xxxx],DC=fr - 将安全角色绑定的组名设为
XXXX_admin_view
解决方案
方案1:正则提取组名(推荐)
修改server.xml中的samlWebSso20配置,添加groupFilter属性,用正则从memberOf的完整DN中提取目标组名:
<samlWebSso20 id="defaultSP" nameIDFormat="email" userIdentifier="cn" groupIdentifier="memberOf" mapToUserRegistry="No" authFilterRef="myAuthFilter" groupFilter="CN=(.*?),.*"/>
该正则会匹配CN=后到第一个逗号的内容,正好提取出XXXX_admin_view,让SP端拿到的组名与角色绑定的组名完全一致。
方案2:完整匹配带Realm的组名
直接在application-bnd中使用日志里显示的完整组名(包含Realm前缀),注意替换[IdP-realmName]为日志中实际的Realm名称:
<application location="guide-getting-started.war" type="war" id="guide-getting-started.war" name="ctxrt-saml-test" contextRoot="ctxrt-saml-test"> <application-bnd> <security-role name="XXXX_admin_view"> <group name="[IdP-realmName]/CN=XXXX_admin_view,OU=XXXX,OU=Applications,OU=Groups,DC=[xxxx],DC=fr" /> </security-role> </application-bnd> </application>
方案3:自定义角色映射文件
在应用的WEB-INF目录下创建application-roles.xml,手动映射SAML返回的完整组名到应用角色:
<application-roles xmlns="http://xmlns.jcp.org/xml/ns/javaee" version="7.0"> <security-role> <role-name>XXXX_admin_view</role-name> <group-principal name="[IdP-realmName]/CN=XXXX_admin_view,OU=XXXX,OU=Applications,OU=Groups,DC=[xxxx],DC=fr"/> </security-role> </application-roles>
内容的提问来源于stack exchange,提问作者frederic fadda
相关产品推荐
相关产品推荐

