IAuthorizationFilter删除cookie

时间:2018-11-05 07:37:21

标签: c# model-view-controller iauthorizationfilter

我有一个MVC项目i,用户可以从菜单中更改语言。 控制器代码:

[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());
}

调试显示,Global.asax.cs中的Request.Cookies不再拥有language cookie的值。

删除过滤器会使值返回。

任何想法如何解决?我尝试将过滤器代码移至Application_BeginRequest,但是该会话在该上下文中尚不存在。

1 个答案:

答案 0 :(得分:0)

我最终在IActionFilter函数内部实现了IAuthorizationFilter而不是OnAuthorization接口,并且使用了OnActionExecuting中使用的相同逻辑。

这似乎更适合该任务,因为在每个Action请求之前调用OnActionExecuting。似乎也可以使cookie保持完整。