在负载均衡器后面时,签名验证失败

时间:2018-09-27 15:47:20

标签: asp.net load-balancing identityserver4

我目前在单台服务器上运行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/

解决上面列出的错误/问题的下一步是什么?

提前感谢您的帮助!

1 个答案:

答案 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>();

DataProtectionKeyStoreIXmlRepository的实现。

Here是来自Microsoft官方文档的一些示例,用于保存此密钥,或者如果您想使用数据库,也可以实现自己的逻辑(这就是我所做的)。

当然,所有上述所有操作都是通过Cert(如果您说的话)确定的。但是应该可以,如果它不在负载均衡器后面时仍在工作。