2014-02-11 12 views
11

Ich habe ein kleines Projekt mit Visual Studio 2013, .NET 4.5, MVC 5 und EF 6. Ich habe es mit Windows-Authentifizierung erstellt, aber jetzt muss ich auf die Mitgliedschaft in einem Active überprüfen Verzeichnisgruppe zum Zulassen oder Verweigern des Zugriffs.Windows-Authentifizierung mit Active Directory-Gruppen

Ich bin viele sehr tiefe Kaninchenlöcher hinuntergegangen und habe versucht, herauszufinden, wie man das macht. Zuerst nahm ich an, dass ich das Projekt ändern müsste, um "On-Premises" -Authentifizierung zu verwenden. Ich habe jedoch gefunden:

  • Es gibt anscheinend keine Möglichkeit in VS 2013, den Typ der Authentifizierung, die ein Projekt verwendet (anders als einige Dateien manuell zu bearbeiten) zu ändern.
  • Es gibt noch keine Dokumentation, die erklärt, wie die "On-Premises" -Authentifizierung eingerichtet wird. (Wirklich? Wie ist das möglich?)
  • In jedem Fall, was ich brauche ist nicht "On-Premises" Authentifizierung überhaupt, da das nur für Windows Identity Federation-Dienste (oder so ähnlich) ist. Was ich stattdessen verwenden sollte, ist nur die Windows-Authentifizierung mit ASP.Net-Rollen, die Windows scheinbar von Active Directory-Gruppen erhält, wenn ich mich anmelde.
  • Also, vorausgesetzt, dass # 3 wahr ist, habe ich versucht, diese zahlreiche Beiträge über das Lesen, aber sie scheinen in zwei Gruppen zu fallen:

    1. Geradlinige, einfache Methoden, die ich nicht bekommen kann zu arbeiten, wahrscheinlich, weil es etwas Wissen voraussetzt, das ich nicht habe.
    2. Komplexe, benutzerdefinierte codierte Methoden, von denen ich vermute, dass sie durch Code geschehen, was wahrscheinlich in einer code-freien Methode getan werden kann.
    3. Angenommen, # 1 ist der Weg zu gehen, hier ist mein jüngster Versuch.

      In meinem Controller, ich habe:

      [Authorize([email protected]"SomeDomain\\SomeGroup")] 
      public class SomeController : Controller 
      

      In meiner Datei Web.config, die ich habe:

      <system.web> 
          <authentication mode="Windows" /> 
          <authorization> 
           <deny users="?" /> 
          </authorization> 
          <roleManager enabled="true" defaultProvider="AspNetWindowsTokenRoleProvider"> 
           <providers> 
           <clear/> 
           <add name="AspNetWindowsTokenRoleProvider" 
            type="System.Web.Security.WindowsTokenRoleProvider" 
            applicationName="/" /> 
           </providers> 
          </roleManager> 
          </system.web> 
          <system.serviceModel> 
          <behaviors> 
           <serviceBehaviors> 
           <behavior name="BehaviorConfiguration"> 
            <serviceAuthorization 
             principalPermissionMode="UseAspNetRoles" 
             roleProviderName="AspNetWindowsTokenRoleProvider" /> 
            <serviceMetadata /> 
           </behavior> 
           </serviceBehaviors> 
          </behaviors> 
          </system.serviceModel> 
      

      Wenn ich versuche, auf die Seite zuzugreifen, ich stattdessen anmelden gefragt werden. Nachdem ich meine Login-ID und das Passwort eingegeben habe, erhalte ich weiterhin die Anmeldeaufforderung. Ich darf nicht auf die Seite gehen.

      Ich habe nirgends meine Anwendung über den Active Directory-Server informiert, aber ich habe den Eindruck, dass Windows das bereits weiß (seit ich mich bei Windows anmelde, greift es auf den Active Directory-Server zu, um mich zu authentifizieren)).

      Fehle ich etwas? Oder liege ich falsch darin, anzunehmen, dass dies ohne das Schreiben von benutzerdefiniertem Code möglich ist?

      Vorbehalt: Ich bin ziemlich neu zu .NET, MVC, etc, aus der Java-Welt kommen, also bitte verwenden Sie kleine Worte. :-)

    +0

    Sie sollten diese Frage überprüfen. Es ist wahrscheinlich für eine frühere Version von mvc, aber die Windows-Authentifizierung hat sich seit einiger Zeit nicht geändert. http://stackoverflow.com/questions/13767439/using-windows-authentication-with-active-directory-groups-as-roles – Shoe

    +0

    Ich hatte diesen Beitrag früher angeschaut, und basierte viel von dem, was ich versuchte, aber es hat nicht funktioniert. Ich habe gerade herausgefunden, was ich falsch gemacht habe. Im Attribut in meinem Controller hatte ich zwei umgekehrte Schrägstriche zwischen dem Namen der Domäne und dem Namen der Rolle statt einer. Also ich hatte: '[autorisieren (Roles = @ "somedomain \\ Einegruppe")]' statt '[autorisieren (Roles = @ "somedomain \ Einegruppe")]' Doh! –

    Antwort

    8

    Ich habe das Problem gefunden. Was ich oben hatte, war korrekt, außer dass ich ZWEI umgekehrte Schrägstriche zwischen dem Domain-Namen und dem Rollennamen anstelle von einem hatte. Das Update wurde es nur diese Veränderung:

    [Authorize([email protected]"SomeDomain\SomeGroup")] 
    
    +2

    Erläuterung für .NET-Lerner: Das Setzen von '@' vor einem beliebigen String-Literal bedeutet "nehmen Sie diese Zeichenfolge genau so, wie sie geschrieben wurde, ohne dem Backslash-Symbol besondere Fähigkeiten als Escape-Symbol für Steuercodes zu geben". Eine Alternative besteht darin, das Zeichen "@" vor der Zeichenfolge zu löschen und dann die umgekehrten Schrägstriche zu verdoppeln, da jedes \\ dann als einzelnes Literal interpretiert wird. Dies ermöglicht C-artige Steuercodes, z.B. '\ r \ n \ t' usw. Gut gemacht für das Lösen Ihres eigenen Problems obwohl! –

    0

    Sie auch dies ein Filter in RegisterGlobalFilters im App_Start Ordner vornehmen können.

    public class FilterConfig 
    { 
        public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
        { 
         if (filters == null) 
         { 
          throw new ArgumentNullException("filters"); 
         } 
    
         filters.Add(new HandleErrorAttribute()); 
    
         var authorizeAttribute = new AuthorizeAttribute 
         { 
          Roles = "Domain\Group" // Role = group in Active Directory 
         }; 
    
         filters.Add(authorizeAttribute); 
        } 
    }