2017-07-06 1 views
0

J'ai créé un attribut Authorize personnalisé basé sur des groupes AAD dans MVC. Si je retourne false dans l'attribut les applications vont dans une boucle infinie sur la page de connexion. Comment vous déconnecter l'utilisateur d'un attribut d'autorisation personnalisé lors de l'utilisation d'adal dans une application MVC?AuthorizeAttribute adaloutout MVC

+0

Je pense que vous mélangez les préoccupations un peu là-bas. Un attribut d'autorisation est supposé vérifier si l'utilisateur est autorisé à faire une action, et soit les autoriser à travers ou retourner une sorte d'erreur qu'ils ne sont pas autorisés à le faire. Pourquoi avez-vous besoin de les signer? – juunas

+0

Merci pour votre réponse. Si l'utilisateur n'est pas membre d'un groupe AAD spécifique, je renvoie false car je ne veux pas autoriser l'utilisateur. Si vous utilisez ADAL/OWIN comme authentification et que vous renvoyez false à partir d'un attribut d'autorisation personnalisé, les applications démarrent une boucle infinie vers votre page de connexion et votre application. –

+0

Oui, vous ne voulez généralement pas provoquer une redirection vers AAD en cas d'échec de l'autorisation (cela va commencer une partie de tennis avec votre navigateur comme le ballon et votre application et AAD comme les raquettes). Au lieu de cela, vous devriez montrer une page d'erreur à l'utilisateur. – juunas

Répondre

1

Lorsque l'utilisateur est authentifié, mais ne pas le rôle (faux retourné dans l'attribut personnalisé) l'attribut authorize changera la réponse à 401. Il est uniquement lorsque l'utilisateur est authentifié et avoir le rôle (true retourné dans l'attribut personnalisé) que l'attribut authorize ne changera pas la réponse. Si vous utilisez FormsAuthentication ou le Middleware d'authentification de cookie OWIN et que l'utilisateur est déjà connecté, il sera de nouveau redirigé vers la page de connexion, ce qui est assez bizarre si vous le souhaitez. "Je me suis déjà connecté, et maintenant je suis de retour à la page de connexion juste parce que j'ai cliqué sur un lien, et personne ne m'a dit pourquoi cela est arrivé." AuthorizeAttribute fournit une méthode virtuelle protégée nommée HandleUnauthorizedRequest que vous pouvez remplacer, en vérifiant si l'utilisateur est authentifié et affiche une page erro. Par exemple:

protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
     { 
      if (filterContext.HttpContext.User.Identity.IsAuthenticated) 
      { 
       filterContext.Result = new HttpStatusCodeResult(HttpStatusCode.Forbidden); 
      } 
      else 
      { 
       base.HandleUnauthorizedRequest(filterContext); 
      } 
     } 

Vous pouvez également rediriger un utilisateur non autorisé dans votre coutume AuthorisationAttribute en redéfinissant la méthode HandleUnauthorizedRequest:

protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
{ 
    filterContext.Result = new RedirectToRouteResult(
       new RouteValueDictionary(
        new 
         { 
          controller = "Error", 
          action = "Unauthorised" 
         }) 
       ); 
} 

S'il vous plaît lire here pour plus de détails.

+0

C'est le chemin à parcourir! C'est une solution bien meilleure. Merci! –

0
I think I found a solution I am testing as we speak: 

protected override bool AuthorizeCore(HttpContextBase httpContext) 
    { 
     var authorized = base.AuthorizeCore(httpContext); 

     var allowedGroups = GetAllowedGroups(); 

     var urlHelper = new UrlHelper(HttpContext.Current.Request.RequestContext); 
     string callbackUrl = urlHelper.Action("SignOutCallback", "Account", routeValues: null, protocol: httpContext.Request.Url.Scheme); 

     httpContext.GetOwinContext().Authentication.SignOut(
      new AuthenticationProperties { RedirectUri = callbackUrl }, 
      OpenIdConnectAuthenticationDefaults.AuthenticationType, CookieAuthenticationDefaults.AuthenticationType); 

     return authorized; 
    }