Identity Server 4与3之间的安全令牌验证问题求助
解决IdentityServer4与IdentityServer3 WebForms客户端的签名验证异常问题
我帮你拆解下这个问题:你遇到的SecurityTokenSignatureKeyNotFoundException核心原因是IdentityServer3(IdS3)客户端找不到对应的密钥来验证IdentityServer4(IdS4)签发的JWT签名。你已经在IdS4端配置了自定义签名证书,但IdS3端还没配置信任这个证书,所以导致验证失败。
下面给你两种可行的解决方案,按推荐程度排序:
方案1:通过OIDC发现端点自动获取验证密钥(推荐)
IdS4支持标准的OIDC发现端点,IdS3可以通过这个端点自动拉取IdS4的签名密钥,不需要手动维护证书,适合后续证书轮换的场景。
在你的IdS3 WebForms客户端配置中,修改IdentityServer客户端的验证配置:
var clientOptions = new IdentityServer3.Core.Configuration.ClientOptions { // 保留你已有的客户端配置(比如ClientId、RedirectUri等) ClientId = "webforms", RedirectUri = "你的回调地址", // 新增以下配置 ValidationMode = ValidationMode.ValidationEndpoint, Authority = "http://localhost:5000", // 你的IdS4服务器地址 DiscoveryEndpointUrl = "http://localhost:5000/.well-known/openid-configuration" // IdS4的发现端点 };
这样IdS3会自动从IdS4的发现端点获取最新的签名密钥,完成JWT签名验证。
方案2:手动加载IdS4的签名证书到IdS3客户端
如果你更倾向于手动管理证书,可以直接把IdS4使用的签名证书加载到IdS3的验证配置中。
在IdS3客户端的配置代码里添加:
// 加载IdS4使用的签名证书(和你在IdS4中用的是同一个) var store = new X509Store(StoreName.My, StoreLocation.LocalMachine); store.Open(OpenFlags.ReadOnly); var signingCert = store.Certificates.Find(X509FindType.FindBySerialNumber, "3506fe4f69dc22b340e9c2af500d4659", false)[0]; store.Close(); // 配置IdS3客户端的验证参数 var clientOptions = new IdentityServer3.Core.Configuration.ClientOptions { // 保留你已有的客户端配置 ClientId = "webforms", RedirectUri = "你的回调地址", // 配置验证模式和信任的证书/ issuer ValidationMode = ValidationMode.Local, ValidIssuers = new List<string> { "http://localhost:5000" }, // 必须和IdS4的iss声明一致 SigningCertificates = new List<X509Certificate2> { signingCert } // 添加IdS4的签名证书 };
额外注意事项
- 确保IdS4的
iss声明(报错里是http://localhost:5000)和IdS3配置的ValidIssuers完全一致,大小写、末尾斜杠都要匹配。 - 检查IdS3客户端的
ClientId是否和JWT中的aud声明(报错里是webforms)一致。 - 如果用方案2,要确保IdS4的签名证书已经安装在IdS3客户端机器的LocalMachine\My证书存储中,并且运行IdS3应用的账号有读取该证书的权限。
内容的提问来源于stack exchange,提问作者Chas Rayner Rose
相关产品推荐
相关产品推荐

