Laravel 8集成Azure SAML SSO报Invalid issuer错误如何解决
Laravel 8 Azure SAML SSO 无效Issuer+404故障排障
核心报错根因
日志里的Invalid issuer in the Assertion/Response是非常典型的配置填反问题:当前SAML扩展校验Azure返回的登录断言时,错把自身Laravel应用的元数据地址当成了Azure AD的合法签发方,才会出现预期值和实际拿到的STS地址不匹配的情况——Azure AD本身的合法断言签发者固定是https://sts.windows.net/<你的Azure租户ID>/格式,和你自己的项目地址本来就不一样。伴随的404问题基本是路由缓存、中间件拦截或者伪静态配置错误导致的。
分步排障操作
1. 修正SAML配置中SP/IdP的Issuer参数
Laravel生态里用的最多的SAML2扩展是aacotroneo/laravel-saml2,本身公开文档很少,参数填反是最高发的坑,按以下步骤核对:
- 打开配置文件,单IdP场景找
config/saml2.php,多IdP拆分配置的场景找config/saml2/aad_idp_settings.php - 严格区分两个Issuer配置,绝对不能填反:
- SP(也就是你自己的Laravel应用)配置块下的
entityId参数:填写自身应用元数据地址https://{your_project_domain}/saml2/aad/metadata,这个值是给Azure AD识别你的应用用的 - IdP(也就是Azure AD)配置块下的
entityId参数:填写日志中拿到的STS地址https://sts.windows.net/xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxx/,这个值是本地用来校验Azure返回断言合法性的,你当前就是把这个值错填成了SP的元数据地址才触发报错
- SP(也就是你自己的Laravel应用)配置块下的
2. 修复访问404问题
- 先执行配置和路由清理命令:
php artisan route:clear php artisan config:clear - 执行
php artisan route:list | grep saml2,确认路由列表中存在saml2/aad/metadata、saml2/aad/acs、saml2/aad/sls三个路由 - 如果路由不存在,检查
config/saml2.php中routes配置块:确认路由前缀为saml2,对应aad这个IdP的路由开关为开启状态;检查路由绑定的中间件,绝对不能把上述三个路由放到auth等需要登录校验的中间件组里,否则未登录状态访问会直接被拦截返回403/404 - 如果用Nginx/Apache部署,确认伪静态规则配置正确,所有请求都转发到
public/index.php,不要让web服务器尝试匹配saml路径下的物理文件
3. 核对Azure门户侧配置一致性
- 进入Azure AD对应企业应用的SAML配置页,找到「Azure AD标识符」字段,把这个值完全复制到本地IdP配置的
entityId项,不要手动修改 - Azure侧配置的「标识符(实体ID)」必须和本地SP配置的
entityId完全一致,末尾多/少斜杠、http/https不匹配都会触发校验失败 - Azure侧「回复URL(断言消费服务URL)」填写
https://{your_project_domain}/saml2/aad/acs,「注销URL」填写https://{your_project_domain}/saml2/aad/sls
4. 生效验证
改完所有配置后先直接访问https://{your_project_domain}/saml2/aad/metadata,确认能正常返回XML格式的元数据内容,再发起SSO登录流程测试即可。
注:配置IdP相关参数时全部从Azure门户的SAML配置页直接复制,不要手动拼接,避免肉眼看不出的字符差异导致校验失败。
内容的提问来源于stack exchange,提问作者user3101803
相关产品推荐
相关产品推荐

