集群环境下,你不得不注意的ASP.NET Core Data Protection 机制
引言
最近线上环境遇到一个问题,就是ASP.NET Core Web应用在单个容器使用正常,扩展多个容器无法访问的问题。查看容器日志,发现以下异常:
System.Security.Cryptography.CryptographicException: The key {efbb9f35-3a49-4f7f-af19-0f888fb3e04b} was not found in the key ring.
2019-09-30T18:34:55.473037193+08:00 at Microsoft.AspNetCore.DataProtection.KeyManagement.KeyRingBasedDataProtector.UnprotectCore(Byte[] protectedData, Boolean allowOperationsOnRevokedKeys, UnprotectStatus& status)
2019-09-30T18:34:55.473046762+08:00 at Microsoft.AspNetCore.DataProtection.KeyManagement.KeyRingBasedDataProtector.DangerousUnprotect(Byte[] protectedData, Boolean ignoreRevocationErrors, Boolean& requiresMigration, Boolean& wasRevoked)
2019-09-30T18:34:55.473055477+08:00 at Microsoft.AspNetCore.DataProtection.KeyManagement.KeyRingBasedDataProtector.Unprotect(Byte[] protectedData)
2019-09-30T18:34:55.473064427+08:00 at Microsoft.AspNetCore.Session.CookieProtection.Unprotect(IDataProtector protector, String protectedText, ILogger logger)
通过排查,发现了是由于 [ASP.NET Core Data Protection:https://docs.microsoft.com/en-us/aspnet/core/security/data-protection/introduction?view=aspnetcore-3.0] 机制引起的。
Data Protection 机制
对于Data Protection机制,晓东大大已经有系列文章详述了,我这里就不再过多赘述,只简单总结一下。需要了解详细的机制,建议阅读以下系列文章:
[ASP.NET Core 数据保护(Data Protection)【上】:https://www.cnblogs.com/savorboard/p/5778616.html] [ASP.NET Core 数据保护(Data Protection)【中】:https://www.cnblogs.com/savorboard/p/dotnet-core-data-protection.html] [ASP.NET Core 数据保护(Data Protection 集群场景)【下】:https://www.cnblogs.com/savorboard/p/dotnetcore-data-protected-farm.html]
Data Protection(数据安全)机制:为了确保Web应用敏感数据的安全存储,该机制提供了一个简单、基于非对称加密改进的、性能良好的、开箱即用的加密API用于数据保护。它不需要开发人员自行生成密钥,它会根据当前应用的运行环境,生成该应用独有的一个私钥。这在单一部署的情况下没有问题。一旦在集群环境下进行水平扩展,那么每个独立的应用都有一个独立的私钥。这样在负载均衡时,一个请求先在A容器建立的Session会话,该机制会通过当前容器的密钥加密Cookie写入到客户端,下个请求路由到B容器,携带的Cookie在B容器是无法通过B容器的密钥进行解密,进而会导致会话信息丢失的问题。
所以在集群情况下,为了确保加密数据的互通,应用必须共享私钥。
私钥共享
这里以使用Redis来共享私钥举例,添加 Microsoft.AspNetCore.DataProtection.StackExchangeRedis
Nuget包用于存储密钥。添加 Microsoft.Extensions.Caching.StackExchangeRedis
Nuget包用于配置分布式Session。
public IServiceProvider ConfigureServices(IServiceCollection services)
{ //获取Redis 连接字符串 var redisConnStr = this.Configuration.GetValue<string>(SigeAppSettings.Redis_Endpoint); var redis = ConnectionMultiplexer.Connect(redisConnStr);//建立Redis 连接 //添加数据保护服务,设置统一应用程序名称,并指定使用Reids存储私钥 services.AddDataProtection() .SetApplicationName(Assembly.GetExecutingAssembly().FullName) .PersistKeysToStackExchangeRedis(redis, "DataProtection-Keys"); //添加Redis缓存用于分布式Session services.AddStackExchangeRedisCache(options => { options.Configuration = redisConnStr; options.InstanceName =Assembly.GetExecutingAssembly().FullName; }); //添加Session services.AddSession(options => { options.Cookie.Name = Assembly.GetExecutingAssembly().FullName; options.IdleTimeout = TimeSpan.FromMinutes(20);//设置session的过期时间 options.Cookie.HttpOnly = true;//设置在浏览器不能通过js获得该cookie的值 options.Cookie.IsEssential = true; } );
}
集群环境下,你不得不注意的ASP.NET Core Data Protection 机制相关推荐
- weblogic 12C集群环境下的session复制
做过weblogic集群环境的人应该都清楚,要想实现session同步,必须满足两个条件:第一,在weblogic.xml里面增加session同步相关的代码:第二,所有放入session的类都要序列 ...
- quartz在集群环境下的最终解决方案
在集群环境下,大家会碰到一直困扰的问题,即多个 APP 下如何用 quartz 协调处理自动化 JOB . 大家想象一下,现在有 A , B , C3 台机器同时作为集群服务器对外统一提供 SERVI ...
- 分布式集群环境下,如何实现session共享三(环境搭建)
这是分布式集群环境下,如何实现session共享系列的第三篇.在上一篇:分布式集群环境下,如何实现session共享二(项目开发)中,准备好了一个通过原生态的servlet操作session的案例.本 ...
- Java技术分享:集群环境下的定时任务
定时任务的实现方式有多种,例如JDK自带的Timer+TimerTask方式,Spring 3.0以后的调度任务(Scheduled Task),Quartz框架等. Timer+TimerTask是 ...
- 在非容器(集群)环境下运行dapr
作者:李俱顺 原文:https://www.4async.com/2021/03/2021-03-11-running-dapr-without-container/ 前一段时间一直关注的dapr正式 ...
- Hadoop集群环境下网络架构的设计与优化
2019独角兽企业重金招聘Python工程师标准>>> 大数据时代,研究大数据的IT 厂商把研究重心放在优化大数据系统软件架构.优化业务逻辑.优化数据分析算法.优化节点性能等方向,而 ...
- MEMCACHED在集群环境下对并发更新是否保持数据一致
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 今天在和 ...
- ORACLE集群日志收集,【RAC】Oracle RAC集群环境下日志文件结构
在Oracle RAC环境中,对集群中的日志的定期检查是必不可少的.通过查看集群日志,可以早期定位集群环境中出现的问题,以便将问题消灭在萌芽状态.简单介绍一下有关Oracle集群环境中日志的结构,方便 ...
- 集群环境下定时调度的解决方案之Quartz集群
集群环境下定时调度的解决方案之Quartz集群 参考文章: (1)集群环境下定时调度的解决方案之Quartz集群 (2)https://www.cnblogs.com/yinfengjiujian/p ...
最新文章
- 测试Animation大型动画文件拆分播放的可行性
- 微型计算机中PRON是,英语词性英语中的pron指的是什么词性?? – 手机爱问
- 关于网络连接方式的总结(HostOnly,NAT....)
- 开发日记-20190806 关键词 读书笔记《Linux 系统管理技术手册(第二版)》DAY 20
- html登录界面设计代码_.NET 5 开发WPF - 美食应用登录UI设计
- 递增子序列 Increasing Subsequences
- 线程池框架-Executor
- 研究员公开Razer 0day,插入鼠标即可获得Windows管理员权限
- ryzen cpu 用啥linux,AMD Ryzen锐龙处理器配什么主板?AMD 锐龙Ryzen CPU搭配主板技巧...
- CSDN学习会员组团
- 从大数据的角度看 房价一定会下跌
- 【Usaco2008 Mar】土地购买
- 在Linux上恢复误删除的文件或目录
- C3P0jar包下载方法
- 【第8章】Java常用核心类
- 中国十大基金公司排行榜
- YUV420P视频裁剪
- 计算机视觉之图像增广(翻转、随机裁剪、颜色变化[亮度、对比度、饱和度、色调])
- php 网站访问统计插件,帝国CMS教程_网站访问统计插件使用教程_好特教程
- 用c语言编写的打字母游戏,用C语言编写小游戏——“井字棋”
热门文章
- Asp.Net+Jquery.Ajax详解5-$.getScript
- C#操作Excel文件暨C#实现在Excel中将连续多列相同数据项合并
- 用SharpZipLib来压缩和解压文件 --zt
- 定量库存控制模型_探索全面流动管理TFM 库存控制与低减的理性策略
- 哪个app最费电_微波炉和烤箱,买哪个划算?
- 如何在Microsoft Excel中将文本转换为日期值
- 保存页面供以后使用Firefox的阅读列表扩展
- Sublime text3配置xdebug调试记录
- AWD-LSTM为什么这么棒?
- jsp 连接access数据库