专栏首页圣杰的专栏集群环境下,你不得不注意的ASP.NET Core Data Protection 机制

集群环境下,你不得不注意的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 机制引起的。

Data Protection 机制

对于Data Protection机制,晓东大大已经有系列文章详述了,我这里就不再过多赘述,只简单总结一下。

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;
    }
   );
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • ASP.NET Core 数据加解密的一些坑

    ASP.NET Core 给我们提供了自带的Data Protection机制,用于敏感数据加解密,带来方便的同时也有一些限制可能引发问题,这几天我就被狠狠爆了...

    Edi Wang
  • .NET Core实战项目之CMS 第十四章 开发篇-防止跨站请求伪造(XSRF/CSRF)攻击处理

    通过 ASP.NET Core,开发者可轻松配置和管理其应用的安全性。 ASP.NET Core 中包含管理身份验证、授权、数据保护、SSL 强制、应用机密、请...

    依乐祝
  • .NET Core微服务之基于Consul实现服务治理

      Consul是HashiCorp公司推出的开源工具,用于实现分布式系统的服务发现与配置。与其他分布式服务注册与发现的方案,比如 Airbnb的SmartSt...

    Edison Zhou
  • 使用cookie来做身份认证

    这里先讲一下Authentication和Authorization两个词的区别。

    _淡定_
  • ASP.NET Core on K8S学习初探(1)K8S单节点环境搭建

    当近期的一个App上线后,发现目前的docker实例(应用服务BFF+中台服务+工具服务)已经很多了,而我司目前没有专业的运维人员,发现运维的成本逐渐开始上来,...

    梁规晓
  • Docker最全教程——从理论到实战(二)

    Docker 正在逐渐成为容器行业的事实标准,受到 Windows 和 Linux 生态系统领域最重要供应商的支持。 (Microsoft 是支持 Docker...

    心莱科技雪雁
  • ASP.NET Core on K8S学习初探(1)

    当近期的一个App上线后,发现目前的docker实例(应用服务BFF+中台服务+工具服务)已经越来越多了,而我司目前没有专业的运维人员,发现运维的成本逐渐开始上...

    心莱科技雪雁
  • ASP.NET Core on K8S学习初探(1)K8S单节点环境搭建

    当近期的一个App上线后,发现目前的docker实例(应用服务BFF+中台服务+工具服务)已经很多了,而我司目前没有专业的运维人员,发现运维的成本逐渐开始上来,...

    Edison Zhou
  • ASP.NET Core 1.1 简介

    ASP.NET Core 1.1 于2016年11月16日发布。这个版本包括许多伟大的新功能以及许多错误修复和一般的增强。这个版本包含了多个新的中间件组件、针对...

    张善友
  • .NET 基金会项目介绍-IdentityManager

    IdentityManager 是属于 .Net 基金会的一个项目,本文将简要介绍该项目相关的信息。

    newbe36524
  • 一个适合.NET Core的代码安全分析工具 - Security Code Scan

      本文主要翻译自Security Code Scan的官方Github文档,结合自己的初步使用简单介绍一下这款工具,大家可以结合自己团队的情况参考使用。此外,...

    Edison Zhou
  • 在ASP.NET CORE 2.0使用SignalR技术

    上次讲SignalR还是在《在ASP.NET Core下使用SignalR技术》文章中提到,ASP.NET Core 1.x.x 版本发布中并没有包含Signa...

    yoyofx
  • .NET 基金会项目介绍-ASP.NET Core

    ASP.NET Core 是属于 .Net 基金会的一个项目,本文将简要介绍该项目相关的信息。

    newbe36524
  • 使用分布式缓存对ASP.Net Core性能提升?

    程序你好
  • .NET 基金会项目介绍-WorldWide Telescope

    WorldWide Telescope 是属于 .Net 基金会的一个项目,本文将简要介绍该项目相关的信息。

    newbe36524
  • ASP.NET Core on K8S学习初探(2)K8S基本概念快速一览

    在上一篇《单节点环境搭建》中,通过Docker for Windows在Windows开发机中搭建了一个单节点的K8S环境,接下来就是动人心弦的部署ASP.NE...

    梁规晓
  • .NET Core实战项目之CMS 第二章 入门篇-快速入门ASP.NET Core看这篇就够了

    很多朋友看到.NET Core就认为是ASP.NET Core,其实这是有误区的,因为.NET Core 是开放源代码的通用开发平台 (是一个“平台”),基于这...

    依乐祝
  • ASP.NET Core2.1 你不得不了解的GDPR(Cookie处理)

    ...然后就碰到问题了... 我发现..cookie竟然存不进去了..(怨念+100)

    GuZhenYin
  • Docker最全教程——从理论到实战(二)

    Docker 正在逐渐成为容器行业的事实标准,受到 Windows 和 Linux 生态系统领域最重要供应商的支持。 (Microsoft 是支持 Docker...

    雪雁-心莱科技

扫码关注云+社区

领取腾讯云代金券