Перенаправить на страницу входа в систему, если срок сеанса истек в ядре сети ASP MVC

Я работаю в приложении MVC ASP net core. Моя цель - перенаправить на страницу входа в систему, если срок сеанса истек. В моем случае я использую несколько вызовов ajax для загрузки страницы. Иногда перенаправление выполняется правильно, а иногда нет.

 public class CheckSessionIsAvailable : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        base.OnActionExecuting(filterContext);

        if (filterContext.HttpContext == null || filterContext.HttpContext.Session.GetString("UserID") == null)
        {
            //return RedirectToAction("Index", "Login");

            filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new
            {
                controller = "Login",
                action = "Index"
            }));
        }
    }
}

Создал фильтр действий CheckSessionIsAvailable и связал его со всеми контроллерами.

[CheckSessionIsAvailable]
public class TestController : Controller
{

    public IActionResult Index()
    {
        return View();
    }
}

Я что-то делаю неправильно при создании фильтра действий?


person Yuvaraj T    schedule 02.06.2020    source источник


Ответы (1)


Вы можете добиться этого, используя OnActionExecuting метод IActionFilter, переопределив его в нашем пользовательском классе.

Сначала добавьте его в сервисы:

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

Затем создайте собственный класс 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)
    {
    }
}
person Sonu K    schedule 08.02.2021
comment
Как передать объект класса IHttpContextAccessor из контроллера в фильтр действий, применяя его ко всему контроллеру? Не могли бы вы также показать часть контроллера. - person Sidso; 04.03.2021
comment
Если вы зарегистрируете фильтр в сервисах, вам не нужно явно применять его к каждому контроллеру. services.AddControllersWithViews (options = ›{options.Filters.Add (typeof (RequestAuthenticationFilter));}); - person Sonu K; 09.05.2021