IAuthorizationFilter удаляет куки - PullRequest
0 голосов
/ 05 ноября 2018

У меня есть проект MVC, в котором пользователь может изменить язык из меню. Код контроллера:

[HttpGet]
public ActionResult ChangeLanguage(string Language)
{
    Response.Cookies[SessionParams.LANGUAGE].Value = Language;
    Response.Cookies[SessionParams.LANGUAGE].Expires = DateTime.Now.AddDays(7);

    return Redirect(Request.UrlReferrer.PathAndQuery);
}

и код Global.asax.cs:

protected void Application_BeginRequest(Object sender, EventArgs e)
{
    if (Request.Cookies[SessionParams.LANGUAGE] != null)
    {
         Thread.CurrentThread.CurrentUICulture = new CultureInfo(Request.Cookies[SessionParams.LANGUAGE].Value);
    }
}

Это прекрасно работает. Теперь я добавил класс, который реализует IAuthorizationFilter, чтобы убедиться, что я могу проверить, является ли сеанс все еще действительным перед каждым запросом (FilterConfig.cs):

public class ConnectedUserValidAuthorizationFilter : IAuthorizationFilter
{
    public void OnAuthorization(AuthorizationContext filterContext)
    {
        UrlHelper urlHelper = new UrlHelper(filterContext.HttpContext.Request.RequestContext);
        string loginUrl = urlHelper.Action("Login", "Account");
        if (filterContext.HttpContext.Request.Url.AbsolutePath != loginUrl)
        {
            if (filterContext.HttpContext.Session[SessionParams.CONNECTED_USER] == null)
                filterContext.HttpContext.Response.Redirect("~");
        }
    }
}

Почему-то после того, как я добавляю фильтр к глобальным фильтрам:

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
    filters.Add(new HandleErrorAttribute());
    filters.Add(new ConnectedUserValidAuthorizationFilter());
}

Отладка показывает, что Request.Cookies в Global.asax.cs больше не содержит значение для language cookie.

Снятие фильтра возвращает значение.

Есть идеи, как это решить? Я попытался переместить код фильтра на Application_BeginRequest, но в этом контексте сеанс еще не существует.

1 Ответ

0 голосов
/ 07 ноября 2018

Я реализовал IActionFilter вместо IAuthorizationFilter интерфейса, с той же логикой, что и в OnAuthorization, внутри OnActionExecuting функции.

Это кажется более подходящим для задачи, поскольку OnActionExecuting вызывается перед каждым запросом действия. Кроме того, кажется, что куки не повреждены.

...