2017-07-06 5 views
0

Ich habe ein benutzerdefiniertes Attribut Autorize basierend auf AAD-Gruppen in MVC erstellt. Wenn ich im Attribut false zurückgebe, gehen die Anwendungen auf der Anmeldeseite in eine Endlosschleife. Wie unterschreiben Sie den Benutzer von einem benutzerdefinierten Autorisierungsattribut, wenn Sie adal in einer MVC-Anwendung verwenden?AuthorizeAttribute Adal Signout MVC

+0

Ich denke, Sie mischen Bedenken ein bisschen dort. Ein Autorisierungsattribut soll prüfen, ob der Benutzer berechtigt ist, eine Aktion auszuführen, und sie entweder zulassen oder eine Art von Fehler zurückgeben, der ihnen nicht erlaubt ist. Warum müssen Sie sie abmelden? – juunas

+0

Danke für Ihre Antwort. Wenn der Benutzer kein Mitglied einer bestimmten AAD-Gruppe ist, gebe ich false zurück, weil ich den Benutzer nicht autorisieren möchte. Wenn Sie ADAL/OWIN als Authentifizierung verwenden und false von einem benutzerdefinierten Autorisierungsattribut zurückgeben, startet die Anwendung eine Endlosschleife in Richtung Ihrer Anmeldeseite und Ihrer Anwendung. –

+0

Ja, in der Regel möchten Sie nicht eine Autoradierungsumleitung auf AAD verursachen (es wird eine Partie Tennis mit Ihrem Browser als Ball und Ihre App und AAD als Schläger starten). Stattdessen sollten Sie dem Benutzer eine Fehlerseite anzeigen. – juunas

Antwort

1

Wenn der Benutzer authentifiziert ist, aber nicht über die Rolle (falsch in benutzerdefinierten Attribut zurückgegeben) das Autorisieren Attribut wird die Antwort auf 401. Es ist nur dann ändern, wenn der Benutzer authentifiziert und haben die Rolle (true zurück im benutzerdefinierten Attribut), dass das authorize-Attribut die Antwort nicht ändert.

Wenn Sie FormsAuthentication oder die OWIN Cookie Authentication Middleware verwenden und der Benutzer bereits angemeldet ist, wird er auf die Anmeldeseite weitergeleitet, was ziemlich merkwürdig ist, wenn Sie etwas dagegen haben. "Ich habe mich bereits eingeloggt, und jetzt bin ich wieder bei der Login-Seite, nur weil ich auf einen Link geklickt habe, und niemand hat mir gesagt, warum das gerade passiert ist."

AuthorizeAttribute stellt eine geschützte virtuelle Methode mit dem Namen HandleUnauthorizedRequest bereit, die überschrieben werden kann. Dabei wird überprüft, ob der Benutzer authentifiziert ist und eine Fehlerseite angezeigt wird. Zum Beispiel:

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

Sie könnten auch einen nicht autorisierten Benutzer in Ihrem benutzerdefiniert AuthorisationAttribute durch Überschreiben der HandleUnauthorizedRequest Methode umleiten:

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

Bitte lesen Sie here für weitere Details.

+0

Das ist der Weg zu gehen! Das ist eine viel bessere Lösung. Vielen Dank! –

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; 
    } 
Verwandte Themen