问题描述
在我的 ASP.NET MVC 应用程序中,有一个定期的 ajax 调用来获取当前用户的新通知。但是,此调用会重置当前会话的空闲超时,从而导致会话永不过期。这是一个安全风险。如何防止某些端点调用重置空闲超时?
解决方法
ASP NET Core 中的会话状态由 SessionMiddleware
维护,它的设计非常简单。我将省略加载会话的起始部分,您对下一个中间件调用以这种方式包装的部分感兴趣。
try
{
await _next(context); //Here are all other middlewares executed
}
finally
{
context.Features.Set<ISessionFeature>(null);
if (feature.Session != null)
{
try
{
await feature.Session.CommitAsync(); //Here your session is commited and prolongated
}
catch (OperationCanceledException)
{
_logger.SessionCommitCanceled();
}
catch (Exception ex)
{
_logger.ErrorClosingTheSession(ex);
}
}
}
因此,如果您以只读方式访问会话,则无法在访问定期端点时提交它,您可以从 HttpContext context
中找出。如果您阻止执行提交会话的代码块,它不会将新条目放入 IDistributedCache
更新其滑动过期并且会话将保持不变。
您还必须编写 SessionMiddlewareExtensions
类的类似物,其中定义了 UseSession
扩展方法,并提供您自己的实现来注册您的自定义中间件。