41 votes

Comment puis-je diffuser une page non autorisée lorsqu'un utilisateur ne se trouve pas dans les rôles autorisés?

Je suis à l'aide de l' Authorize d'attribut comme ceci:

[Authorize (Roles="Admin, User")]
Public ActionResult Index(int id)
{
    // blah
}

Lorsqu'un utilisateur n'est pas dans les rôles, j'obtiens une page d'erreur (ressource non trouvée). Alors, j'ai mis l' HandleError d'attribut dans aussi.

[Authorize (Roles="Admin, User"), HandleError]
Public ActionResult Index(int id)
{
    // blah
}

Maintenant, il va à la Connexion de la page, si l'utilisateur n'est pas dans les rôles.

Comment puis-je obtenir pour aller à un non autorisée de la page au lieu de la page de connexion, lorsqu'un utilisateur ne respecte pas l'un des rôles? Et si une autre erreur se produit, comment puis-je distinguer l'erreur de l'erreur non autorisée et de les traiter différemment?

26voto

Rune Points 4759

Ajouter quelque chose comme ceci à votre site web.config:

<customErrors mode="On" defaultRedirect="~/Login">
     <error statusCode="401" redirect="~/Unauthorized" />
     <error statusCode="404" redirect="~/PageNotFound" />
</customErrors>

Vous devez évidemment créer l' /PageNotFound et /Unauthorized routes, les actions et les points de vue.

EDIT: je suis désolé, j'ai apparemment ne comprends pas le problème de fond.

Le problème est que lorsque l' AuthorizeAttribute filtre est exécuté, il décide que l'utilisateur ne correspond pas aux exigences (il/elle peut être connecté, mais n'est pas dans un bon rôle). Il présente, par conséquent, le code d'état de réponse à 401. C'est intercepté par l' FormsAuthentication module qui seront ensuite effectuer la redirection.

Je vois deux solutions:

  1. Désactiver le defaultRedirect.

  2. Créez votre propre IAuthorizationFilter. Dériver de l' AuthorizeAttribute et remplacer HandleUnauthorizedRequest. Dans cette méthode, si l'utilisateur est authentifié faire une redirection vers /non autorisée

Je n'aime pas non plus: le defaultRedirect fonctionnalité est agréable et pas quelque chose que vous voulez mettre en œuvre vous-même. La deuxième approche se traduit par l'utilisateur du fait que visuellement correcte "Vous n'êtes pas autorisé"-page, mais les codes d'état HTTP ne sera pas souhaité 401.

Je ne sais pas assez sur HttpModules de dire si cela peut être contourné avec une tolérable hack.

EDIT 2: Comment à propos de la mise en œuvre de votre propre IAuthorizationFilter de la manière suivante: télécharger le MVC2 code de CodePlex et "emprunter" le code pour AuthorizeAttribute. Modifier la OnAuthorization méthode pour ressembler à

    public virtual void OnAuthorization(AuthorizationContext filterContext)
    {
        if (AuthorizeCore(filterContext.HttpContext))
        { 
            HttpCachePolicyBase cachePolicy = filterContext.HttpContext.Response.Cache;
            cachePolicy.SetProxyMaxAge(new TimeSpan(0));
            cachePolicy.AddValidationCallback(CacheValidateHandler, null /* data */);
        }
        // Is user logged in?
        else if(filterContext.HttpContext.User.Identity.IsAuthenticated)
        {
            // Redirect to custom Unauthorized page
            filterContext.Result = new RedirectResult(unauthorizedUrl);
        } 
        else {
            // Handle in the usual way
            HandleUnauthorizedRequest(filterContext);
        }
    }

unauthorizedUrl est soit un bien sur le filtre ou le lire à partir du Web.config.

Vous pouvez également hériter de AuthorizeAttribute et remplacer OnAuthorization, mais vous allez finir par l'écriture d'un couple de méthodes privées qui sont déjà dans AuthorizeAttribute.

7voto

Pbirkoff Points 2634

Vous pouvez le faire de deux façons:

  1. Indiquez l'erreur la HandleError-attribut, et de donner un point de vue qui doit être indiqué:

    [HandleError(ExceptionType = typeof(UnAuthorizedException), View = "UnauthorizedError")]

Vous pouvez spécifier plusieurs ExceptionTypes et vues

  1. Créer un personnalisé ActionFilter, vérifier les informations d'identification, et de les rediriger vers un contrôleur si l'utilisateur n'est pas autorisée.: http://msdn.microsoft.com/en-us/library/dd381609.aspx

4voto

628426 Points 60

Peut-être qu'un code d'état 403 est plus approprié en fonction de votre question (l'utilisateur est identifié, mais son compte n'est pas assez privilégié). 401 est pour le cas où vous ne savez pas quels privilèges l'utilisateur a.

3voto

Mike Chaliy Points 8694

Et HttpUnauthorizedResult (ceci vient comme une réutilisation du AuthorizeAtrribute ) définit simplement StatusCode sur 401. Vous pouvez donc probablement configurer une page 401 dans IIS ou des pages d'erreur personnalisées dans web.config. Bien entendu, vous devez également vous assurer que l'accès à votre page d'erreur personnalisée ne nécessite pas d'autorisation.

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