2014-01-27 1 views
0

Мне нужна помощь в сборе данных Active Directory на основе таблицы в моей БД. У меня есть класс сущностей, который содержит пользовательские запросы. Каждый запрос имеет имя пользователя пользователя из System.Web.HttpContext.Current.User.Identity.Name. Моя проблема заключается в том, что я не могу понять, как настроить запрос linq, чтобы связать имя пользователя AD с остальной частью AD, чтобы я мог отображать их полные имена вместо их имени пользователя в моей таблице. Вот что я до сих пор, любая помощь будет оценена.Сбор данных Active Directory для приложения интрасети MVC

 public partial class RequestInfo 
    { 
    public int RequestInfoId { get; set; } 
    public string RequestByUserADId { get; set; } 
    public System.DateTime RequestDateTime { get; set; } 
    public string Explanation { get; set; } 

    public virtual UserInfo UserInfo { get; set; } // where I define my custom roles 
    } 

Я могу запросить AD с помощью приведенного ниже кода. Я пробовал Get Active Directory User Information With Windows Authentication in MVC 4, но это не помогло.

 using (PrincipalContext context = new PrincipalContext(ContextType.Domain)) 
     using (UserPrincipal user = UserPrincipal.FindByIdentity(context, requestByAdId)) 
     { 
      return user.DisplayName 
     } 
+0

У вас есть имя пользователя активного каталога, так что если вы сделали UserPrincipal userPrincipal = UserPrincipal.FindByIdentity (домен, «ваш пользователь»); он получит вас от пользователя? –

+0

да. Я тестировал его на своем, и я могу видеть такие поля, как DisplayName, EmailAddress. он возвращает правильные значения –

ответ

0

Может быть, я слишком сильно, потому что я не уверен, что если вы в состоянии успешно установить пользователя принципала или нет, но если у вас есть пользовательский принципала вы можете получить информацию о свойствах, как следующее:

user.GetProperty("propertyName") 

Вот статический метод, который должен получить вам отдел для пользователя, например.

public static String GetDepartment(UserPrincipal principal) 
{ 
    return principal.GetProperty("department"); 
} 

Сообщите мне, где именно это происходит, и я могу уточнить, если это не работает.

Редактировать

Оказывается, вам нужно пойти на один уровень глубже, чтобы получить поля, которые не являются по умолчанию частью пользовательского принципала. Для этого вам нужно будет получить запись каталога от пользователя принципала первым:

DirectoryEntry directoryEntry = (userPrincipal.GetUnderlyingObject() as DirectoryEntry); 

Затем вам нужно проверить, если атрибут, который вы ищете, существует, и если это произойдет, получить значение. Отличный способ сделать это - создать вспомогательный метод, по которому вы передаете свою запись в каталог вместе со строковым значением для имени свойства, которое вы хотите получить.

public string GetProperty(DirectoryEntry directoryEntry, string propertyName) 
{ 
    if (directoryEntry.Properties.Contains(propertyName)) 
    { 
     return directoryEntry.Properties[propertyName][0].ToString(); 
    } 
    else 
    { 
     return string.Empty; 
    } 
} 

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

directoryEntry.RefreshCache 

поможет вам начать с этого.

Дайте мне знать, если это поможет вам!

+0

Я не вижу отдела, но я вижу EmployeeId, GivenName, LastLogon и т. д. Я распечатал все свойства с помощью GetProperties(), и есть куча. –

+0

Эй, Джей, изменилось ли добавление? –

+0

все еще работает над тем, чтобы заставить мой объект запроса присоединиться к каждому пользователю, поэтому я могу вытащить их имя и адрес электронной почты. Поэтому, когда я создаю оператор LINQ, я могу сделать часть отображаемого имени моей моделью просмотра. Я не уверен, что мне нужно зайти в каталог. Все, что мне нужно, это DisplayName и EmailAddress прямо сейчас –

Смежные вопросы