- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我已经关注了 IdentityServer4 quickstarts并且能够使用隐式授权使用本地托管的 IdentityServer 实例验证我的 javascript 网页(几乎与快速入门中提供的相同)。同样,我的 IdentityServer 与上述快速入门中提供的几乎完全相同 - 它只是包含一些自定义用户详细信息。
然后我将我的应用程序(C# .NET Core)移动到一个 docker 容器中,并在 Kubernetes 集群(单个实例)中托管了一个实例,并创建了一个 Kubernetes 服务(一个或多个“真实”服务的外观)让我从集群外部访问身份服务器。我可以修改我的 JavaScript 网页并将其指向我的 Kubernetes 服务,它仍然会很高兴地显示登录页面,而且它似乎按预期工作。
然后,当我将 IdentityServer 扩展到三个实例(所有实例均在单个 Kubernetes 服务后提供服务)时,我开始遇到问题。Kubernetes 服务循环请求每个身份服务器,因此第一个将显示登录页面,但第二个将在我按下登录按钮后尝试处理身份验证。这会导致以下错误:
System.InvalidOperationException: The antiforgery token could not be decrypted. ---> System.Security.Cryptography.CryptographicException: The key {19742e88-9dc6-44a0-9e89-e7b09db83329} was not found in the key ring. at Microsoft.AspNetCore.DataProtection.KeyManagement.KeyRingBasedDataProtector.UnprotectCore(Byte[] protectedData, Boolean allowOperationsOnRevokedKeys, UnprotectStatus& status) at Microsoft.AspNetCore.DataProtection.KeyManagement.KeyRingBasedDataProtector.DangerousUnprotect(Byte[] protectedData, Boolean ignoreRevocationErrors, Boolean& requiresMigration, Boolean& wasRevoked) at Microsoft.AspNetCore.DataProtection.KeyManagement.KeyRingBasedDataProtector.Unprotect(Byte[] protectedData) at Microsoft.AspNetCore.Antiforgery.Internal.DefaultAntiforgeryTokenSerializer.Deserialize(String serializedToken) --- End of inner exception stack trace --- ... And lots more......
所以 - 我知道我收到这个错误是因为期望同一个 IdentityServer 应该为它所显示的页面请求提供服务(否则防伪 token 将如何工作,对吗?),但我我试图了解如何在复制环境中完成这项工作。
我不想在不同的 IP/端口上托管多个身份服务器;我正在尝试构建一个 HA 配置,如果一个 IdentityServer 挂掉,调用端点的任何事情都不会关心(因为请求应该由其他工作实例提供服务)。
我说过我使用的是快速启动代码——这意味着在 IdentityServer 的启动中,有看起来像这样的代码......
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
services.AddIdentityServer(options =>
{
options.Events.RaiseSuccessEvents = true;
options.Events.RaiseFailureEvents = true;
options.Events.RaiseErrorEvents = true;
})
.AddTemporarySigningCredential()
.AddInMemoryIdentityResources(Config.GetIdentityResources())
.AddInMemoryApiResources(Config.GetApiResources())
.AddInMemoryClients(Config.GetClients())
我假设我需要用证书替换 .AddTemporarySigningCredential()
逻辑,我的 Kubernetes 集群中运行的 IdentityServer 的所有实例都可以使用该证书。不知道 MVC 是如何工作的(MVC6 用于在 IdentityServer 服务中生成登录页面,这是我从示例代码中获得的 - 上面的链接) - 我想知道是否只是更改代码以使用在两者之间共享的正确证书所有服务都足以让原型(prototype) HA IdentityServer 集群正常工作吗?
通过工作,我的意思是我的期望是我可以在 Kubernetes 集群中运行 n 个 IdentityServer 实例,有一个 Kubernetes 服务作为我运行的许多 IdentityServer 的外观,并且能够使用多个 IdentityServer 实例可以共享数据,它们都为我的调用 Web 应用程序提供完全相同的权限,并且可以在一个或多个实例挂掉时处理彼此的请求。
如有任何帮助或见解,我们将不胜感激。
最佳答案
我想我已经解决了这个问题。为了解决我的问题,我做了两件事:
创建我自己的 X509 证书并在我的每个 IdentityServer 之间共享该证书。网上有很多关于如何创建有效证书的示例;我刚用过
services.AddIdentityServer(...).AddSigningCredential(new X509Certificate2(bytes, "password")
在我的创业类。
深入研究 MVC 框架代码,发现我需要实现 Key storage provider为了在提供登录页面的 Identity Server 的 MVC 部分的不同实例之间共享状态。
原来有一个Redis backed KSP available from NuGet ,这意味着我只需要在我的 Kube 集群中启动一个私有(private)的 redis 实例(在我的集群之外无法访问)来共享解密 secret 。
/* Note: Use an IP, or resolve from DNS prior to adding redis based key store as direct DNS resolution doesn't work for this inside a K8s cluster, though it works quite happily in a Windows environment. */
var redis = ConnectionMultiplexer.Connect("1.2.3.4:6379");
services.AddDataProtection()
.PersistKeysToRedis(redis, "DataProtection-Keys");
我现在可以将我的身份服务扩展到 3 个实例,并让 Kube 服务充当所有可用实例的外观。我可以将日志视为身份服务之间 Kubernetes 循环请求,并且我的身份验证正如我预期的那样发生。
感谢那些在发表这篇文章之前对问题发表评论的人。
关于c# - 扩展 IdentityServer4 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45233415/
我是 magento 的新手,目前我在 magento 安装期间遇到“必须加载 PHP 扩展 curl ”错误。你能帮帮我吗? 最佳答案 如果您的服务器上没有安装 curl,您可以键入以下命令之一来安
我在 macOS Mojave/macOS Big Sur/macOS Monterey/macOS Ventura 上使用最新的 php 版本 7.2 并收到类似错误 $composer requ
这个问题已经有答案了: Why generic type is not applicable for argument extends super class for both? (5 个回答) 已关
我正在使用 NightWatch.js 并进行一些 UI 测试,我想用一些额外的 desiredCapabilities 启动默认浏览器实例(即启用扩展并应用一些特定值)。 p> 注意:我可以执行这些
有人知道为什么我在 java 8 中使用此代码时没有服务器扩展名称吗: try { URL url = new URL(urlString); URLC
扩展提供给我的类(class)。为现有的类提供新功能。或扩展现有的mixin s 或虚拟类,任何东西都可以工作。 也许是这样的: class FlatButton {} // maybe no
我有一个关于使用 c 代码和 mod_wsgi 扩展 python 的问题。 我在 apache 服务器中有一个 django 应用程序,它查询 postgresql 数据库以生成报告。在某些报告中,
testcafe支持在Chrome浏览器中加载crx扩展吗? 如果是这样,请告诉我需要尝试什么方法。 我尝试了下面的代码,但没有成功 await t.eval(new Function(fs.read
这个问题已经有答案了: What is a raw type and why shouldn't we use it? (16 个回答) 已关闭 3 年前。 有什么区别: // 1 class A c
我正在编写一个 chrome 扩展来记录单击开始按钮后触发的请求。 这是我的文件:1. list .json { "manifest_version": 2, "name": "recorde
我每天都在使用 vim 和 perforce 现在我的问题是,如果我想查看 perforce 文件修订版,则从命令模式下的 vim :!p4 打印文件#1 vim 试图让我获得缓冲区 #1。有没有办法
大家好,我有一个关于 NUnit 扩展(2.5.10)的问题。 我想做的是向 数据库。为此,我使用 Event 创建了 NUnit 扩展 听众。 我遇到的问题是公共(public)无效 TestFin
我有弹出窗口,而不是模态窗口。 如何通过单击页面的其他部分(不在窗口中)来关闭此窗口? 最佳答案 像这样的东西: function closeWin(e, t) { var el = win.
我通常非常谨慎地使用扩展方法。当我确实觉得有必要编写一个扩展方法时,有时我想重载该方法。我的问题是,您对调用其他扩展方法的扩展方法有何看法?不好的做法?感觉不对,但我无法真正定义原因。 例如,第二个
扩展 Ant Ant带有一组预定义的任务,但是你可以创建自己的任务,如下面的例子所示。 定制Ant 任务应扩展 org.apache.tools.ant.Task 类,同时也应该拓展 execut
我想要一个重定向所有请求的扩展: http://website.com/foo.js 到: http://localhost/myfoo.js 我无法使用主机文件将主机从 website.com 编辑
对于为什么 QChartView 放在 QTabWidget 中时会扩展,我有点迷惑。 这是 QChartView 未展开(因为它被隐藏)时应用程序的图片。 应用程序的黑色部分是 QOpenGLWid
如果在连接条件中使用 OR 运算符,如何优化以下查询以避免 SQL 调优方面的 OR 扩展? SELECT t1.A, t2.B, t1.C, t1.D, t2.E FROM t1 LEFT J
一旦加载插件的问题得到解决(在 .NET 中通过 MEF 的情况下),下一步要解决的是与它们的通信。简单的方法是实现一个接口(interface),使用插件实现,但有时插件只需要扩展应用程序的工作方式
在我的 Symfony2 包中,我需要检查是否定义了一个函数(一个扩展)。更具体地说,如果安装了 KnpMenuBundle,我会在我的包中使用那个,否则我将自己渲染插件。 我试过了,但这当然不起作用
我是一名优秀的程序员,十分优秀!