我目前在单台服务器上运行Identity Server 4,运行正常,没有问题,除了将负载均衡器(Kemp)放在Identity Server 4的前面时,在进行身份验证并重新路由回之后,会出现以下错误我的应用之一。
IDX10500:签名验证失败。无法解析SecurityKeyIdentifier:
SecurityKeyIdentifier
(
IsReadOnly = False,
Count = 1,
Clause[0] = System.IdentityModel.Tokens.NamedKeySecurityKeyIdentifierClause
)
我已经查看了位于此处(Signature validation failed)的堆栈溢出问题,并且已经在负载均衡器后面的两台服务器上安装了SSL证书。此外,我还阅读了Dominick网站上有关设置公共起源的文章,该文章已经完成-该文章位于:https://leastprivilege.com/2017/10/09/new-in-identityserver4-v2-simplified-configuration-behind-load-balancers-or-reverse-proxies/
解决上面列出的错误/问题的下一步是什么?
提前感谢您的帮助!
答案 0 :(得分:0)
遇到这种情况的原因是,您没有保留数据保护密钥。 IdentityServer基本上实现了InMemory数据保护,但是拥有负载均衡器对您不起作用。
您需要做的是实现IXmlRepository
并添加自己的数据保护。它已添加到startup.cs
中,并且在添加IdentitiyServer之后非常重要将其添加到管道中。像这样:
services.AddIdentityServer()
.
.
.more code here (like AddProfileService() etc.)
.
.
然后(在管道中),您需要:
serviceProvider = services.BuildServiceProvider();
services.AddDataProtection()
.AddKeyManagementOptions(options =>
{
options.XmlRepository = serviceProvider.GetService<IXmlRepository>();
})
.SetDefaultKeyLifetime(TimeSpan.FromDays(7))
.ProtectKeysWithCertificate(cert)
.SetApplicationName("Application name");
在此之前,您需要在DI中注册IXmlRepository
的实现。就我而言:
services.AddSingleton<IXmlRepository, DataProtectionKeyStore>();
DataProtectionKeyStore
是IXmlRepository
的实现。
Here是来自Microsoft官方文档的一些示例,用于保存此密钥,或者如果您想使用数据库,也可以实现自己的逻辑(这就是我所做的)。
当然,所有上述所有操作都是通过Cert(如果您说的话)确定的。但是应该可以,如果它不在负载均衡器后面时仍在工作。