能否将ADFS 3.0配置为服务提供商接收外部联邦声明?含PHP实操场景
当然可以!ADFS 3.0完全支持被配置为服务提供商(SP),来接收来自Ping Identity这类外部联邦身份系统的传入声明。下面我会一步步拆解整个架构的配置和PHP集成方案,帮你搞定这个流程:
一、把ADFS 3.0配置为服务提供商(SP)
首先要让ADFS能够识别并信任Ping Identity作为身份提供商(IdP):
- 添加Ping Identity为信赖方信任
打开ADFS管理控制台,右键点击「信赖方信任」→「添加信赖方信任」,选择「输入信赖方信任的元数据地址」,填入Ping Identity的IdP元数据URL(一般是https://你的Ping域名/idp/metadata.xml),跟着向导完成配置:设置显示名称、选择访问控制策略(比如允许所有用户访问),最后完成创建。 - 配置声明转换规则
右键刚创建的Ping信赖方信任→「编辑声明规则」,添加适配的声明转换规则。比如你需要把Ping发送的email声明映射为ADFS的Name ID,或者把Ping的用户ID映射到AD域的sAMAccountName。可以用「转换传入声明」规则:选择传入声明类型(比如Ping发送的urn:oid:1.2.840.113549.1.9.1对应邮箱),设置传出声明类型为Name ID,格式选Email Address,这样ADFS就能正确处理Ping的用户身份。
二、配置Ping Identity信任ADFS作为SP
接下来要让Ping Identity把ADFS当作可信的服务提供商:
- 添加ADFS作为SP到Ping
登录Ping Identity管理后台,找到「SP Connections」(或类似入口),新建SP连接,选择「导入元数据」,填入ADFS的元数据URL:https://你的ADFS域名/FederationMetadata/2007-06/FederationMetadata.xml,Ping会自动加载ADFS的端点和证书信息。 - 配置声明发送规则
在Ping的SP连接设置里,添加要发送给ADFS的用户声明,比如邮箱、用户名、角色等。确保声明的类型和ADFS那边的转换规则匹配,比如发送email声明时,类型选urn:oid:1.2.840.113549.1.9.1,这样ADFS能正确识别。 - 启用SSO和SLO
确认Ping的单点登录(SSO)端点指向ADFS的SAML 2.0登录端点(https://你的ADFS域名/adfs/ls/),同时配置单点注销(SLO)端点,实现用户退出时同步注销Ping和ADFS的会话。
三、PHP应用集成到ADFS SP的实现
PHP应用需要通过SAML协议和ADFS交互,这里推荐用SimpleSAMLphp这个成熟的库:
- 部署SimpleSAMLphp
下载SimpleSAMLphp并解压到你的PHP服务器web目录,修改config/config.php:- 设置
baseurlpath为你的SimpleSAMLphp访问路径,比如/simplesaml/ - 开启
enable.saml20-sp和enable.saml20-idp选项
- 设置
- 配置ADFS为PHP应用的IdP
编辑config/authsources.php,添加ADFS的SP配置:'adfs-sp' => array( 'saml:SP', 'idp' => 'https://你的ADFS域名/adfs/services/trust', 'privatekey' => 'saml.pem', 'certificate' => 'saml.crt', 'entityID' => 'https://你的PHP应用域名/simplesaml/module.php/saml/sp/metadata.php/adfs-sp', 'discoURL' => null, ), - 生成SSL证书
在SimpleSAMLphp的cert/目录下执行命令生成证书:openssl req -new -x509 -days 3652 -nodes -out saml.crt -keyout saml.pem - 让ADFS信任PHP应用
回到ADFS管理控制台,添加新的信赖方信任,导入SimpleSAMLphp的元数据:https://你的PHP应用域名/simplesaml/module.php/saml/sp/metadata.php/adfs-sp,然后配置声明规则,把ADFS从Ping收到的声明传递给PHP应用(比如发送Name ID、email等)。 - PHP应用实现登录逻辑
在你的PHP页面中,引入SimpleSAMLphp并实现登录验证:require_once('/path/to/simplesamlphp/lib/_autoload.php'); $auth = new SimpleSAML\Auth\Simple('adfs-sp'); // 检查用户是否已登录,未登录则跳转至ADFS if (!$auth->isAuthenticated()) { $auth->requireAuth(); } // 获取用户的声明数据 $userAttributes = $auth->getAttributes(); // 示例:输出用户邮箱 echo "当前登录用户邮箱:" . $userAttributes['email'][0];
关键注意事项
- 证书信任链:确保ADFS信任Ping的根证书,Ping信任ADFS的根证书,同时SimpleSAMLphp要信任ADFS的根证书(把ADFS的根证书放到SimpleSAMLphp的
cert/目录下)。 - 时间同步:ADFS、Ping、PHP服务器的系统时间必须保持同步,否则SAML断言会因为时间戳不匹配而失效。
- 声明一致性:Ping发送的声明类型、ADFS转换后的声明类型、SimpleSAMLphp接收的声明类型要一一对应,避免出现身份信息丢失的情况。
内容的提问来源于stack exchange,提问作者Surendar K
相关产品推荐
相关产品推荐

