我正在使用Identity Server 4来保护我的API(隐式流模式),这些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
经过一番调查后,身份服务器似乎正在生成一个新密钥,导致签名验证失败。
在日志中,我可以看到最后两个警告事件发生的时间,然后我看到"存储库包含没有可行的默认密钥"并且"应该在戒指中添加一个新密钥"
问题
为什么即使我使用临时签名(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.
我该如何解决这个问题?
答案 0 :(得分:1)
创建自签名证书并删除身份服务器上的临时签名修复了该问题。
var signingCertificate = new X509Certificate2("ReplaceByCertificatePath, "ReplaceByPasswordCertificate");
var identityBuilder = services.AddIdentityServer().AddInMemoryStores().SetSigningCredential(signingCertificate);
identityBuilder.AddInMemoryScopes(IdentitySrvConfig.GetScopes());
identityBuilder.AddInMemoryClients(IdentitySrvConfig.GetClients());