热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

扩展IdentityServer4服务

如何解决《扩展IdentityServer4服务》经验,为你挑选了1个好方法。

我已经关注了IdentityServer4快速入门,并且能够使用隐式授权使用IdentityServer的本地主机实例来验证我的Javascript网页(几乎与快速入门中提供的相同).同样,我的IdentityServer几乎与上面提到的快速入门中提供的相同 - 它只是有一些自定义用户详细信息.

然后我将我的应用程序(C#.NET Core)移动到一个docker容器中,并在Kubernetes集群(单个实例)中托管了一个这样的实例,并创建了一个Kubernetes服务(通过一个或多个"真实"服务的外观),这使我可以访问集群外部的身份服务器.我可以修改我的Javascript网页并将其指向我的Kubernetes服务,它仍然可以很愉快地显示登录页面,它似乎按预期工作.

然后当我将IdentityServer扩展到三个实例(所有服务都在一个Kubernetes服务后面)时,我开始遇到问题.Kubernetes服务对每个身份服务器进行循环请求,因此第一个将显示登录页面,但第二个将在我按下登录按钮后尝试处理身份验证.这会导致以下错误:

System.InvalidOperationException:无法解密防伪令牌.---> System.Security.Cryptography.CryptographicException:在密钥环中找不到密钥{19742e88-9dc6-44a0-9e89-e7b09db83329}.at Microsoft.AspNetCore.DataProtection.KeyManagement.KeyRingBasedDataProtction.UnprotectCore(Byte [] protectedData,Boolean allowOperationsOnRevokedKeys,UnprotectStatus&status)at Microsoft.AspNetCore.DataProtection.KeyManagement.KeyRingBasedDataProtector.DangerousUnprotect(Byte [] protectedData,Boolean ignoreRevocationErrors,Boolean&requiresMigration,Boolean&wasRevoked )Microsoft.AspNetCore.DataProtection.KeyManagement.KeyRingBasedDataProtction.Unprotect(Byte [] protectedData)at Microsoft.AspNetCore.Antiforgery.Internal.DefaultAntiforgeryTokenSerializer.Deserialize(String serializedToken)---内部异常堆栈跟踪结束--- ...还有更多......

所以 - 我明白我收到了这个错误,因为期望是同一个IdentityServer应该为它所显示的页面提供服务请求(否则反伪造令牌会如何工作,对吧?),但是我想要的是了解我是如何在复制环境中完成这项工作的.

我不想在不同的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服务中的登录页面,我从示例代码中获取 - 上面的链接) - 我想知道是否只是更改代码以使用在之间共享的适当证书所有服务都足以让HA IdentityServer集群工作原型?

通过工作,我的意思是我的期望是我可以在Kubernetes集群中运行n个IdentityServer实例,使用Kubernetes服务作为我运行的许多IdentityServer的外观,并且能够使用多个IdentityServer实例进行身份验证它可以共享数据,只要它们都为我的调用Web应用程序提供完全相同的权限,并且可以在一个或多个实例死亡时处理彼此的请求.

任何帮助或见解将不胜感激.



1> Jay..:

我想我已经解决了这个问题.为解决我的问题,我做了两件事:

    创建我自己的X509证书,并在我的每个IdentityServer之间共享此证书.有很多关于如何在网上创建有效证书的例子; 我刚刚
    services.AddIdentityServer(...).AddSigningCredential(new X509Certificate2(bytes, "password")在我的启动课上使用过.

    深入研究MVC框架代码并确定我需要实现密钥存储提供程序,以便在提供登录页面的Identity Server的MVC部分的不同实例之间共享状态.

事实证明,NuGet提供了一个Redis支持的KSP,这意味着我只需要在我的Kube集群(在我的集群之外无法访问)中启动私有redis实例来共享解密秘密.

/* 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循环请求,我的身份验证就像我期望的那样发生.

感谢那些在这篇文章之前对这个问题发表评论的人.


推荐阅读
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • http:my.oschina.netleejun2005blog136820刚看到群里又有同学在说HTTP协议下的Get请求参数长度是有大小限制的,最大不能超过XX ... [详细]
  • 本文介绍了RPC框架Thrift的安装环境变量配置与第一个实例,讲解了RPC的概念以及如何解决跨语言、c++客户端、web服务端、远程调用等需求。Thrift开发方便上手快,性能和稳定性也不错,适合初学者学习和使用。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • web.py开发web 第八章 Formalchemy 服务端验证方法
    本文介绍了在web.py开发中使用Formalchemy进行服务端表单数据验证的方法。以User表单为例,详细说明了对各字段的验证要求,包括必填、长度限制、唯一性等。同时介绍了如何自定义验证方法来实现验证唯一性和两个密码是否相等的功能。该文提供了相关代码示例。 ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • 本文介绍了一个适用于PHP应用快速接入TRX和TRC20数字资产的开发包,该开发包支持使用自有Tron区块链节点的应用场景,也支持基于Tron官方公共API服务的轻量级部署场景。提供的功能包括生成地址、验证地址、查询余额、交易转账、查询最新区块和查询交易信息等。详细信息可参考tron-php的Github地址:https://github.com/Fenguoz/tron-php。 ... [详细]
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 在重复造轮子的情况下用ProxyServlet反向代理来减少工作量
    像不少公司内部不同团队都会自己研发自己工具产品,当各个产品逐渐成熟,到达了一定的发展瓶颈,同时每个产品都有着自己的入口,用户 ... [详细]
  • 本文介绍了在Linux下安装和配置Kafka的方法,包括安装JDK、下载和解压Kafka、配置Kafka的参数,以及配置Kafka的日志目录、服务器IP和日志存放路径等。同时还提供了单机配置部署的方法和zookeeper地址和端口的配置。通过实操成功的案例,帮助读者快速完成Kafka的安装和配置。 ... [详细]
  • 在springmvc框架中,前台ajax调用方法,对图片批量下载,如何弹出提示保存位置选框?Controller方法 ... [详细]
  • 本文记录了在vue cli 3.x中移除console的一些采坑经验,通过使用uglifyjs-webpack-plugin插件,在vue.config.js中进行相关配置,包括设置minimizer、UglifyJsPlugin和compress等参数,最终成功移除了console。同时,还包括了一些可能出现的报错情况和解决方法。 ... [详细]
  • 本文讨论了在VMWARE5.1的虚拟服务器Windows Server 2008R2上安装oracle 10g客户端时出现的问题,并提供了解决方法。错误日志显示了异常访问违例,通过分析日志中的问题帧,找到了解决问题的线索。文章详细介绍了解决方法,帮助读者顺利安装oracle 10g客户端。 ... [详细]
author-avatar
mthp
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有