60 votes

Est-il possible d'utiliser RedirectToAction() dans une classe AuthorizeAttribute personnalisée ?

En utilisant ASP.Net MVC 2, y a-t-il un moyen d'utiliser la fonction RedirectToAction() de la méthode Contrôleur à l'intérieur d'une classe qui est basée sur la classe AuthorizeAttribute classe ?

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");
    }
}

Je cherche un moyen de rediriger l'utilisateur vers un contrôleur / action spécifique lorsqu'il échoue à l'authentification au lieu de le renvoyer à la page de connexion. Est-il possible de générer l'URL de redirection pour ce contrôleur ou cette action, puis d'utiliser l'URL de redirection de l'utilisateur ? RedirectResult() ? J'essaie d'éviter la tentation de coder l'URL en dur.

107voto

Craig Stuntz Points 95965

Vous pouvez/devriez passer outre HandleUnauthorizedRequest au lieu de OnAuthorization . Voici l'implémentation par défaut :

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

Vous ne pouvez pas utiliser Controller.RedirectToAction mais vous peut retourner un nouveau RedirectToRouteResult .

Donc vous pouvez le faire :

    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) {
        // Returns HTTP 401 - see comment in HttpUnauthorizedResult.cs.
        filterContext.Result = new RedirectToRouteResult(
                                   new RouteValueDictionary 
                                   {
                                       { "action", "ActionName" },
                                       { "controller", "ControllerName" }
                                   });
    }

12voto

Mattias Jakobsson Points 6101

Vous pouvez faire quelque chose comme ça :

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

C'est ainsi que le framework procède lorsque vous appelez "RedirectToAction()" dans votre contrôleur.

2voto

Petter Lundanes Points 64

Au cas où quelqu'un d'autre serait intéressé par cette question. Ce problème peut être résolu de manière plus simple (au moins en utilisant MVC 3, je ne sais pas pour MVC 2) :

Il suffit de créer un petit contrôleur privé dans votre AuthorizeAttribute personnalisé :

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

    }

Cela peut facilement être utilisé dans votre méthode HandleUnauthorizedRequest (voir la réponse de Craig) :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X