.net core 开车记:Data Protection Key 过期问题与登录页面访问慢
K8s 船还没修好,.net core 车又出了问题,开着 k8s 豪华邮轮、飚着 .net core 极品飞车的好事真是多磨。
自从我们用上 .net core ,就一直被 .net core 的一个慢性病所折磨,这个病叫 Data Protection Key 新陈代谢综合症,通常3-6个月发作一次。发作时的症状是新登录用户在登录后依然是未登录状态。病因是 Data Protection Key 默认3个月刷新一次,在这个刷新的新陈代谢阶段,新旧 key 并存,新的登录 cookie 用新的 key 进行加密/解密,旧的登录 cookie 用旧的 key 解密,但有时某种未知情况会造成新陈代谢时出现功能性紊乱,新 key 加密的 cookie 却用旧 key 解密失败,造成解密失败,登录 cookie 失效。
昨天下班的时候这个新陈代谢综合症又发作了,幸好我们及时发现,立即采取急救措施,重启所有应用恢复了正常。在急救时,我们犯了一个错,忘了重启了文件上传应用,结果造成一段时间无法上传图片。
Keys have a 90-day lifetime by default. When a key expires, the app automatically generates a new key and sets the new key as the active key. As long as retired keys remain on the system, your app can decrypt any data protected with them. (From docs.microsoft.com)
新陈代谢综合症急救好之后,开车没多久,昨天晚上又出现了新的病情,用户登录站点突发急性消化不良症,访问登录页面响应速度很慢。排查后发现大量 http get 请求涌向登录页面,对应容器的 CPU 占用一直 150% 左右(平时不到 20%)。虽然源于大量请求,但是让人想不通的是这个登录页面只是显示一下 mvc 视图,没有耗资源的操作,没有任何数据库访问操作,即使这么大请求也应该能撑住。尝试给登录页面加上 ResponseCache ,问题依旧。尝试启动更多容器处理请求,问题依旧。
进一步排查中发现这个突发急性症状起源于一篇博文被设置为登录后才能访问,大量访问这篇博文的请求都跳转到了登录页面(这些请求本身也比较异常,可能是机器请求),于是在登录页面的 mvc action 中屏蔽这些请求,但病情没有丝毫改善,这时可以确认性能瓶颈不在 mvc action 。
知道药用错地方后,立即跳出当前 mvc action ,放眼整个请求处理管线上的那些 middeware 。望着日志中不断出现的大量错误,一个 middlware 立马映入眼帘,它就是用于给 serilog 日志提供更多上下文信息的 LogEnrichmentMiddleware ,在这个 middleware 中加上屏蔽异常请求的代码后立马药到病除,急性消化不良症就这样完成了急救。
public class LogEnrichmentMiddleware
{
private static readonly ILogger Logger = Log.ForContext<LogEnrichmentMiddleware>();
private readonly RequestDelegate _next; public LogEnrichmentMiddleware(RequestDelegate next)
{
_next = next;
} public async Task Invoke(HttpContext httpContext)
{
// 屏蔽异常请求
if (httpContext.Request.Query.TryGetValue("returnUrl", out var returnUrl) &&
WebUtility.UrlDecode(returnUrl) == "***")
{
httpContext.Response.StatusCode = StatusCodes.Status404NotFound;
return;
} var properties = new ILogEventEnricher[]
{
new PropertyEnricher("RequestUrl", httpContext.Request.GetDisplayUrl()),
new PropertyEnricher("RequestMethod", httpContext.Request.Method),
new PropertyEnricher("UserAgent", httpContext.Request.Headers[HeaderNames.UserAgent].ToString()),
new PropertyEnricher("Ip", httpContext.Connection.RemoteIpAddress.ToString())
}; using (LogContext.Push(properties))
{
await _next(httpContext); var statusCode = httpContext.Response.StatusCode;
if (statusCode >= 400 && statusCode != 404)
Logger.Warning("Unsuccessful response {StatusCode}", httpContext.Response.StatusCode);
}
}
}
抱歉,这2个问题给您带来麻烦了,请您谅解。我们会进一步分析病因,争取根治这2个病症,让 .net core 这辆车飚得更稳。
.net core 开车记:Data Protection Key 过期问题与登录页面访问慢的更多相关文章
- ASP.NET Core 数据保护(Data Protection)【上】
前言 上一篇博客记录了如何在 Kestrel 中使用 HTTPS(SSL), 也是我们目前项目中实际使用到的. 数据安全往往是开发人员很容易忽略的一个部分,包括我自己.近两年业内也出现了很多因为安全问 ...
- ASP.NET Core 数据保护(Data Protection 集群场景)【下】
前言 接[中篇],在有一些场景下,我们需要对 ASP.NET Core 的加密方法进行扩展,来适应我们的需求,这个时候就需要使用到了一些 Core 提供的高级的功能. 本文还列举了在集群场景下,有时候 ...
- ASP.NET Core 数据保护(Data Protection)【中】
前言 上篇主要是对 ASP.NET Core 的 Data Protection 做了一个简单的介绍,本篇主要是介绍一下API及使用方法. API 接口 ASP.NET Core Data Prote ...
- Asp.net core 学习笔记 ( Data protection )
参考 : http://www.cnblogs.com/xishuai/p/aspnet-5-identity-part-one.html http://cnblogs.com/xishuai/p/a ...
- 集群环境下,你不得不注意的ASP.NET Core Data Protection 机制
引言 最近线上环境遇到一个问题,就是ASP.NET Core Web应用在单个容器使用正常,扩展多个容器无法访问的问题.查看容器日志,发现以下异常: System.Security.Cryptogra ...
- Data Protection - how to manage expired key?(转载)
问 According to ASP.NET Key Management: Deleting a key is truly destructive behavior, and consequentl ...
- ajax前置处理实现异步请求session过期时跳转登录页面
第一篇博文,mark一下zhq[0]. 问题描述:用户页面,当session过期或都session注销后,普通页面后端都会有过滤器,session过期Redirect到登录页面,但是ajax请求后端只 ...
- 如果后台用framset框架布局,session过期,整个跳出回 登录页面的方法
如果session过期了,登录页面会在framset框架的右边显示,只能用 js 来做,让整个框架跳出去: 然而,这里 js 必须要用“top”才可以,作用是让整个framset都跳转,直接用 win ...
- 基于ASP.NET Core Data Protection生成验证token
ASP.NET Core Data Protection 不仅提供了非对称加密能力,而且提供了灵活的秘钥存储方式以及一致的加解密接口(Protect与Unprotect).Session中用到了它,C ...
随机推荐
- a span做成按钮时,文字不被选中样式
HTML: <a class="button"></a> <span class="button"></span> ...
- Element-ui学习笔记3--Form表单(三)
InputNumber <el-input-number v-model="num" @change="handleChange" :min=" ...
- redux【react】
首先介绍一下redux就是Flux的一种进阶实现.它是一个应用数据流框架,主要作用应用状态的管理 一.设计思想: (1).web应用就是一个状态机,视图和状态一一对应 (2).所有的状态保存在一个对象 ...
- Python 3.7.0 For Mac版软件安装教程附下载地址
https://www.jianshu.com/p/f02d6f01eba7
- RBF神经网络的matlab简单实现
径向基神经网络 1.径向基函数 (Radial Basis Function,RBF) 神经网络是一种性能良好的前向网络,具有最佳逼近.训练简洁.学习收敛速度快以及克服局部最小值问题的性能,目前已经证 ...
- Python--day47--mysql索引类型介绍
组合索引(联合索引)详讲:组合索引相对索引合并的缺点是 覆盖索引和索引合并不是真实的索引,只是名词: 命中索引,要避免使用哪些:id.nid是主键 email,num()是索引 1,避免使用like ...
- H3C 显示OSPF邻居信息
- Ubuntu 19.04安装phpipam软件
1ftp下载xampp2安装xampp chmod 777sudo ./xampp.run3,ftp phpipam.tar.gz 解压 ./opt/lampp/www/phpipam/cp conf ...
- Notice: Use of undefined constant - assumed ' '
昨天看手册的时候有两个范例,懒得写了,直接复制,测试一下,结果报Notice; 反复检查无果,最后, 手动敲了一遍,居然正常了,汗.... 总结:偷懒害人
- TOJ 6121: 学长的情书 ( 二分)
传送门: 点我 6121: 学长的情书 时间限制(普通/Java):2000MS/6000MS 内存限制:65536KByte总提交: 79 测试通过:2 描述 抹布收 ...