.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 ...
随机推荐
- JS遍历数组
for 如果用var会造成变量声明提前等问题for(var i = 1; i <= arr.length; i++){ console.log(arr[i - 1]);} for(let i = ...
- 创建JAVASCRIPT对象3种方法
创建JAVASCRIPT对象3种方法 方法一:直接定义并创建对象实例 var obj = new Object(); //创建对象实例 //添加属性obj.num = 5; //添加属性 o ...
- spring boot与activiti集成实战 转
为什么80%的码农都做不了架构师?>>> 这是原作者的博客地址 http://wiselyman.iteye.com/blog/2285223 代码格式混乱,我修正了一下.项目源码在 ...
- 【CSS3】精美横向滚动菜单按钮
废话不多说,直接上图: 然后是代码: <!DOCTYPE html> <html> <head> <meta charset="utf-8" ...
- H3C 虚拟模板方式配置PPP MP
- Spring Data JPA查询指定列,并返回实体(改)
现有PostEntiy实力,包含各种属性,如: /** * @Auther: DingShuo * @Date: 2018/7/18 11:09 * @Description: */ @Entity ...
- C# 配置文件存储 各种序列化算法性能比较
本文比较多个方式进行配置文件的存储,对比各个不同算法的读写性能. 在应用软件启动的时候,需要读取配置文件,但是启动的性能很重要,所以需要有一个很快的读取配置文件的方法. 如果你不想看过程,那么请看拖动 ...
- JDBC 时间处理
Java中用类java.util.Date对日期/时间做了封装,此类提供了对年.月.日.时.分.秒.毫秒以及时区的控制方法,同时也提供一些工具方法,比如日期/时间的比较,前后判断等. java.uti ...
- 【a403】遍历树问题
Time Limit: 1 second Memory Limit: 32 MB [问题描述] 我们都很熟悉二叉树的前序.中序.后序遍历,在数据结构中常提出这样的问题:已知一棵二叉树的前序和中序遍历, ...
- 为什么有的文件从SVN上更新不下来
前几天使用eclipse的插件从SVN上更新代码,将全部的代码更新下来后启动项目,前台报错说有些js文件找不到,后来检查我的工程里确实没有那些文件,经过检查发现SVN上却有这些文件,那为什么更新不下来 ...