2

我正在使用Identity Server 4来保护由角度应用程序访问的我的API(隐式流模式)。每件事情都很好,但是在特定时期,访问令牌即使在到期之前突然失效。承载者未通过身份验证:签名验证失败

配置:

这里是Identity Server的启动文件:

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 

经过一番调查后,似乎身份服务器产生这是导致签名验证失败一个新的密钥。

enter image description here

在日志中,我可以当端的两个警告事件发生看,然后我看到“库不包含任何可行的默认键”和“新的密钥应该被加入到环”

问题

为什么会有没有是随时一键在键寿命为近3个月,即使我使用临时签名(SetTemporarySigningCredential)和我没有重新启动服务器?

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. 

我该如何解决这个问题?

+0

获得真正的签名证书而不是临时证书 - 然后再次测试。 – leastprivilege

+0

你也在重新启动API项目吗?我认为那个中间件缓存了发现文件。我可能是错的。 – Lutando

回答

1

创建自签名证书并删除身份服务器上的临时签名可修复此问题。

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

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

为什么临时签名不起作用?这是在文档中的任何地方提到的吗? – stt106

+0

它的工作,但有时令牌甚至在其到期之前无效。这是在我们使用临时签名几周后发现的,并不是一个简单的方法。 – Coding

+0

我遇到了同样的问题,例如令牌在到期之前过期。如果知道,为什么临时签名会导致这种情况? – stt106