You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在ITfoxtec.Identity.Saml2的SAML2配置中添加.CER证书

解决方案:SAML2注销时"Signature is invalid"错误及.cer证书配置方法

问题定位

注销时出现的"Signature is invalid"错误,确实大概率是因为未配置身份提供商(Azure AD)的签名公钥(.cer文件)。SAML注销响应由Azure AD签名,应用需要用对应公钥验证签名合法性,否则会触发校验失败。

.cer证书配置步骤

方式1:手动加载.cer证书

  1. 在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";
    });
  1. 对应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,直接从元数据自动同步配置和证书:

  1. 在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);
    });
  1. 更新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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 01:00:48