2010-08-04 84 views
2

考虑下面的代码:在操作之前或之后执行ASP.Net MVC控制器属性吗?

[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()); 
    } 
} 

回答

4

你是正确的,属性之前执行有问题的行动,所以[Authenticate]应该肯定首先执行,如果用户未经过身份验证,Action代码从不会执行,直到用户重定向后进行身份验证并重定向回此操作。

编辑基于评论:MVC框架OnAuthorizatrion方法(来源here)不重定向,但设置filterContext.Result到`HttpUnauthorizedResult()”(这只是设置一个401个状态码)。该结果导致认证模块将用户重定向到登录页面。假设您的自定义实现的其余部分是标准的(未覆盖或调用基方法)更改此

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

本(或类似的,只要你的结果集的东西)

filterContext.Result = new HttpUnauthorizedResult(); 

应该做到这一点,至少让你更进一步。

+0

从我看到的行动实际上是执行重定向后发生。我在想这可能是因为所有的重定向都是在响应对象上设置响应代码。它实际上并没有停止执行动作的MVC ...我需要进一步研究,但这是目前的想法... – 2010-08-04 00:28:44

+1

可能。查看AuthorizationAttribute的源代码:http://aspnet.codeplex.com/SourceControl/changeset/view/55373#266447 看起来你可能试着用'filterContext.Result = new HttpUnauthorizedResult();'替换重定向'' – 2010-08-04 00:47:04

+1

我实际上尝试添加我的评论后尝试设置filterContext.Result。当然,它现在按预期工作。所以我猜MVC实际上会继续执行Action,除非你在Authorize属性中设置它。请参阅原始帖子中的修改。 – 2010-08-04 00:48:56

相关问题