首页 > 解决方案 > 在负载均衡器后面时签名验证失败

问题描述

我目前在单个服务器上运行 Identity Server 4,运行良好并且没有问题,除非我将负载平衡器 (Kemp) 放在 Identity Server 4 的前面时,我在验证并重新路由回我的其中一个之后收到以下错误应用程序。

IDX10500:签名验证失败。无法解析 SecurityKeyIdentifier:

SecurityKeyIdentifier
    (
        IsReadOnly = False,
        Count = 1,
        Clause[0] = System.IdentityModel.Tokens.NamedKeySecurityKeyIdentifierClause
    )

我已经查看了位于此处的堆栈溢出问题(签名验证失败),并且我已经在负载均衡器后面的两台服务器上安装了 SSL 证书。此外,我还阅读了 Dominick 网站上关于设置公共来源的文章,我已经完成了 - 该文章位于:https ://leastprivilege.com/2017/10/09/new-in-identityserver4 -v2-simplified-configuration-behind-load-balancers-or-reverse-proxies/

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

提前感谢您的帮助!

标签: asp.netload-balancingidentityserver4

解决方案


您遇到这种情况的原因是您没有保留数据保护密钥。基本上 IdentityServer 实现了 InMemory 数据保护,但是有一个负载均衡器这对你不起作用。

您需要做的是实施IXmlRepository和添加您自己的数据保护。在添加 IdentitiyServer 之后,将其添加到管道startup.cs非常重要。就像是:

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

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

当然,以上所有内容都是您的证书是否一切正常(如您所说)。但它应该是,如果它不在负载均衡器后面工作。


推荐阅读