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

Lan*_*ney 59 asp.net-mvc

使用ASP.Net MVC 2,有没有办法在基于类的类中使用Controller类的RedirectToAction()方法?AuthorizeAttribute

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");
    }
}
Run Code Online (Sandbox Code Playgroud)

我正在寻找一种方法,在用户验证失败时将用户重定向到特定的控制器/操作,而不是将其返回到登录页面.是否可以为该控制器/操作生成重定向 URL,然后使用RedirectResult()?我试图避免仅仅对URL进行硬编码的诱惑.

Cra*_*ntz 105

你可以/应该覆盖HandleUnauthorizedRequest而不是OnAuthorization.这是默认实现:

    protected virtual void HandleUnauthorizedRequest(AuthorizationContext filterContext) {
        // Returns HTTP 401 - see comment in HttpUnauthorizedResult.cs.
        filterContext.Result = new HttpUnauthorizedResult();
    }
Run Code Online (Sandbox Code Playgroud)

你不能使用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" }
                                   });
    }
Run Code Online (Sandbox Code Playgroud)

  • 你在全能的真主的恩典中度过了我的一天. (4认同)
  • 谢谢,这很有效.使用HandleUnauthorizedRequest的好处 - 我使用的是OnAuthorization,因为我在另一个教程/讨论中看到了它们(他们有一个自定义属性,在身份验证失败时设置会触发重定向). (3认同)

Mat*_*son 12

你可以这样做:

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

当您在控制器中调用"RedirectToAction()"时,这是框架执行此操作的方式.