ASP.Net MVC Controller属性是在Action之前还是之后执行的?

时间:2010-08-04 00:00:59

标签: asp.net-mvc attributes redirect

请考虑以下代码:

    [Authenticate(Order = 1)]
    public ActionResult SomeActionThatRequiresAuthentication()
    { 
        var model = new SomeViewModel(); 
        // Do something with an authenticated session/user...
        return View(model);
    }

Authenticate属性是在SomeActionThatRequiresAuthentication方法中的代码执行之前或之后发生的吗?

我问这个是因为我有一个属性做这样的事情:

    public class Authenticate : CustomAuthorizeAttribute
{
    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        if (!UserService.IsAuthenticated && !HttpContext.Current.Response.IsRequestBeingRedirected)
            HttpContext.Current.Response.Redirect(ViewUtil.Actions.User.LogOnUrl());
    }
}

如您所见,如果用户未经过身份验证,该属性将重定向用户。但是,似乎重定向仅在动作执行后发生。这导致了问题,因为我假设用户在执行操作时已经过身份验证。首先,我需要了解属性是否应该在执行操作之前或之后发生,还是我认为工作流完全错误?

谢谢,保罗


在研究了这一点后,很明显必须设置filterContext.Result才能使其正常工作。在我的“授权”属性进行少量更改后,它现在正在运行:

    public class Authenticate : CustomAuthorizeAttribute
{
    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        if (!UserService.IsAuthenticated && !HttpContext.Current.Response.IsRequestBeingRedirected)
            filterContext.Result = new RedirectResult(ViewUtil.Actions.User.LogOnUrl());
    }
}

1 个答案:

答案 0 :(得分:4)

你是对的,属性在之前执行,所以[Authenticate]应该首先执行,如果用户未经过身份验证,则Action代码永远不会执行用户被重定向,进行身份验证并重定向回此操作。

根据评论进行编辑:MVC框架OnAuthorizatrion方法(来源here)不会重定向,但会将filterContext.Result设置为`HttpUnauthorizedResult()' (它只设置401状态代码)。该结果导致身份验证模块将用户重定向到登录页面。假设您的自定义实现的其余部分是标准的(不覆盖或调用基本方法)更改此

HttpContext.Current.Response.Redirect(ViewUtil.Actions.User.LogOnUrl()); 

到此(或类似的东西,只要你设置结果)

filterContext.Result = new HttpUnauthorizedResult();

应该做的伎俩,至少让你的进一步发展。