我有一个ASP.NET MVC4应用程序。我创建了一个登录页面。如果用户登录系统,我会将用户的信息注册到会话中。我添加了一个过滤器来检查会话变量。如果用户没有登录系统,我想将用户重定向到我的登录控制器。
public class SecurityAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (filterContext.HttpContext.Session["User"] == null)
{
filterContext.HttpContext.Response.RedirectToRoute("Default", new
{
controller = "Login",
action = "DoLogin",
returnUrl = filterContext.HttpContext.Request.Url.AbsoluteUri
});
}
base.OnActionExecuting(filterContext);
}
}
我在控制器级别使用此属性。
[SecurityAttribute]
public class HomeController : Controller
{
public ActionResult Index()
{
ViewData["Name"] = ((UserEntity)Session["User"]).Name;
ViewData["Surname"] = ((UserEntity)Session["User"]).Surname;
return View();
}
}
OnActionExecuting方法在执行操作之前触发,但是在我的home控制器中的action方法之后重定向。因为会话变量为null,所以我在索引操作中出错。我该如何解决这个问题?
答案 0 :(得分:2)
如果要短路执行控制器操作,则应在Result
上分配filterContext
属性。就像那样:
public class SecurityAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (filterContext.HttpContext.Session["User"] == null)
{
var values = new
{
controller = "Login",
action = "DoLogin",
returnUrl = filterContext.HttpContext.Request.Url.AbsoluteUri
};
var result = new RedirectToRouteResult("Default", new RouteValueDictionary(values));
filterContext.Result = result;
}
}
}
此外,为此目的编写授权过滤器并依赖于内置的Forms身份验证而不是使用Session和东西重新创建轮子在语义上更为正确。
如此简单:
[Authorize]
public class HomeController : Controller
{
public ActionResult Index()
{
string username = User.Identity.Name;
SomeUserModel user = GetUserFromBackend(username);
return View(user);
}
}
您可以在MSDN上阅读有关表单身份验证的更多信息:http://msdn.microsoft.com/en-us/library/ff647070.aspx