如何为Azure CentOS上的PHP应用配置SAML Azure AD SSO
Azure SAML 基础配置错误修正
1. Azure 侧基础 SAML 配置正确值
你之前的配置错误核心原因是把业务页面地址直接填到了 SAML 协议端点字段,使用 SimpleSAMLphp 作为 SAML 服务端组件时,所有协议相关地址必须指向 SimpleSAMLphp 的对应处理端点:
- Identifier (Entity ID):SAML 服务提供者的唯一标识,填
https://<你的IP>/simplesamlphp/module.php/saml/sp/metadata.php/default-sp,必须和 SimpleSAMLphp 侧配置的 SP 实体 ID 完全一致 - Reply URL (Assertion Consumer Service URL):Azure 回传 SAML 断言的接收地址,填
https://<你的IP>/simplesamlphp/module.php/saml/sp/saml2-acs.php/default-sp,不可直接填业务页面地址 - Sign on URL:用户从 Azure 应用入口访问时的跳转地址,可保留你之前填写的
http://<你的IP>/sample_web_app/login.php,如果全站强制 HTTPS 请替换为 HTTPS 地址 - Logout Url:SAML 登出请求的处理端点,填
https://<你的IP>/simplesamlphp/module.php/saml/sp/saml2-logout.php/default-sp,不可直接填应用自身的登出页地址
PHP 应用侧配套配置
1. SimpleSAMLphp 基础配置
- 打开
/var/www/html/simplesamlphp/config/authsources.php,在default-sp配置段填写 Azure AD 的 IdP 元数据信息,配置自签名 SSL 证书路径,确保实体 ID 和 Azure 侧填写一致 - 打开
/var/www/html/simplesamlphp/metadata/saml20-idp-remote.php,粘贴 Azure 企业应用提供的 SAML 元数据内容,或配置元数据自动加载规则 - 修改
/var/www/html/simplesamlphp/config/config.php中的baseurlpath为'https://<你的IP>/simplesamlphp/',和实际访问地址保持一致 - 确保服务器已安装 PHP 依赖扩展:
openssl、xml、mbstring,同时给 SimpleSAMLphp 目录配置正确的 Web 服务访问权限
2. 按邮箱域名分流 B2B/B2C SSO 实现
在你的 login.php 中添加邮箱后缀判断逻辑,提前在 authsources.php 中配置分别对应 B2B、B2C 两个 Azure 应用的 SP 实例,示例逻辑:
<?php if (isset($_POST['email'])) { $email_suffix = explode('@', trim($_POST['email']))[1]; require_once('/var/www/html/simplesamlphp/lib/_autoload.php'); // 企业域名走B2B SSO if ($email_suffix == 'your-company.com') { $auth = new SimpleSAML_Auth_Simple('b2b-sp'); // 其他域名走B2C SSO } else { $auth = new SimpleSAML_Auth_Simple('b2c-sp'); } // 发起SAML认证,认证成功后跳转到应用主页 $auth->login(['ReturnTo' => 'https://<你的IP>/sample_web_app/home.php']); exit(); } ?>
3. 应用登录态关联逻辑
SimpleSAMLphp 认证通过后,会自动跳转回你指定的 ReturnTo 地址,你可以在公共逻辑中添加 SAML 登录态校验,示例:
<?php session_start(); // 本地不存在应用会话时校验SAML会话 if (!isset($_SESSION['user_id'])) { require_once('/var/www/html/simplesamlphp/lib/_autoload.php'); $auth = new SimpleSAML_Auth_Simple('default-sp'); if (!$auth->isAuthenticated()) { header('Location: http://<你的IP>/sample_web_app/login.php'); exit(); } // 读取Azure返回的用户属性,生成应用本地会话 $user_attrs = $auth->getAttributes(); $_SESSION['user_id'] = $user_attrs['http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress'][0]; } ?>
4. 登出逻辑配置
修改你的 logout.php 先销毁 SAML 会话再销毁应用本地会话:
<?php session_start(); session_destroy(); require_once('/var/www/html/simplesamlphp/lib/_autoload.php'); $auth = new SimpleSAML_Auth_Simple('default-sp'); // SAML登出完成后跳回登录页 $auth->logout('http://<你的IP>/sample_web_app/login.php'); exit(); ?>
之前配置失效的核心原因
- Reply URL、Logout URL 错填为业务页面,Azure 返回的 SAML 断言没有被 SimpleSAMLphp 接收处理,无跳转触发逻辑
- Entity ID 和 SimpleSAMLphp 侧配置不匹配,SAML 请求被 Azure 直接拒绝
- 应用根目录没有添加 SAML 会话校验逻辑,用户访问时不会主动发起 SAML 认证请求
其他注意事项
- 所有 SAML 相关端点建议统一使用 HTTPS 协议,和你配置的自签名 SSL 保持一致,避免协议不匹配导致请求失败
- 生产环境建议替换自签名证书为可信 CA 颁发的证书,避免浏览器拦截或 Azure 侧校验失败
内容的提问来源于stack exchange,提问作者Pand005
相关产品推荐
相关产品推荐

