使用Sustainsys.Saml2对接ADFS时出现签名验证错误
问题描述
在ASP.NET Core应用中使用Sustainsys.Saml2实现ADFS单点登录时,流程卡在ADFS登录后重定向回应用的环节,应用抛出错误:
"Sustainsys.Saml2.UnsuccessfulSamlOperationException": The Saml2Response must have status success to extract claims. (Saml2 Status code: responder)
查看ADFS服务器日志,发现根源错误:
Microsoft.IdentityModel.Protocols.XmlSignature.SignatureVerificationFailedException: MSI0037: No signature verification certificate found for issuer "<my-application-url>".
当前Sustainsys配置代码:
options.SPOptions.EntityId = new EntityId("<my-application-url>"); options.SPOptions.PublicOrigin = new Uri("<my-application-url>"); options.AuthenticaionRequestSigningBehavior = SigningBehavior.Always; options.SPOptions.WantAssertionsSigned = true; var certificate = new X509Certificate(certificatePath, secret); IdentityProvider identityProvider = new IdentityProvider( new EntityId("http://<adfs-server>/adfs/services/trust"), options.SPOptions) { MetadataLocation = "<adfs-metadata-url>", AllowUnsolicitedAuthnResponse = true, Binding = Saml2BindingType.HttpRedirect, WantAuthnRequestsSigned = true, OutboundSigningAlogorithm = "http://www.w3.org/2001/04/xmldsig-more#rsa-sha256" }; identityProvider.SigningKeys.AddConfiguredKey(certificate); options.IdentityProviders.Add(identityProvider); ServicesCertificate serviceCertificate = new ServiceCertificate() { Certificate = certificate, Use = CertificateUse.Signing }; options.SPOptions.ServiceCertificates.Add(serviceCertificate);
解决方案
修正配置拼写错误:
AuthenticaionRequestSigningBehavior改为AuthenticationRequestSigningBehavior(缺失字母t)OutboundSigningAlogorithm改为OutboundSigningAlgorithm(缺失字母r)
这两处拼写错误会导致签名规则无法正确生效,直接触发ADFS的签名验证失败。
修正IdentityProvider签名密钥配置:
当前代码错误地将SP自身的证书添加到了IDP的SigningKeys中,IDP的签名密钥应存储ADFS用来签名SamlResponse的公钥:- 若配置了
MetadataLocation,Sustainsys会自动从ADFS元数据中提取其签名密钥,无需手动添加 - 手动添加时,需导入ADFS的公钥证书,而非SP的证书
- 若配置了
同步ADFS信赖方信任配置:
- 将SP的公钥证书导入ADFS的「信赖方信任」→「签名证书」列表,ADFS需要此证书验证SP发送的认证请求签名
- 确保ADFS中配置的「信赖方标识符」与代码里的
SPOptions.EntityId完全一致(包括URL大小写、斜杠等细节) - 检查ADFS中配置的「回复URL」与应用的回调URL(由
PublicOrigin生成)完全匹配
验证证书用途:
确认SP使用的X509证书包含「数字签名」用途,避免因证书权限不足导致签名验证失败
内容的提问来源于stack exchange,提问作者tomer vainer
相关产品推荐
相关产品推荐

