请考虑以下代码:
[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());
}
}
答案 0 :(得分:4)
你是对的,属性在之前执行,所以[Authenticate]
应该首先执行,如果用户未经过身份验证,则Action代码永远不会执行用户被重定向,进行身份验证并重定向回此操作。
根据评论进行编辑:MVC框架OnAuthorizatrion
方法(来源here)不会重定向,但会将filterContext.Result设置为`HttpUnauthorizedResult()' (它只设置401状态代码)。该结果导致身份验证模块将用户重定向到登录页面。假设您的自定义实现的其余部分是标准的(不覆盖或调用基本方法)更改此
HttpContext.Current.Response.Redirect(ViewUtil.Actions.User.LogOnUrl());
到此(或类似的东西,只要你设置结果)
filterContext.Result = new HttpUnauthorizedResult();
应该做的伎俩,至少让你的进一步发展。