防止会话超时重置为定期 ajax 调用

问题描述

在我的 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 扩展方法,并提供您自己的实现来注册您的自定义中间件。