引言

最近线上环境遇到一个问题,就是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.StackExchangeRedisNuget包用于配置分布式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 机制相关推荐

  1. weblogic 12C集群环境下的session复制

    做过weblogic集群环境的人应该都清楚,要想实现session同步,必须满足两个条件:第一,在weblogic.xml里面增加session同步相关的代码:第二,所有放入session的类都要序列 ...

  2. quartz在集群环境下的最终解决方案

    在集群环境下,大家会碰到一直困扰的问题,即多个 APP 下如何用 quartz 协调处理自动化 JOB . 大家想象一下,现在有 A , B , C3 台机器同时作为集群服务器对外统一提供 SERVI ...

  3. 分布式集群环境下,如何实现session共享三(环境搭建)

    这是分布式集群环境下,如何实现session共享系列的第三篇.在上一篇:分布式集群环境下,如何实现session共享二(项目开发)中,准备好了一个通过原生态的servlet操作session的案例.本 ...

  4. Java技术分享:集群环境下的定时任务

    定时任务的实现方式有多种,例如JDK自带的Timer+TimerTask方式,Spring 3.0以后的调度任务(Scheduled Task),Quartz框架等. Timer+TimerTask是 ...

  5. 在非容器(集群)环境下运行dapr

    作者:李俱顺 原文:https://www.4async.com/2021/03/2021-03-11-running-dapr-without-container/ 前一段时间一直关注的dapr正式 ...

  6. Hadoop集群环境下网络架构的设计与优化

    2019独角兽企业重金招聘Python工程师标准>>> 大数据时代,研究大数据的IT 厂商把研究重心放在优化大数据系统软件架构.优化业务逻辑.优化数据分析算法.优化节点性能等方向,而 ...

  7. MEMCACHED在集群环境下对并发更新是否保持数据一致

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 今天在和 ...

  8. ORACLE集群日志收集,【RAC】Oracle RAC集群环境下日志文件结构

    在Oracle RAC环境中,对集群中的日志的定期检查是必不可少的.通过查看集群日志,可以早期定位集群环境中出现的问题,以便将问题消灭在萌芽状态.简单介绍一下有关Oracle集群环境中日志的结构,方便 ...

  9. 集群环境下定时调度的解决方案之Quartz集群

    集群环境下定时调度的解决方案之Quartz集群 参考文章: (1)集群环境下定时调度的解决方案之Quartz集群 (2)https://www.cnblogs.com/yinfengjiujian/p ...

最新文章

  1. 测试Animation大型动画文件拆分播放的可行性
  2. 微型计算机中PRON是,英语词性英语中的pron指的是什么词性?? – 手机爱问
  3. 关于网络连接方式的总结(HostOnly,NAT....)
  4. 开发日记-20190806 关键词 读书笔记《Linux 系统管理技术手册(第二版)》DAY 20
  5. html登录界面设计代码_.NET 5 开发WPF - 美食应用登录UI设计
  6. 递增子序列 Increasing Subsequences
  7. 线程池框架-Executor
  8. 研究员公开Razer 0day,插入鼠标即可获得Windows管理员权限
  9. ryzen cpu 用啥linux,AMD Ryzen锐龙处理器配什么主板?AMD 锐龙Ryzen CPU搭配主板技巧...
  10. CSDN学习会员组团
  11. 从大数据的角度看 房价一定会下跌
  12. 【Usaco2008 Mar】土地购买
  13. 在Linux上恢复误删除的文件或目录
  14. C3P0jar包下载方法
  15. 【第8章】Java常用核心类
  16. 中国十大基金公司排行榜
  17. YUV420P视频裁剪
  18. 计算机视觉之图像增广(翻转、随机裁剪、颜色变化[亮度、对比度、饱和度、色调])
  19. php 网站访问统计插件,帝国CMS教程_网站访问统计插件使用教程_好特教程
  20. 用c语言编写的打字母游戏,用C语言编写小游戏——“井字棋”

热门文章

  1. Asp.Net+Jquery.Ajax详解5-$.getScript
  2. C#操作Excel文件暨C#实现在Excel中将连续多列相同数据项合并
  3. 用SharpZipLib来压缩和解压文件 --zt
  4. 定量库存控制模型_探索全面流动管理TFM 库存控制与低减的理性策略
  5. 哪个app最费电_微波炉和烤箱,买哪个划算?
  6. 如何在Microsoft Excel中将文本转换为日期值
  7. 保存页面供以后使用Firefox的阅读列表扩展
  8. Sublime text3配置xdebug调试记录
  9. AWD-LSTM为什么这么棒?
  10. jsp 连接access数据库