2009-09-24 3 views
5

J'utilise un filtre d'autorisation personnalisé sur mes contrôleurs ASP.NET MVC qui redirige l'utilisateur vers une URL autre que l'écran de connexion s'ils échouent à l'autorisation sur une action particulière.Comment gérez-vous l'autorisation sur les actions qui renvoient des résultats autres que ViewResult?

Ceci est correct pour les actions qui retournent des vues, mais beaucoup de mes actions renvoient d'autres types de résultats tels que PartialResult ou JsonResult.

Mon filtre actuel ressemble à ceci:

< AuthorizeWithRedirect (Rôles: = "ServerAccess", Contrôleur: = "Home", Action: = "non autorisée") >

Cela indique Si l'utilisateur n'est pas dans le rôle ServerAccess, il doit être redirigé vers/Home/Unauthorized/

Je suis curieux de savoir comment d'autres personnes s'en occupent? Cela semble particulièrement problématique lorsque vous considérez le nombre d'actions qui sont destinées à être appelées uniquement par les appels AJAX du script côté client. Comment l'action/Home/Unauthorized/peut-elle savoir si l'appelant était destiné à recevoir une vue, partialview, json, content, etc?

Répondre

1

Je pense que vous aurez besoin de transmettre cette information avec la redirection.

A deux manières, vous pouvez gérer cela:

  • Pensez à faire des méthodes d'action distincts pour chaque type de réponse que vous avez besoin - UnauthorizedJson, UnauthorizedHtml, UnauthorizedEtc ... qui correspond au type de réponse d'action original

  • passe dans les informations de format avec la redirection en ajoutant un autre paramètre à la méthode non autorisée et annexant à l'URL dans votre filtre

+0

La première option est la route que j'ai actuellement prise, avec une action de contrôleur pour chaque type de ActionResult, c'est-à-dire UnauthorisedPartial, UnauthorisedJSON. Cela me permet d'écrire une page standard et de la renvoyer à n'importe quel appelant. – Nick

9

Utilisez Request.IsAjaxRequest(), .: par exemple

public sealed class AjaxAuthorizeAttribute : AuthorizeAttribute 
{ 
    public AjaxAuthorizeAttribute() : base() 
    { 
    } 

    public override void OnAuthorization(AuthorizationContext filterContext) 
    { 
     // Extends the original Web.MVC.AuthorizeAttribute for Ajax calls. 
     // Basically if the request is not authorized and the request is an AJAX Request. 
     // then we simply set the stats Code to 403 and set an empty Result, in order to 
     // determine in Javascript if the AJAX call came back completed and valid. 
     base.OnAuthorization(filterContext); 
     if (filterContext.Result == null) 
     { 
      return; 
     } 
     else if (filterContext.Result.GetType() == typeof(HttpUnauthorizedResult) 
       && filterContext.HttpContext.Request.IsAjaxRequest()) 
     { 
      filterContext.Result = new ContentResult(); 
      filterContext.HttpContext.Response.StatusCode = 403; 
     } 
    } 
} 

note 403, pas 401, depuis ASP.NET intercepte 401s et les transforme en pages d'erreur HTML. Peu importe ce que l'appel AJAX devrait recevoir; il peut toujours voir le code d'état.

+0

Le retour d'un 403 est une approche intéressante que je n'avais pas envisagée. Je suppose que cela met le fardeau sur le script client pour générer un message approprié pour l'utilisateur. – Nick

+0

Ce fardeau est toujours présent avec AJAX, peu importe comment vous le faites. –

Questions connexes