asp.net core session丢失问题排查
2017-10-23 10:20
501 查看
最近公司采用asp.net core的站点在外测环境中,总是发现存在session丢失的情况。排查了好久,客户端.AspNetCore.Session的cookie未丢失,session的分布式缓存采用的redis主从复制也未发现问题,也想用cookie的变通解决方案,但是没解决根本问题,总是觉得如鱼梗在喉的不爽。后来在排查的过程中,发现同一个客户端通过nginx居然有时候会负载到不同的网站服务器上,检查过nginx,是通过ip_hash进行转发的啊,迷惑不解之际,公司的运维一语破的,原来公司是采用双线路由器的。于是猜测,是否因为存储cookie加密的key存在不同服务器上所导致。
打开微软的Session的源码,先查看SessionMiddleware中间件的代码,其中有以下的关键源码:
打开微软的Session的源码,先查看SessionMiddleware中间件的代码,其中有以下的关键源码:
var cookieValue = context.Request.Cookies[_options.CookieName]; var sessionKey = CookieProtection.Unprotect(_dataProtector, cookieValue, _logger); if (string.IsNullOrWhiteSpace(sessionKey) || sessionKey.Length != SessionKeyLength) { // No valid cookie, new session. var guidBytes = new byte[16]; CryptoRandom.GetBytes(guidBytes); sessionKey = new Guid(guidBytes).ToString(); cookieValue = CookieProtection.Protect(_dataProtector, sessionKey); var establisher = new SessionEstablisher(context, cookieValue, _options); tryEstablishSession = establisher.TryEstablishSession; isNewSessionKey = true; }
sessionKey是从客户端的cookie中解密出来的,其中CookieProtection的_dataProtector来自
_dataProtector = dataProtectionProvider.CreateProtector(nameof(SessionMiddleware));
将系统默认注入的IDataProtectionProvider扒出来:
发现IDataProtectionProvider为Microsoft.AspNetCore.DataProtection.KeyManagement.KeyRingProvider,该IDataProtectionProvider的keyManager为
Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager。
果然不出所料,key存在单机上,打开微软的DataProtection-dev源码查看FileSystemXmlRepository中获取Key存储路径的实现:
眼尖的发现项目下面就有一个将key持久化到redis的实现:
添加相应的nuget包,修改ConfigureServices方法:
services.AddDataProtection() .PersistKeysToRedis(ConnectionMultiplexer.Connect(redisConnection), dataProtectionKey);
终于完美解决!在采用分布式存储session的时候,最好将dataProtectionProvider的key也进行共享,否则如果做了ip_hash负载均衡,客户端ip一变,可能负载到另外一台服务器,导致存储session的cookie数据解密不出来从而获取不到session!
相关文章推荐
- 关于asp.net Session丢失问题的总结
- ASP.NET 状态服务 及 session丢失问题解决方案总结
- 关于asp.net Session丢失问题的总结
- asp.net 修改/删除站内目录操作后Session丢失问题
- 转:ASP.NET 状态服务 及 session丢失问题解决方案总结
- asp.net 2.0 Session丢失问题
- ASP.NET在IE10中无法判断用户已登入及Session丢失问题解决方法
- ASP.NET在IE10中无法判断用户已登入及Session丢失问题解决方法
- ASP.NET Session丢失问题原因及解决方案
- ASP.NET 状态服务 及 session丢失问题解决方案总结
- ASP.NET Session丢失问题 表单验证机制(FormsAuthentication)却无法判断该用户已登入
- ASP.NET 状态服务 及 session丢失问题解决方案总结
- 如何解决 asp.net session 丢失问题
- 关于asp.net Session丢失问题的总结
- IT咨询顾问:一次吐血的项目救火 java或判断优化小技巧 asp.net core Session的测试使用心得 【.NET架构】BIM软件架构02:Web管控平台后台架构 NetCore入门篇:(十一)NetCore项目读取配置文件appsettings.json 使用LINQ生成Where的SQL语句 js_jquery_创建cookie有效期问题_时区问题
- ASP.NET SESSION丢失问题解决方案
- C#中??和?分别是什么意思? 在ASP.NET开发中一些单词的标准缩写 C#SESSION丢失问题的解决办法 在C#中INTERFACE与ABSTRACT CLASS的区别 SQL命令语句小技巧 JQUERY判断CHECKBOX是否选中三种方法 JS中!=、==、!==、===的用法和区别 在对象比较中,对象相等和对象一致分别指的是什么?
- ASP.NET在IE10中无法判断用户已登入及Session丢失问题解决方法
- ASP.NET MVC1 升级到 MVC2后,Session 丢失问题的解决
- 解决IE10中ASP.NET中Cookie或Session丢失问题