ASP.NET MVC4 ActionFilters

时间:2013-09-22 14:42:53

标签: c# asp.net-mvc-4 action-filter

我有一个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,所以我在索引操作中出错。我该如何解决这个问题?

1 个答案:

答案 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