【发布时间】:2018-11-05 07:37:20
【问题描述】:
我有一个 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());
}
调试显示 Global.asax.cs 中的 Request.Cookies 不再具有 language cookie 的值。
删除过滤器会恢复值。
知道如何解决吗?我尝试将过滤器代码移至Application_BeginRequest,但该上下文中尚不存在会话。
【问题讨论】:
标签: c# model-view-controller iauthorizationfilter