Symfony5.4 OneloginSamlBundle对接AD FS SSO无法获取SAML属性问题
解答
完全可以通过配置AD FS,使其在SAML响应中返回标准<saml:Attribute>节点的属性内容,同时建议对应用侧做兼容优化,降低后续对接其他IdP的适配成本。
AD FS侧配置操作步骤
- 登录AD FS服务器,打开AD FS管理控制台
- 在「信赖方信任」列表中找到当前Symfony应用对应的信赖方条目,右键选择「编辑声明颁发策略」
- 点击「添加规则」,规则模板选择「以声明方式发送LDAP属性」后进入下一步
- 自定义规则名称(例如「下发uid属性给业务系统」),属性存储选择
Active Directory - 在LDAP属性与传出声明类型的映射表中做匹配:
- 左侧LDAP属性列选择对应用户标识的AD字段:如果取域登录名就选
sAMAccountName,取用户主体名就选userPrincipalName,和你们业务侧uid对应的实际字段保持一致即可 - 右侧传出声明类型列填写
uid,和OneloginSamlBundle中配置的用户名映射字段名完全一致
- 左侧LDAP属性列选择对应用户标识的AD字段:如果取域登录名就选
- 保存规则后,选中刚创建的规则,右键选择「编辑规则」-「查看规则语言」,确认规则内容为如下格式(如果自动生成的内容带额外的声明命名空间,手动替换为如下内容即可),确保输出的是标准SAML Attribute节点:
c:[Type == "http://schemas.microsoft.com/ws/2008/06/identity/claims/windowsaccountname", Issuer == "AD AUTHORITY"] => issue(store = "Active Directory", types = ("uid"), query = ";sAMAccountName;{0}", param = c.Value);
- 配置完成后重启AD FS服务,重新发起SSO请求即可在SAML响应中看到
saml:AttributeStatement节点及对应的uid属性。
配置注意事项:如果完成上述操作后AD FS仍不返回属性,检查OneloginSamlBundle侧的SP配置,将
sp_name_id_format参数值调整为和AD FS侧信赖方配置的NameID格式一致(常用值为urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified),避免AD FS判定请求仅需NameID、跳过属性下发逻辑。
应用侧兼容优化方案
不需要强制要求所有对接IdP都返回Attribute节点属性,可对现有OneloginSamlBundle的用户解析逻辑做兼容:当通过默认的Attribute查询逻辑取不到uid时,直接从SAML断言的Subject节点读取NameID值作为用户名,当前对接的AD FS场景下NameID已经返回了正确的john_doe值,加完兼容逻辑不需要调整AD FS也能完成登录。
具体实现可以通过重写SAML用户提供器、或者注册SAML认证成功事件的监听来完成,核心逻辑参考:
// 先从属性取uid $uid = $samlAttributes['uid'][0] ?? null; // 取不到就直接读NameID if ($uid === null) { $uid = $samlResponse->getNameId(); }
内容的提问来源于stack exchange,提问作者Charly AGHETTI
相关产品推荐
相关产品推荐

