12

Ich arbeite an einer MVC 4-Intranetanwendung und verwende die Windows-Authentifizierung. Ich möchte dem Benutzerobjekt, das die Authentifizierungsmethode verwendet (@User) hinzufügen und diese Daten aus dem Active Directory abrufen (z. B. E-Mail, Telefonnummer usw.).Active Directory-Benutzerinformationen mit Windows-Authentifizierung in MVC abrufen 4

Ich weiß, ich kann ein benutzerdefiniertes Attribut Authorize erstellen und es dem Controller hinzufügen, die alle meine anderen Controller erben, aber ich weiß nicht, ob dies die richtige Methode ist, um das zu tun, was ich will.

Mein Endziel ist einfach, ich möchte @User-Objekt zusätzliche Eigenschaften haben, die über Active Directory aufgefüllt werden. Vielen Dank für Ihre Hilfe.

Antwort

28

Ich wollte gerade meine eigene Frage zu StackOverflow mit meiner Lösung hinzufügen, um anderen mit diesem Problem zu helfen, als ich Ihre bestehende Frage sah. Es scheint, als wäre das eine sehr häufige Sache, aber die Informationen darüber, wie man es nur macht, verteilen sich auf mehrere Quellen und sind schwer aufzuspüren. Es gibt nicht nur eine vollständige Ressource, also hoffentlich wird dies dir und anderen helfen.

Der beste Weg, dies zu tun ist eine UserPrincipal-Erweiterung zu verwenden. Grundsätzlich untergliedern Sie UserPrincipal von System.DirectoryServices.AccountManagement und fügen Sie Ihre eigenen zusätzlichen Eigenschaften hinzu. Dies wird über die Methoden ExtensionGet und ExtensionSet (etwas magisch) ermöglicht.

Die beiden Attribute der Klasse müssen an Ihre Instanz von AD angepasst werden. Der Wert für DirectoryRdnPrefix muss der RDN (relativ definierter Name) in AD sein, während der Wert für DirectoryObjectClass der Name des Verzeichnisobjekttyps in AD für eine userObject-Klasse sein muss. Bei einem typischen Setup für AD-Domänendienste sollten beide wie im oben dargestellten Code verwendet werden, aber für ein LDS-Setup können sie unterschiedlich sein. Ich habe zwei neue Eigenschaften hinzugefügt, die meine Organisation verwendet, "title" und "department". Daraus können Sie eine Vorstellung davon bekommen, wie Sie eine beliebige andere Eigenschaft hinzufügen können: Im Grunde erstellen Sie einfach eine Eigenschaft mithilfe der Vorlage, die ich hier bereitgestellt habe. Die Eigenschaft kann beliebig benannt werden, aber der an DirectoryProperty übergebene Zeichenfolgenwert sollte innerhalb des Codeblocks mit einem Eigenschaftsnamen aus AD übereinstimmen. Wenn Sie vorhanden sind, können Sie PrincipalContext mit Ihrer Unterklasse anstelle von UserPrincipal verwenden, um ein Benutzerobjekt mit den hinzuzufügenden Eigenschaften zurückzuerhalten.

UserPrincipalExtended user = UserPrincipalExtended.FindByIdentity(
    new PrincipalContext(ContextType.Domain), User.Identity.Name); 

und Zugriff auf Ihre Immobilie wie jeder andere auf der UserPrincipal Beispiel:

// User's title 
user.Title 

Wenn Sie mit System.DirectoryServices.AccountManagement.UserPrincipal nicht vertraut sind, gibt es ein paar Benutzereigenschaften ist gebacken in: GivenName, Surname, DisplayName usw. Insbesondere, da Sie speziell Telefon und E-Mail erwähnt haben, gibt es VoiceTelephoneNumber und EmailAddress. Sie können die vollständige Liste in der MSDN docs sehen. Wenn Sie nur die integrierten Informationen benötigen, müssen Sie nicht wie oben gezeigt UserPrincipal erweitern. Sie würden nur tun:

UserPrincipal user = UserPrincipal.FindByIdentity(
    new PrincipalContext(ContextType.Domain), User.Identity.Name); 

Aber 9 von 10 sind die Einbauten werden nicht ausreichen, so ist es gut zu wissen, wie der Rest leicht.

Schließlich, ich wollte keine @using Zeilen zu jeder Ansicht hinzufügen, die dies verwendet, also ging ich weiter und fügte die Namespaces meiner 0.Ordner web.config hinzu.Dieser Teil ist wichtig, er muss der web.config des Ordners Views hinzugefügt werden, nicht der Ordner des Projekts (und des einzelnen Bereichs jedes Bereichs Views, wenn Sie Bereiche verwenden).

<system.web.webPages.razor> 
    ... 
    <pages pageBaseType="System.Web.Mvc.WebViewPage"> 
     <namespaces> 
      ... 
      <add namespace="System.DirectoryServices.AccountManagement" /> 
      <add namespace="Namespace.For.Your.Extension" /> 
     </namespaces> 
    </pages> 
</system.web.webPages.razor> 
+0

ich diese Erweiterung mag hinzufügen, aber ich habe keine Erfahrung mit den Userprincipal Klassen. Ich habe meine UserPrincipal-Typen durch diese neue Klasse ersetzt, aber beim Aufruf der statischen FindByIdentity-Methode ist ein Fehler aufgetreten. Weitere Informationen: Prinzipalobjekte vom Typ UserPrincipalExtended können in einer Abfrage für diesen Informationsspeicher nicht verwendet werden. Irgendwelche Ideen, warum es scheitert? –

-1
[DirectoryRdnPrefix("CN")] 
[DirectoryObjectClass("user")] 

haben diese nicht erkannt. Hast du gerade eine Steuerung in deinem mvc 4-Rasierer-Projekt erstellt?

Ich kann nicht so gut finden oder die Referenz System.DirectoryServices.AccountManagement