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>
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? –