Получение списка групп AD не выполняется при запуске на сервере - PullRequest
0 голосов
/ 18 октября 2018

У меня есть веб-сайт и API, размещенные на одном сервере в IIS.В API (.NET) мне нужно получить список групп AD, к которым принадлежит пользователь, использующий веб-сайт.Он работает локально (Postman вызывает API в IIS Express), но не работает при запуске на нашем сервере.Код для получения групп AD выглядит следующим образом:

            string[] output = null;
            string username = GetUserName();
            using (var ctx = new PrincipalContext(ContextType.Domain))
            using (var user = UserPrincipal.FindByIdentity(ctx, username))
            {
                if (user != null)
                {
                    output = user.GetGroups() //this returns a collection of principal objects
                        .Select(x => x.SamAccountName) // select the name.  you may change this to choose the display name or whatever you want
                        .ToArray(); // convert to string array
                }
            }

Имя пользователя распознано правильно, и одно и то же значение передается на локальный хост и на сервер, поэтому это не проблема.Строка:

using (var user = UserPrincipal.FindByIdentity(ctx, username))

возвращает исключение:

Исключение типа 'System.DirectoryServices.DirectoryServicesCOMException' произошло в System.DirectoryServices.AccountManagement.dll, но не было обработано пользователемкод

Возможно, это что-то в настройках IIS, но я не могу понять, что именно.Я попытался установить Identity of DefaultAppPool (ApplicationPool, которому назначен веб и API) для NetworkService, но это не помогло.

1 Ответ

0 голосов
/ 18 октября 2018

Вам необходимо включить проверку подлинности Windows, если вы еще этого не сделали.Инструкции здесь: https://support.microsoft.com/en-in/help/323176/how-to-implement-windows-authentication-and-authorization-in-asp-net

Но основная идея заключается в том, что вы используете это в своем файле web.config:

<system.webServer>
  <security>
    <authentication>
      <windowsAuthentication enabled="true" />
      <anonymousAuthentication enabled="false" />
    </authentication>
  </security>
</system.webServer>

Затем вы можете использовать это, чтобы получить UserPrincipal объекттекущий пользователь:

UserPrincipal.FindByIdentity(domain, User.Identity.Name)

Но у вас могут возникнуть проблемы с используемой учетной записью, поскольку вашему веб-сайту также необходимо пройти аутентификацию в AD с учетными данными домена.

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

using (var ctx = new PrincipalContext(ContextType.Domain, null, "username", "password"))

Я думал, что NetworkService использует учетную запись компьютера AD для аутентификации, но, возможно, ваш сервер не присоединен к домену?Если это не так, то вам также необходимо указать имя домена в PrincipalContext:

using (var ctx = new PrincipalContext(ContextType.Domain, "domain.com", "username", "password"))

. Это работает, когда вы запускаете его локально в IIS Express, потому что IIS Express работает под вашими учетными данными и использует вашиучетные данные для аутентификации в AD.

...