2010-03-18 121 views
50

使用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()?我试图避免对网址进行硬编码的诱惑。

回答

94

您可以/应该覆盖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" } 
            }); 
    } 
+1

谢谢,这是有效的。使用HandleUnauthorizedRequest的好处 - 我使用的是OnAuthorization,因为我在另一个教程/讨论中看到它(他们有一个自定义属性,当认证失败时会触发重定向)。 – 2010-03-18 20:15:08

+0

@LanceMcNearney我会在参数filterContext中传递什么? – Pomster 2013-07-12 09:51:18

+0

@Craig Stuntz我作为filterContext传入什么? – Pomster 2013-07-12 09:53:26

11

你可以做这样的事情:

var routeValues = new RouteValueDictionary(); 
routeValues["controller"] = "ControllerName"; 
routeValues["action"] = "ActionName"; 
//Other route values if needed. 
context.Result = new RedirectToRouteResult(routeValues); 

这是该框架做它,当你调用“RedirectToAction()”在你的控制器的方式。

+0

什么是上下文?我有红色的下划线? – Pomster 2013-07-12 09:16:09

+0

@Pomster检查问题,“上下文”是问题所关注的方法的一个参数。 – 2013-07-12 09:26:24

+0

谢谢,通过什么来完成这项工作?我一直在努力获得这个工作 – Pomster 2013-07-12 09:28:15

2

万一别人很关心这个问题。 这可以通过更简单的方式来解决(在使用MVC 3至少,不知道MVC 2):

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

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

    } 

这很容易用于你的HandleUnauthorizedRequest方法(见Craigs答案):

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

'RedirectToAction'返回'RedirectToRouteResult',没有必要创建一个控制器来返回一个,就像@Craig Stuntz的回答 – 2013-06-08 18:07:58

相关问题