1

我有一个 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 方法在操作执行之前触发,但重定向发生在我的家庭控制器中的操作方法之后。因为会话变量为空,所以我在索引操作中遇到错误。我怎样才能解决这个问题?

4

1 回答 1

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;
        }
    }
}

此外,为此目的编写授权过滤器并依赖内置的表单身份验证在语义上更正确,而不是使用 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

于 2013-09-22T14:45:43.917 回答