Вопрос по windows-authentication, active-directory, ldap, c#, .net – казарка

36

отаю над приложением C # и ASP.Net, которое использует проверку подлинности Windows.

то есть в Web.config:

<system.web>
    <authentication mode="Windows" />
</system.web>

Я хочу получить информацию о текущем пользователе (полное имя, адрес электронной почты и т. Д.) Из Active Directory.

Я могу получить их имя пользователя до Windows 2000 (например:SOMEDOMAIN\someuser) используя

string username = HttpContext.Current.Request.ServerVariables["AUTH_USER"];

Я разработал LDAP-запрос для пользователя, используя его текущее имя для входа (а не его имя для входа до Windows 2000):

DirectorySearcher adSearch = new DirectorySearcher(
        "([email protected])");
SearchResult adSearchResult = adSearch.FindOne();

Однако я не знаю, как выполнить поиск AD для пользователя, используя его логин до W2K, или получить его логин в формате «[email protected]».

Есть идеи?

Ваш Ответ

4   ответа
4

лучший способ сделать это - взглянуть на

System.DirectoryServices.AccountManagement namespace.

У него есть методы поиска людей, и вы можете в значительной степени передать любой формат имени пользователя, который вам нужен, а затем вернуть большую часть основной информации, которая вам понадобится. Если вам нужна помощь по загрузке более сложных объектов и свойств, проверьте исходный код дляhttp://umanage.codeplex.com у него все есть.

казарка

11

Active DS Type Library"

            Int32 nameTypeNT4               = (int) ActiveDs.ADS_NAME_TYPE_ENUM.ADS_NAME_TYPE_NT4;
            Int32 nameTypeDN                = (int) ActiveDs.ADS_NAME_TYPE_ENUM.ADS_NAME_TYPE_1779;
            Int32 nameTypeUserPrincipalName = (int) ActiveDs.ADS_NAME_TYPE_ENUM.ADS_NAME_TYPE_USER_PRINCIPAL_NAME;

            ActiveDs.NameTranslate nameTranslate = new ActiveDs.NameTranslate();

            // Convert NT name DOMAIN\User into AD distinguished name 
            // "CN= User\\, Name,OU=IT,OU=All Users,DC=Company,DC=com"
            nameTranslate.Set(nameTypeNT4, ntUser);

            String distinguishedName = nameTranslate.Get(nameTypeDN);

            Console.WriteLine(distinguishedName);

            // Convert AD distinguished name "CN= User\\, Name,OU=IT,OU=All Users,DC=Company,DC=com" 
            // into NT name DOMAIN\User
            ntUser = String.Empty;
            nameTranslate.Set(nameTypeDN, distinguishedName);
            ntUser = nameTranslate.Get(nameTypeNT4);
            Console.WriteLine(ntUser);

            // Convert NT name DOMAIN\User into AD UserPrincipalName [email protected]
            nameTranslate.Set(nameTypeNT4, ntUser);
            String userPrincipalName = nameTranslate.Get(nameTypeUserPrincipalName);

            Console.WriteLine(userPrincipalName);
Использование NameTranslate для получения DSN является правильным способом. Johannes Kuhn
Спасибо за совет Дмитрий Jeff
Привет, я пытаюсь сделать это, но когда я добавляю «Active DS Type Library», отмечается желтым треугольником, как предупреждение. Я в Windows 10, вы знаете, что случилось? Спасибо Lautaro Cozzani
43

sAMAccountName чтобы отфильтровать вашего пользователя.

Я хотел бы добавить рекомендацию по использованиюDirectorySearcher - если вы хотите только одну или две части информации, добавьте их в"PropertiesToLoad" коллекцияDirectorySearcher.

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

Образец:

adSearch.PropertiesToLoad.Add("sn");  // surname = last name
adSearch.PropertiesToLoad.Add("givenName");  // given (or first) name
adSearch.PropertiesToLoad.Add("mail");  // e-mail addresse
adSearch.PropertiesToLoad.Add("telephoneNumber");  // phone number

Это просто обычные имена свойств AD / LDAP, которые вам нужно указать.

Это действительно полезно, спасибо :) Sophia
хороший совет +1 за вклад Andrew
Но, как и принятый ответ, нет тривиального способа получить «ДОМЕН» ... user166390
52

DOMAIN\SomeBody,Somebody часть известна как sAMAccountName.

Так что попробуйте:

using(DirectoryEntry de = new DirectoryEntry("LDAP://MyDomainController"))
{
   using(DirectorySearcher adSearch = new DirectorySearcher(de))
   {
     adSearch.Filter = "(sAMAccountName=someuser)";
     SearchResult adSearchResult = adSearch.FindOne();
   }
}

[email protected] является UserPrincipalName, но это не обязательное поле.

Извините, комментарий не соответствует образцу кода. Да, sAMAccountName - это просто часть имени пользователя в DOMAIN \ username. У sAMAccountName нет концепции forrest, потому что это концепция до Windows 2000. Если вам нужно найти лес домена W2k +, используйте UPN[email protected] Alan
это правильно. yeulucay
Действительно, отсутствие «ДОМЕНА» проблематично. user166390
Нет, это не так. SAMAccountName не содержит часть «DOMAIN \», что делает его бесполезным для запросов всего леса. Chris KL

Похожие вопросы