IAuthorizationFilter удаляет файлы cookie

У меня есть проект 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 больше не содержит значение для файла cookie language.

Удаление фильтра возвращает значение.

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


person Derorrist    schedule 05.11.2018    source источник


Ответы (1)


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

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

person Derorrist    schedule 07.11.2018