ADFS单点登录SAML错误排查:MSIS0038签名不符问题
解决ADFS + Passport-SAML的MSIS0038签名错误问题
这个MSIS0038: SAML Message has wrong signature错误是ADFS在验证SAML消息(请求或响应)签名时失败导致的——虽然你提到实际认证已经完成,但签名验证不通过会让ADFS拒绝重定向回你的网站,所以用户才会卡在登录页。下面是我踩过坑后总结的常见原因和解决办法:
1. 证书不匹配或格式错误
这是最大概率的问题,要么是你Passport-SAML配置的证书和ADFS的令牌签名证书不一致,要么是证书格式不对:
- 获取正确的ADFS签名证书:打开ADFS管理控制台,进入「服务」→「证书」,找到「令牌签名」证书,导出为Base64编码的CER格式(别选DER格式)。
- 转成PEM格式:导出的CER文件需要加上标准PEM头部和尾部,也就是在证书内容前后分别加上
-----BEGIN CERTIFICATE-----和-----END CERTIFICATE-----,每行保持64字符左右(可以用openssl命令或在线工具转换)。 - 核对Passport-SAML配置:确保
cert字段填的是这个正确的PEM格式证书,别搞混令牌签名和令牌加密证书(ADFS有两种不同的证书,签名证书才是用来验证消息的)。
示例配置片段:
const samlStrategy = new SamlStrategy({ entryPoint: 'https://your-adfs-domain/adfs/ls/', issuer: 'www.myClient.myCompany.com', callbackUrl: 'https://www.myClient.myCompany.com/login/callback', // 正确的PEM格式签名证书 cert: '-----BEGIN CERTIFICATE-----\nMIIDBTCCAe2gAwIBAgI...省略证书内容...\n-----END CERTIFICATE-----', // 其他必要配置 }, (profile, done) => { // 用户逻辑处理 return done(null, profile); });
2. 签名算法不匹配
ADFS默认可能用SHA256,但如果你的Passport-SAML配置的算法和ADFS不一致,也会触发这个错误:
- 查看ADFS的签名算法:在ADFS管理控制台的信赖方信任属性里,进入「高级」选项卡,确认签名算法是SHA1还是SHA256(现在推荐用SHA256)。
- 同步Passport-SAML配置:在策略配置里添加
signatureAlgorithm字段,值和ADFS保持一致,比如signatureAlgorithm: 'sha256'。
3. ADFS信赖方信任配置错误
除了你的应用配置,ADFS这边的信赖方信任也可能出问题:
- 检查ACS URL:确保ADFS里信赖方信任的「终结点」中,断言消费者服务(ACS)的URL和你Passport-SAML的
callbackUrl完全一致,绑定方式必须是POST。 - 验证签名设置:在信赖方信任的「签名」选项卡,确认「验证传入的SAML消息签名」或「要求签名的SAML断言」的设置和你的应用逻辑匹配(如果你的应用发送的SAML请求是签名的,ADFS需要开启验证;如果是ADFS发送响应签名,你的应用要配置验证)。
4. 进阶排查技巧
如果还是找不到问题,可以用这些方法定位:
- 用SAML Tracer抓包:在浏览器安装SAML Tracer插件,捕获SSO流程中的SAML请求和响应,查看签名证书的指纹、使用的算法,和ADFS的证书信息做对比。
- 查看ADFS事件日志:在Windows服务器的事件查看器里,打开「应用程序和服务日志」→「ADFS」→「Admin」,里面会有更详细的错误细节,比如明确指出是请求还是响应签名错误,或者证书指纹不匹配。
解决完签名错误后,ADFS就能正确重定向回你的网站,用户也不会卡在登录页了。
内容的提问来源于stack exchange,提问作者jerem
相关产品推荐
相关产品推荐

