如何在ITfoxtec.Identity.Saml2的SAML2配置中添加.CER证书
解决方案:SAML2注销时"Signature is invalid"错误及.cer证书配置方法
问题定位
注销时出现的"Signature is invalid"错误,确实大概率是因为未配置身份提供商(Azure AD)的签名公钥(.cer文件)。SAML注销响应由Azure AD签名,应用需要用对应公钥验证签名合法性,否则会触发校验失败。
.cer证书配置步骤
方式1:手动加载.cer证书
- 在
Program.cs中添加证书加载逻辑,将Azure AD的.cer证书注入到SAML配置:
// 加载Azure AD提供的.cer签名证书 var idpSigningCert = new X509Certificate2("wwwroot/certs/azuread-signing.cer"); services.Configure<Saml2Configuration>(builder.Configuration.GetSection("Saml2")) .PostConfigure<Saml2Configuration>(config => { // 将IDP签名证书添加到身份提供商配置的签名证书列表 config.IdentityProvider.SigningCertificates.Add(idpSigningCert); // 同时添加到全局签名验证证书列表,确保注销响应签名被校验 config.SignatureValidationCertificates.Add(idpSigningCert); // 显式指定签名算法(需与Azure AD配置一致,默认SHA256) config.SignatureAlgorithm = "http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"; });
- 对应
appsettings.json中的SAML配置示例:
"Saml2": { "IdentityProvider": { "EntityId": "https://sts.windows.net/your-tenant-id/", "SingleSignOnServiceUrl": "https://login.microsoftonline.com/your-tenant-id/saml2", "SingleLogoutServiceUrl": "https://login.microsoftonline.com/your-tenant-id/saml2" }, "ServiceProvider": { "EntityId": "https://your-sp-domain.com/Saml2", "SigningCertificate": { "FilePath": "wwwroot/certs/your-sp-cert.pfx", "Password": "your-pfx-password" }, "SingleSignOnServiceUrl": "https://your-sp-domain.com/Saml2/Acs", "SingleLogoutServiceUrl": "https://your-sp-domain.com/Saml2/Sls" } }
方式2:从元数据自动加载证书(更推荐)
如果已经有Azure AD的元数据文件/地址,无需手动加载.cer,直接从元数据自动同步配置和证书:
- 在
Program.cs中添加元数据加载逻辑:
services.Configure<Saml2Configuration>(builder.Configuration.GetSection("Saml2")) .PostConfigure<Saml2Configuration>(async config => { var samlMetadata = new Saml2Metadata(); // 从Azure AD元数据地址加载(或本地文件路径) await samlMetadata.LoadAsync(config.IdentityProvider.MetadataLocation); // 将元数据中的配置(包括签名证书)同步到SAML配置 samlMetadata.ToSaml2Configuration(config); });
- 更新
appsettings.json,添加元数据地址:
"Saml2": { "IdentityProvider": { "EntityId": "https://sts.windows.net/your-tenant-id/", "MetadataLocation": "https://login.microsoftonline.com/your-tenant-id/federationmetadata/2007-06/federationmetadata.xml?appid=your-app-id" }, "ServiceProvider": { // 保持原有SP配置不变 } }
注销流程代码校验
确保单点注销服务(Sls)的Action中正确执行签名验证:
[HttpPost("Sls")] public async Task<IActionResult> SingleLogout() { var logoutResponse = new Saml2LogoutResponse(HttpContext.RequestServices.GetRequiredService<IOptions<Saml2Configuration>>().Value); try { logoutResponse.Read(Request.ToGenericHttpRequest()); // 自动验证签名(配置证书后会自动触发) await logoutResponse.ValidateSignatureAsync(); if (logoutResponse.Status != Saml2StatusCodes.Success) { throw new InvalidOperationException($"注销响应状态异常: {logoutResponse.Status}"); } // 清除本地登录状态 await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme); return RedirectToAction("Index", "Home"); } catch (Exception ex) { return BadRequest($"注销失败: {ex.Message}"); } }
额外检查项
- 确认.cer文件是Azure AD的签名证书,而非加密证书;
- 签名算法需与Azure AD应用配置中的签名算法一致(默认为SHA256);
- 若SP发起注销请求,需确保SP的.pfx证书配置正确(Azure AD会验证SP的注销请求签名)。
内容的提问来源于stack exchange,提问作者KHL
相关产品推荐
相关产品推荐

