使用Passport-SAML对接ADFS实现SSO时遇MSIS0038签名错误求助
解决ADFS + Passport-SAML的MSIS0038签名错误
这个MSIS0038错误我之前帮不少开发者排查过,核心就是ADFS接收到的SAML请求要么签名验证通不过,要么Issuer(发行方)配置不匹配,咱们一步步来拆解问题:
1. 先确认Issuer的完全匹配性
错误日志里明确标了issuer:'myCompany_com',这是第一个要盯死的点:
- 打开你的Passport-SAML配置,找到
issuer字段,确保它的值就是完全一致的myCompany_com——包括大小写、下划线/点的区别,甚至不能多一个空格。 - 登录客户端的ADFS管理控制台,找到对应的信赖方信任,查看“标识符”列表,必须有一个和上面的Issuer值精确匹配的条目。别小看大小写这点,ADFS对标识符是严格区分的,哪怕是
MyCompany_Com都会不匹配。
2. 排查SAML请求的签名验证问题
ADFS默认会强制验证SAML请求的签名,这里容易踩几个坑:
- 证书不匹配:确保你Passport-SAML配置里用的私钥,对应的公钥已经导入到ADFS的信赖方信任中(在“签名”标签下添加证书)。如果元数据是你提供的,要检查元数据里
<md:KeyDescriptor use="signing">节点的公钥是不是和你的SP公钥一致——ADFS导入元数据时会自动提取这个公钥,要是元数据里的公钥错了,签名肯定验证失败。 - 签名算法不兼容:ADFS默认使用
SHA-256作为签名算法,如果你Passport-SAML里配置的signatureAlgorithm是sha1或者其他值,就会触发错误。把配置改成signatureAlgorithm: 'sha256'再试试。 - 请求未签名但ADFS要求签名:检查Passport-SAML的
authnRequestSigned配置,如果设为false,但ADFS信赖方信任的“高级”标签里勾选了“要求所有传入的SAML请求必须签名”,这就直接冲突了。生产环境建议开启SP的请求签名(authnRequestSigned: true),测试环境可以临时关闭ADFS的签名要求来验证。
3. 核对元数据文件的正确性
你提供给客户端的myCompany.xml元数据是ADFS配置的核心依据,要重点检查:
<md:EntityDescriptor>标签的entityID属性必须和Issuer值完全一致;<md:AssertionConsumerService>的Location属性必须和你Passport-SAML里的callbackUrl完全匹配,包括http/https、域名、路径;- 签名用的公钥节点没有格式错误,比如有没有多余的换行或者缺失的
-----BEGIN PUBLIC KEY-----/-----END PUBLIC KEY-----标记。
4. 辅助测试建议
可以用浏览器的SAML Tracer插件抓包,查看发送给ADFS的SAML请求内容:
- 确认
<saml:Issuer>节点的值确实是myCompany_com; - 检查请求里是否包含
<ds:Signature>节点,确认签名已正确生成。
内容的提问来源于stack exchange,提问作者jerem
相关产品推荐
相关产品推荐

