【问题标题】:Signature validation failed when behind a load balancer在负载均衡器后面时签名验证失败
【发布时间】:2019-03-03 14:08:10
【问题描述】:

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

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/

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

提前感谢您的帮助!

【问题讨论】:

  • 当您尝试登录以及重新路由时,您能否验证它正在访问哪个实例(服务器)。我感觉您还没有实现DataProtection,因此您的服务器不是无状态的。
  • @m3n7alsnak3 - 谢谢你的回复。我已经关闭了一个实例并访问了 IDS4,因此,我确切地知道我正在访问哪个实例。我这样做是为了消除可能不好的配置。不幸的是,我在两台服务器上都遇到了相同的结果。您能否举例说明您说“DataProtection”时所指的内容?
  • 只有一台服务器启动并运行时,您是否遇到相同的行为?
  • @m3n7alsnak3 - 是的,我是。
  • 这有点奇怪,但无论如何 - 尝试实现 DataProtection。在下面检查我的答案。

标签: asp.net load-balancing identityserver4


【解决方案1】:

您遇到这种情况的原因是您没有保留数据保护密钥。基本上,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 网站上的说明实施了解决方案。但是,现在我收到了 SocketException (0x274c) 错误。目前不确定这是否相关,但想让您知道我已经尝试过您的建议 - 谢谢!
  • 您何时何地收到此异常?
  • 我们在更改 DNS 以指向负载平衡器后遇到异常。我们可以直接访问任一服务器并毫无例外地登录,但是一旦我们将负载均衡器设置为入口点,就会出现错误。
  • 如果你可以单独访问服务器,并且登录成功,那么错误不在IDS中。不要在那里寻找它。在 LB 配置中查找错误
猜你喜欢
  • 2016-04-01
  • 1970-01-01
  • 2018-07-06
  • 1970-01-01
  • 2018-04-14
  • 2017-07-15
  • 2013-10-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多