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

IdentityServer3签名验证失败:添加ADFS外部身份提供商遇问题

解决IdentityServer3集成WsFederation(ADFS)时的签名验证失败问题

你碰到的Microsoft.IdentityModel.Tokens.SecurityTokenInvalidSignatureException: IDX10503: 签名验证失败错误,是IdentityServer3对接ADFS作为外部身份提供商时的典型问题,大概率是令牌签名的验证环节出了问题,我整理了几个靠谱的排查和修复方向:

1. 先确认ADFS元数据是否正常加载

WsFederation中间件默认会从ADFS的元数据地址自动拉取签名证书,用来验证令牌。首先检查你的配置里有没有正确设置MetadataAddress:

var adfs = new WsFederationAuthenticationOptions
{
    AuthenticationType = "adfs",
    Caption = "TEST ADFS",
    SignInAsAuthenticationType = signInAsType,
    MetadataAddress = "https://your-adfs-server/FederationMetadata/2007-06/FederationMetadata.xml",
    // 其他配置项
};

可以手动在浏览器里访问这个元地址,确认能正常返回XML内容,并且里面包含<ds:Signature>节点对应的签名证书信息。如果元数据加载失败,中间件拿不到验证用的证书,肯定会报错。

2. 检查ADFS签名证书的信任关系

ADFS的签名证书必须被你的IdentityServer服务器信任:

  • 如果是内部CA颁发的证书,要把CA根证书导入到服务器的受信任根证书颁发机构存储
  • 如果是自签名证书,也要把这个证书导入到服务器的受信任存储里
  • 还要确保运行IdentityServer的应用池账户(比如IIS的AppPool账户)有权限访问证书存储

3. 核对令牌受众(Audience)与信赖方配置

有时候签名验证失败的表象下,实际是令牌的受众和你的应用配置不匹配。检查WsFederation配置里的Wtrealm,必须和ADFS后台为你的IdentityServer配置的信赖方标识符完全一致:

var adfs = new WsFederationAuthenticationOptions
{
    // 其他配置...
    Wtrealm = "https://your-identityserver-domain", // 和ADFS里的信赖方ID一字不差
};

4. 手动指定签名证书(元数据自动加载失效时)

如果元数据自动加载有问题(比如网络限制),可以手动指定ADFS的签名证书。先从ADFS服务器导出签名证书的公钥(.cer格式即可),然后在配置中手动注入:

// 从文件加载证书,或者从服务器证书存储读取
var adfsSigningCert = new X509Certificate2(@"C:\certs\adfs-signing.cer");

var adfs = new WsFederationAuthenticationOptions
{
    // 其他配置...
    TokenValidationParameters = new TokenValidationParameters
    {
        ValidIssuer = "http://your-adfs-server/adfs/services/trust", // ADFS的颁发者URI,从元数据里能找到
        ValidateIssuerSigningKey = true,
        IssuerSigningKey = new X509SecurityKey(adfsSigningCert)
    }
};

5. 开启详细日志定位细节

如果上面的方法都没解决,建议开启IdentityServer3和Owin的详细日志,能拿到更具体的错误信息。比如在Startup里配置Serilog(IdentityServer常用的日志框架):

Log.Logger = new LoggerConfiguration()
    .MinimumLevel.Verbose()
    .WriteTo.Console()
    .WriteTo.File(@"C:\logs\idsrv.log", rollingInterval: RollingInterval.Day)
    .CreateLogger();

日志里会告诉你到底是证书不匹配、颁发者无效,还是其他验证环节出了问题,比笼统的签名失败提示有用多了。


内容的提问来源于stack exchange,提问作者Singh PCT

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:06:09