You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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中配置的用户名映射字段名完全一致
  • 保存规则后,选中刚创建的规则,右键选择「编辑规则」-「查看规则语言」,确认规则内容为如下格式(如果自动生成的内容带额外的声明命名空间,手动替换为如下内容即可),确保输出的是标准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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 09:24:16