是否可以在自定义的AuthorizeAttribute类中使用RedirectToAction()?

使用ASP.Net MVC 2,是否有任何方法来使用基于AuthorizeAttribute类的类内的Controller类的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"); } } 

我正在寻找一种方式来重新引导用户到特定的控制器/操作时,他们authentication失败,而不是返回到login页面。 是否有可能为该控制器/操作生成redirect URL,然后使用RedirectResult() ? 我试图避免对url进行硬编码的诱惑。

你可以/应该重写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()”时,框架就是这样做的。

以防其他人对这个问题感兴趣。 这可以用一个更简单的方法解决(至less使用MVC 3,不知道MVC 2):

只需在您的自定义AuthorizeAttribute中创build一个小型私人控制器:

  private class RedirectController : Controller { public ActionResult RedirectWhereever() { return RedirectToAction("Action", "Controller"); } } 

这可以很容易地在你的HandleUnauthorizedRequest方法中使用(见Craigs答案):

 filterContext.Result = (new RedirectController()).RedirectWhereever();