繁体   English   中英

ASP.NET 核心:session 过期,但用户未重定向到登录页面

[英]ASP.NET Core: session expires but user is not redirected to login page

这是我第一次使用 .net 内核,所以也许我做错了什么。 我的应用程序在 session 过期后没有重定向到登录页面,显然在我尝试读取 session 变量时导致Null Pointer Exceptions

启动.cs

services.AddAuthentication()
   .AddCookie(options =>
   {
      options.Cookie.Expiration = TimeSpan.FromMinutes(180);
   });

services.AddSession(options => {
                options.IdleTimeout = TimeSpan.FromMinutes(180);
   });

我错过了什么吗?

更新:

如果我手动删除 .AspNetCore.Identity.Application cookie,我将被正确重定向到登录页面。

在此处输入图像描述

我怎样才能获得这种行为?

您可以通过在我们的自定义 class 中重新定义IActionFilterOnActionExecuting方法来实现此目的。

首先将其添加到服务中:

services.AddControllersWithViews(options =>
{
    options.Filters.Add(typeof(RequestAuthenticationFilter));
});

然后创建一个自定义的 class RequestAuthenticationFilter并定义OnActionExecuting方法。

public class RequestAuthenticationFilter : IActionFilter
{
    private readonly IHttpContextAccessor _httpContextAccessor;
    public RequestAuthenticationFilter(IHttpContextAccessor httpContextAccessor)
    {
        _httpContextAccessor = httpContextAccessor;
    }

    /// <summary>
    /// OnActionExecuting
    /// </summary>
    /// <param name="context"></param>
    public void OnActionExecuting(ActionExecutingContext context)
    {
        var session = _httpContextAccessor.HttpContext.Session.Get("UserId");
        if (session == null)
        {
            context.Result = new RedirectToRouteResult(new RouteValueDictionary(new { action = "Login", controller = "Account", area = "Identity" }));
        }
    }

    /// <summary>
    /// OnActionExecuted
    /// </summary>
    /// <param name="context"></param>
    public void OnActionExecuted(ActionExecutedContext context)
    {
    }
}

Sonu K 的回答中获取线索,我创建了一个属性,因此我可以将其应用于特定的 controller 或操作。 这是我的实现。

public class ValidateSessionAttribute : ActionFilterAttribute
{
    public ValidateSessionAttribute() { }

    public override void OnActionExecuting(ActionExecutingContext context)
    {
        var userId = context.HttpContext.Session.Get<long>(Constants.SessionKeys.UserId);

        if (userId <= 0)
            context.Result =
                new RedirectToRouteResult(
                    new RouteValueDictionary(new { action = "Login", controller = "Account" }));
    }
}

使用上述属性装饰 controller 以开始使用它。

[ValidateSession]
public class SomeController : Controller
{
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM