Получение информации о пользователе Active Directory с проверкой подлинности Windows в MVC 4

Я работаю над приложением MVC 4 для интрасети и использую проверку подлинности Windows. Я хотел бы добавить к объекту пользователя, который использует метод аутентификации (@User), и получить эти данные из активного каталога (например, адрес электронной почты, номер телефона и т. Д.).

Я знаю, что могу создать настраиваемый атрибут Authorize и добавить его в controller, который наследует все мои другие controllerы, но я не знаю, правильно ли это для того, чтобы делать то, что я хочу.

Моя конечная цель проста, я хочу, чтобы объект @User имел дополнительные свойства, которые заполняются через Active Directory. Спасибо за любую помощь, которую вы можете предложить.

    Я как раз собирался добавить свой собственный вопрос в StackOverflow с моим решением, чтобы помочь другим с этой проблемой, когда я увидел ваш существующий вопрос. Похоже, это будет очень распространено, но информация о том, как это сделать, распространяется только между несколькими источниками и трудно отслеживать. Существует не только один полный ресурс, поэтому, надеюсь, это поможет вам и другим.

    Лучший способ сделать это – использовать расширение UserPrincipal. В принципе, вы подclassифицируете UserPrincipal из System.DirectoryServices.AccountManagement и добавляете свои дополнительные свойства. Это активируется с помощью методов ExtensionGet и ExtensionSet (несколько магических).

     [DirectoryRdnPrefix("CN")] [DirectoryObjectClass("user")] public class UserPrincipalExtended : UserPrincipal { public UserPrincipalExtended(PrincipalContext context) : base(context) { } public UserPrincipalExtended(PrincipalContext context, string samAccountName, string password, bool enabled) : base(context, samAccountName, password, enabled) { } [DirectoryProperty("title")] public string Title { get { if (ExtensionGet("title").Length != 1) return null; return (string)ExtensionGet("title")[0]; } set { ExtensionSet( "title", value ); } } [DirectoryProperty("department")] public string Department { get { if (ExtensionGet("department").Length != 1) return null; return (string)ExtensionGet("department")[0]; } set { ExtensionSet("department", value); } } public static new UserPrincipalExtended FindByIdentity(PrincipalContext context, string identityValue) { return (UserPrincipalExtended)FindByIdentityWithType(context, typeof(UserPrincipalExtended), identityValue); } public static new UserPrincipalExtended FindByIdentity(PrincipalContext context, IdentityType identityType, string identityValue) { return (UserPrincipalExtended)FindByIdentityWithType(context, typeof(UserPrincipalExtended), identityType, identityValue); } } 

    Два атрибута classа должны быть настроены для вашего экземпляра AD. Значение для DirectoryRdnPrefix должно быть RDN (относительное различающееся имя) в AD, а значение для DirectoryObjectClass должно быть именем типа объекта каталога в AD для classа userObject. Для типичной настройки доменных служб AD они должны использоваться как в коде, представленном выше, но для настройки LDS они могут быть разными. Я добавил два новых свойства, которые использует моя организация: «title» и «department». Из этого вы можете получить представление о том, как добавить любое другое свойство, которое вам нравится: в основном вы просто создаете свойство, используя шаблон, который я здесь предоставил. Свойству можно назвать все, что вам нравится, но строковое значение, переданное в DirectoryProperty и внутри блока кода, должно совпадать с именем свойства из AD. При этом вы можете использовать PrincipalContext с вашим подclassом вместо UserPrincipal чтобы вернуть объект пользователя с добавленными вами свойствами.

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

    И доступ к вашей собственности, как и любой другой в экземпляре UserPrincipal :

     // User's title user.Title 

    Если вы не знакомы с System.DirectoryServices.AccountManagement.UserPrincipal , есть несколько свойств пользователя, испеченных в: GivenName , Surname , DisplayName и т. Д. В частности, к вашим обстоятельствам, поскольку вы упомянули о телефоне и электронной почте, есть VoiceTelephoneNumber и EmailAddress . Полный список вы можете увидеть в документах MSDN . Если вам нужна только встроенная информация, вам не нужно расширять UserPrincipal как я показал выше. Вы бы просто сделали:

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

    Но, в 9 раз из 10, встроенных модhive будет недостаточно, так что хорошо знать, как легко отдохнуть.

    Наконец, я не хотел добавлять строки @using в любое представление, которое использует это, поэтому я пошел вперед и добавил пространства имен в web.config моей коллекции Views . Эта часть важна, ее необходимо добавить в папку web.config в папке Views , а не в отдельную папку проекта (и в отдельную область каждого региона, если вы используете области).

      ...   ...      
     [DirectoryRdnPrefix("CN")] [DirectoryObjectClass("user")] 

    Они не были признаны. Вы только что создали контрольную панель в своем проекте бритвы mvc 4?

    Я также не могу найти или добавить ссылку System.DirectoryServices.AccountManagement

    Давайте будем гением компьютера.