是否可以在自定义的AuthorizeAttribute类中使用RedirectToAction()?
使用ASP.Net MVC 2,有没有什么办法在基于AuthorizeAttribute
类的类中使用Controller类的RedirectToAction()方法?是否可以在自定义的AuthorizeAttribute类中使用RedirectToAction()?
public class CustomAttribute : AuthorizeAttribute {
protected override bool AuthorizeCore(HttpContextBase context) {
// Custom authentication goes here
return false;
}
public override void OnAuthorization(AuthorizationContext context) {
base.OnAuthorization(context);
// This would be my ideal result
context.Result = RedirectToAction("Action", "Controller");
}
}
我正在寻找一种方式来重新将用户引导到一个特定的控制器/行动时,他们失败的验证,而不是将其返回到登录页面。是否有可能为该控制器/操作生成重定向URL,然后使用RedirectResult()?我试图避免对网址进行硬编码的诱惑。
您可以/应该覆盖HandleUnauthorizedRequest
而不是OnAuthorization
。下面是默认的实现:
protected virtual void HandleUnauthorizedRequest(AuthorizationContext filterContext) {
// Returns HTTP 401 - see comment in HttpUnauthorizedResult.cs.
filterContext.Result = new HttpUnauthorizedResult();
}
不能使用Controller.RedirectToAction
,但你可以返回新RedirectToRouteResult
。
所以,你可以这样做:
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) {
// Returns HTTP 401 - see comment in HttpUnauthorizedResult.cs.
filterContext.Result = new RedirectToRouteResult(
new RouteValueDictionary
{
{ "action", "ActionName" },
{ "controller", "ControllerName" }
});
}
你可以做这样的事情:
var routeValues = new RouteValueDictionary();
routeValues["controller"] = "ControllerName";
routeValues["action"] = "ActionName";
//Other route values if needed.
context.Result = new RedirectToRouteResult(routeValues);
这是该框架做它,当你调用“RedirectToAction()”在你的控制器的方式。
万一别人很关心这个问题。 这可以通过更简单的方式来解决(在使用MVC 3至少,不知道MVC 2):
只需创建您的自定义AuthorizeAttribute一个小型的私人控制器:
private class RedirectController : Controller
{
public ActionResult RedirectWhereever()
{
return RedirectToAction("Action", "Controller");
}
}
这很容易用于你的HandleUnauthorizedRequest方法(见Craigs答案):
filterContext.Result = (new RedirectController()).RedirectWhereever();
'RedirectToAction'返回'RedirectToRouteResult',没有必要创建一个控制器来返回一个,就像@Craig Stuntz的回答 – 2013-06-08 18:07:58
谢谢,这是有效的。使用HandleUnauthorizedRequest的好处 - 我使用的是OnAuthorization,因为我在另一个教程/讨论中看到它(他们有一个自定义属性,当认证失败时会触发重定向)。 – 2010-03-18 20:15:08
@LanceMcNearney我会在参数filterContext中传递什么? – Pomster 2013-07-12 09:51:18
@Craig Stuntz我作为filterContext传入什么? – Pomster 2013-07-12 09:53:26