Режим аутентификации Windows в ASP.NET использует имя группы Active Directory (до Windows 2000)? - PullRequest
9 голосов
/ 12 января 2010

Вот фон. У меня был проект .NET MVC v1.0, который я пытался защитить с помощью режима аутентификации Windows. Поэтому я установил для web.config:

<authentication mode="Windows" />

А затем вошел в мой контроллер и сделал следующее:

[Authorize(Roles="IT")]
public class LicenseController : Controller

В нашей эры у нас есть группа, которая называется "IT", и я, как и многие другие, принадлежу к этой группе. Как только я это установил, я начал сеанс отладки и попытался выполнить любое из действий в этом контроллере, и меня встретил 401. Я искал высоко и низко, ища где-то, что я облажался и не мог найти ничего неправильно. Через некоторое время я решил попробовать изменить «Авторизировать» для конкретного пользователя, посмотреть, сработало ли это. Поэтому я изменил это на следующее:

[Authorize(Users="domain\\tnederveld")]

И низко и вот, что сработало. Поэтому я пошел и добавил другую группу, членом которой я являлся, и вынул утверждение авторизации пользователей, и это сработало. Я начал изучать различия между двумя группами AD, и единственное, что отличалось, было то, что во второй группе я попробовал «Имя группы (до Windows 2000):» было одинаковым. «Группа ИТ» «Имя группы (до Windows 2000):» была «ИТ-партнеры». Поэтому я попытался изменить утверждение авторизации на:

[Authorize(Roles="IT Associates")]

И это начало работать. Я точно подумал, что это проблема MVC, поэтому я попробовал ее в обычном проекте Web Forms и столкнулся с той же проблемой.

Настоящим кикером является то, что при использовании UserPrincipal, который является частью System.DirectoryServices.AccountManagement, он возвращает группу "IT" при использовании метода .GetGroups ().

Почему это происходит?

1 Ответ

3 голосов
/ 12 января 2010

Вам необходимо разделить различные имена , которые могут иметь записи в AD:

  • имя само по себе обычно является атрибутом CN - Common Name. Это часть "CN = xxx" в вашей строке LDAP. Здесь это IT - и это то, что System.DirectoryServices.AccountManagement будет возвращать - это наиболее распространенное имя «Active Directory»

  • имя "IT Associates" - это имя, предшествующее Windows 2000 или sAMAccountName - то, что Windows NT использовало до появления AD, - имя локального пользователя и / или группы (SAM = Security Account Management или что-то вроде того). Имя учетной записи SAM должно быть уникальным для каждого домена - даже сейчас в огромном лесу AD.

К сожалению, многие вызовы Windows API по-прежнему основаны на этом имени - поскольку они (и должны быть) обратно совместимы с более ранними версиями Windows. Система членства ASP.NET использует эти вызовы и, следовательно, будет использовать ваше domain/tnederveld имя пользователя и IT Associates группу - это имена учетных записей SAM ваших объектов

Не уверен, что вы многое можете с этим поделать - просто имейте в виду, что в среде AD у любого вашего пользователя или группы есть множество "имен" - всегда очень четко понимайте, о ком вы говорите!

Подробный список всех атрибутов AD см. На превосходном веб-сайте Ричарда Мюллера с справочным материалом Active Directory .

...