考虑下面的代码:在操作之前或之后执行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());
}
}
从我看到的行动实际上是执行重定向后发生。我在想这可能是因为所有的重定向都是在响应对象上设置响应代码。它实际上并没有停止执行动作的MVC ...我需要进一步研究,但这是目前的想法... – 2010-08-04 00:28:44
可能。查看AuthorizationAttribute的源代码:http://aspnet.codeplex.com/SourceControl/changeset/view/55373#266447 看起来你可能试着用'filterContext.Result = new HttpUnauthorizedResult();'替换重定向'' – 2010-08-04 00:47:04
我实际上尝试添加我的评论后尝试设置filterContext.Result。当然,它现在按预期工作。所以我猜MVC实际上会继续执行Action,除非你在Authorize属性中设置它。请参阅原始帖子中的修改。 – 2010-08-04 00:48:56