Можно ли использовать RedirectToAction () внутри пользовательского класса AuthorizeAttribute? - PullRequest
57 голосов
/ 18 марта 2010

Используя 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 () ? Я пытаюсь избежать соблазна просто жестко закодировать URL.

Ответы [ 3 ]

102 голосов
/ 18 марта 2010

Вы можете / должны переопределить 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" }
                                   });
    }
12 голосов
/ 18 марта 2010

Вы можете сделать что-то вроде этого:

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

Это то, как фреймворк делает это, когда вы вызываете «RedirectToAction ()» в вашем контроллере.

2 голосов
/ 22 июля 2011

В случае, если кто-то еще заинтересован в этом вопросе. Это может быть решено более простым способом (по крайней мере, используя MVC 3, не знаю о MVC 2):

Просто создайте небольшой частный контроллер в своем пользовательском AuthorizeAttribute:

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

    }

Это легко можно использовать в вашем методе HandleUnauthorizedRequest (см. Ответ Крейгса):

filterContext.Result = (new RedirectController()).RedirectWhereever();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...