37

集群环境下,你不得不注意的ASP.NET Core Data Protection 机制

 4 years ago
source link: https://www.tuicool.com/articles/MJz2iaA
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

引言

最近线上环境遇到一个问题,就是ASP.NET Core Web应用在单个容器使用正常,扩展多个容器无法访问的问题。查看容器日志,发现以下异常:

通过排查,发现了是由于 [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。

b2Q7ryq.jpg!web


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK