asp.net - 在负载均衡器后面时签名验证失败
问题描述
我目前在单个服务器上运行 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/
解决上面列出的错误/问题的下一步是什么?
提前感谢您的帮助!
解决方案
您遇到这种情况的原因是您没有保留数据保护密钥。基本上 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
。
以下是微软官方文档中的一些示例,用于保存此密钥,或者如果您想使用数据库,您也可以实现自己的逻辑(这就是我所做的)。
当然,以上所有内容都是您的证书是否一切正常(如您所说)。但它应该是,如果它不在负载均衡器后面工作。
推荐阅读
- javascript - Stripe 订阅 - 如何格式化 cancel_at 日期
- ruby-on-rails - 在 Rails 6 中制作自定义记录器
- postgresql - Blazor:如何将 ASP.NET 标识与非 SQL Server 存储一起使用?
- verilog - 在 Verilog 中测试有限状态机模块
- aspnetboilerplate - AspnetBoilerplate 中的模拟选项
- angular-material - 如何在 Angular 中标记/突出显示输入?
- javascript - 如何在模块中声明 AuthService?
- php - 使用 laravel eloquent 创建子查询
- html - 当鼠标离开css时平滑过渡
- php - 通过ajax向php发送数据时如何检查复选框是否被选中