IdentityServer4 负载均衡配置
在不用到负载之前,一切都很好,但是部署多个实例之后,问题挺多的:session问题、令牌签发后的校验问题。
在此之前,先自查官方文档:Deployment — IdentityServer4 1.0.0 documentation
把必要的东西都配置正确,然后继续查。
session问题
在需要经常需要与统一身份认证平台进行交互的情况(比如,A站点和B站点都是统一身份认证平台下的子系统,希望A站点登录后,在B进行登录的时候可以免登录的情形),建议不用继续使用sessionID,如果不需要,则存放在redis。
令牌签发后的校验问题
部署后启动:
2021-11-01 12:01:50.098 [WRN] Using an in-memory repository. Keys will not be persisted to storage
然后在A站点登录之后,关闭A站点,启动B站点进行测试是否正常可以验证通过,会发现提示去登录,查看日志发现:
2021-11-01 12:01:50.276 [ERR] cookie Showing login: User is not authenticated
然后F12查看cookie已经被删除,讲白了就是AB两个站点并不互认,官方文档里面写着
IdentityServer itself is stateless and does not require server affinity - but there is data that needs to be shared between the instances.
我真想抽它鸭子的。
解决:
因为ids4是有引用到微软库的一个 Microsoft.AspNetCore.DataProtection ,所以可以不用引用,你需要引用一个包:
Microsoft.AspNetCore.DataProtection.StackExchangeRedis
然后在使用:
var redis = ConnectionMultiplexer.Connect( Configuration["Redis:HostPort"]);
services.AddDataProtection()
.SetApplicationName(Configuration["Redis:ApplicationName"])
.PersistKeysToStackExchangeRedis( redis, "DataProtection-Keys");
就ok了,或者不想用StackExchangeRedis,就自己实现:
public class CustomRedisXmlRepository : Microsoft.AspNetCore.DataProtection.Repositories.IXmlRepository
{
protected readonly IRedisCache redisCache;
protected readonly int DBIndex;
private readonly string key; public CustomRedisXmlRepository(IRedisCache redisCache, int dbIndex, string key)
{
this.redisCache = redisCache;
this.DBIndex = dbIndex;
this.key = key;
} /// <inheritdoc />
public IReadOnlyCollection<XElement> GetAllElements()
{
return GetAllElementsCore().ToList().AsReadOnly();
} private IEnumerable<XElement> GetAllElementsCore()
{
foreach (var value in redisCache.GetList<string>(DBIndex,key))
{
yield return XElement.Parse(value);
}
} public void StoreElement(XElement element, string friendlyName)
{
redisCache.AddList(DBIndex,key, element.ToString(SaveOptions.DisableFormatting));
}
}
扩展:
public static class RedisDataProtectionBuilderExtensions
{
private const string DataProtectionKeysName = "DataProtection-Keys";
private const int DefaultDBIndex = 0; public static IDataProtectionBuilder PersistKeysToRedis(this IDataProtectionBuilder builder, IRedisCache redisCache,int dbIndex, string key)
{
if (builder == null)
{
throw new ArgumentNullException(nameof(builder));
}
if (redisCache == null)
{
throw new ArgumentNullException(nameof(IRedisCache));
}
return PersistKeysToRedisInternal(builder, redisCache, dbIndex, key);
} public static IDataProtectionBuilder PersistKeysToRedis(this IDataProtectionBuilder builder, IRedisCache redisCache)
{
return PersistKeysToRedis(builder, redisCache, DefaultDBIndex, DataProtectionKeysName);
} private static IDataProtectionBuilder PersistKeysToRedisInternal(IDataProtectionBuilder builder, IRedisCache redisCache, int dbIndex, string key)
{
builder.Services.Configure<KeyManagementOptions>(options =>
{
options.XmlRepository = new CustomRedisXmlRepository(redisCache, dbIndex, key);
});
return builder;
}
}
引用
var redis = services.BuildServiceProvider().GetService<IRedisCache>();
services.AddDataProtection()
.SetApplicationName(config.RedisOptions.KeyPrefix+ "-Identityserver4-Production-Key")
.PersistKeysToRedis(redis, Application.Configs.RedisKey.Application, config.RedisOptions.KeyPrefix + "-DataProtection-Keys");
然后重新测试,会发现token已经校验通过:
2021-11-01 12:02:04.515 [INF] Token request validation success, {"ClientId":"zhicheng","ClientName":"**","GrantType":"authorization_code","Scopes":null,"AuthorizationCode":"****93B3","RefreshToken":"********","UserName":null,"AuthenticationContextReferenceClasses":null,"Tenant":null,"IdP":null,"Raw":{"client_id":"***","client_secret":"***REDACTED***","grant_type":"authorization_code","code":"153AF90A4B84AC5C0C8ABA1E22483A05936B6009E123AA8937015F26FD6A93B3","redirect_uri":"http://localhost:6001/Home/Index"},"$type":"TokenRequestValidationLog"}
坐等下班!
IdentityServer4 负载均衡配置的更多相关文章
- Nginx + Tomcat Windows下的负载均衡配置
Nginx + Tomcat Windows下的负载均衡配置 一.为什么需要对Tomcat服务器做负载均衡? Tomcat服务器作为一个Web服务器,其并发数在300-500之间,如果超过50 ...
- nginx安装及负载均衡配置
Nginx (“engine x”) 是一个高性能的 HTTP 和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器. Nginx 是由 Igor Sysoev 为俄罗斯访问量第二 ...
- Nginx负载均衡配置实例详解
负载均衡是我们大流量网站要做的一个东西,下面我来给大家介绍在Nginx服务器上进行负载均衡配置方法,希望对有需要的同学有所帮助哦. 负载均衡 先来简单了解一下什么是负载均衡,单从字面上的意思来理解就可 ...
- Nginx 简单的负载均衡配置示例(转载)
原文地址:Nginx 简单的负载均衡配置示例(转载) 作者:水中游于 www.s135.com 和 blog.s135.com 域名均指向 Nginx 所在的服务器IP. 用户访问http://www ...
- Nginx负载均衡配置实例详解(转)
负载均衡是我们大流量网站要做的一个东西,下面我来给大家介绍在Nginx服务器上进行负载均衡配置方法,希望对有需要的同学有所帮助哦. 负载均衡 先来简单了解一下什么是负载均衡,单从字面上的意思来理解就可 ...
- Nginx做NodeJS应用负载均衡配置实例
这篇文章主要介绍了Nginx做NodeJS应用负载均衡配置实例,本文直接给出配置实例,需要的朋友可以参考下. 负载均衡可以把用户的请求分摊到多个服务器上进行处理,从而实现了对海量用户的访问支持.负载均 ...
- Nginx+tomcat负载均衡配置
Nginx+tomcat是目前主流的java web架构,如何让nginx+tomcat同时工作呢,也可以说如何使用nginx来反向代理tomcat后端均衡呢?直接安装配置如下: 1.JAVA JDK ...
- CentOS6.5安装nginx及负载均衡配置
所有的安装包可以去以下地址下载,或者自行去官网下载,下面都有介绍. 所有安装包地址:http://download.csdn.net/detail/carboncomputer/9238037 原文地 ...
- Flume负载均衡配置
flume负载均衡配置 集群DNS配置如下: hadoop-maser 192.168.177.162 machine-0192.168.177.158 machine-1191.168.177.16 ...
随机推荐
- 在 Docker 的 CentOS7 镜像 中安装 mysql
在 Docker 的 CentOS7 镜像 中安装 mysql 本来以为是个很简单的过程居然折腾了这么久,之前部署云服务器时也没有好好地记录,因此记录下. 特别提醒:本文的操作环境是在 Docker ...
- Win7 ASP连接数据库“未找到提供程序.该程序可能未正确安装”问题
是自己装的64位Windows 7系统的原因,默认64位环境下,IIS应用程序池未启用32位应用程序,我们只需要启用一下就可以了.打开IIS 7,定位到"应用程序池",然后选择使用 ...
- ecshop刷新页面出现power by ecshop和链接的解决办法
当小伙伴在使用echop模板进行修改的时候,如果你删掉底部自带版权后,再调试程序刷新界面的时候,时不时就会冒出一个power by ecshop,而且是带有链接的,很不舒服,所以需要去掉,下面是最简单 ...
- postman 插件安装
本文只是基于 Chrome 浏览器的扩展插件来进行的安装,并非单独应用程序. 首先,你要台电脑,其次,安装有 Chrome 浏览器,那你接着往下看吧. 1. 官网安装(别看) 打开官网,https:/ ...
- P4780-Phi的反函数【dfs】
正题 题目链接:https://www.luogu.com.cn/problem/P4780 题目大意 给出\(n\),求一个最小的\(x\)满足\(\varphi(x)=n\). 若不存在或者大于\ ...
- Pycharm新建模板默认添加作者时间等信息(逼格更高,好像很历害的样子)
在pycharm使用过程中,关于代码编写者的一些个人信息快捷填写,使用模板的方式比较方便. 方法如下: 1.打开pycharm,选择File-Settings 2.选择Editor--Color&am ...
- Windows环境下搭建Hadoop(2.6.0)+Hive(2.2.0)环境并连接Kettle(6.0)
前提:配置JDK1.8环境,并配置相应的环境变量,JAVA_HOME 一.Hadoop的安装 1.1 下载Hadoop (2.6.0) http://hadoop.apache.org/release ...
- Social Networ
http://hansheng.xiong99.com.cn/ Paper:Dynamic Networks in Large Financial and Economic Systems
- 转载 使用wce进行本地和域的hash注入
参数解释:-l 列出登录的会话和NTLM凭据(默认值)-s 修改当前登录会话的NTLM凭据 参数:<用户名>:<域名>:<LM哈希>:<NT哈希>-r ...
- Netty常用招式——ChannelHandler与编解码
本文是Netty系列第8篇 上一篇文章我们深入学习了Netty逻辑架构中的核心组件ChannelHandler和ChannelPipeline,并介绍了它在日常开发使用中的最佳实践.文中也提到了,Ch ...