代码之家  ›  专栏  ›  技术社区  ›  Lance McNearney

可以在自定义authorizedattribute类中使用redirectToAction()吗?

  •  54
  • Lance McNearney  · 技术社区  · 16 年前

    使用asp.net mvc 2,有没有办法使用 RedirectToAction() 方法 Controller 类中的类,该类基于 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");
        }
    }
    

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

    3 回复  |  直到 13 年前
        1
  •  100
  •   Craig Stuntz    16 年前

    你可以/应该重写 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" }
                                       });
        }
    
        2
  •  11
  •   user1477388    13 年前

    你可以这样做:

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

    当您在控制器中调用“redirectToAction()”时,框架就是这样做的。

        3
  •  2
  •   Petter Lundanes    15 年前

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

    只需在自定义authorized属性中创建一个小型专用控制器:

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

    这很容易在你的handleunauthorizedrequest方法中使用(见craigs答案):

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