Bearer 未通过身份验证:签名验证失败

Bearer was not authenticated: Signature validation failed

我正在使用 Identity Server 4 来保护由 angular 应用程序访问的 API(隐式流模式)。一切正常,但是在特定时期访问令牌甚至在到期之前突然失效。

配置:

这是身份服务器启动文件:

 var identityBuilder = services.AddIdentityServer().AddInMemoryStores().SetTemporarySigningCredential();

 identityBuilder.AddInMemoryScopes(identitySrvConfig.GetScopes());
 identityBuilder.AddInMemoryClients(identitySrvConfig.GetClients());

保护 API:

   app.UseIdentityServerAuthentication(new IdentityServerAuthenticationOptions
        {
            Authority = identityOptions.Authority,
            ScopeName = "userProfile_api",


            RequireHttpsMetadata = false
        });

调查:

问题是持票人未通过身份验证

Bearer was not authenticated. Failure message: IDX10501: Signature validation failed. Unable to match 'kid': 'e4f3534e5afd70ba74c245fe2e39c724', token

经过一些调查,身份服务器似乎正在生成导致签名验证失败的新密钥。

在日志中,我可以看到最后两个警告事件何时发生,然后我看到 "Repository contains no viable default key" 和 "a new key should be added to the ring"

问题

即使我使用的是临时签名 (SetTemporarySigningCredential) 并且我没有重启服务器,但密钥寿命将近 3 个月,为什么在任何时候都没有密钥?

Creating key {a2fffa4a-345b-4f3b-bae7-454d567a1aee} with creation date 2017-03-03 19:15:28Z, activation date 2017-03-03 19:15:28Z, and expiration date 2017-06-01 19:15:28Z. 

我该如何解决这个问题?

创建自签名证书并删除身份服务器上的临时签名解决了这个问题。

var signingCertificate = new X509Certificate2("ReplaceByCertificatePath, "ReplaceByPasswordCertificate");
var identityBuilder = services.AddIdentityServer().AddInMemoryStores().SetSigningCredential(signingCertificate);

identityBuilder.AddInMemoryScopes(IdentitySrvConfig.GetScopes());
identityBuilder.AddInMemoryClients(IdentitySrvConfig.GetClients());