Проверка членства в группе Active Directory in.Net 4.5

у меня есть ASP.Net приложение MVC с использованием проверки подлинности Windows, и я проверяю членство в группе для безопасности действий контроллера.

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

Первая Попытка: [Санкционировать]

классический метод состоит в том, чтобы просто шлепнуть Authorize атрибут аннотации данных на действии контроллера и перейдите в город:

[Authorize(Roles = @"domaingroupName1")]

нет кости. Я подсказал для верительных грамот. Обычно это означает, что что-то не так с конфигурацией проверки подлинности Windows, но она отлично настроена: (1) HttpContext.User это WindowsPrincipal object, и (2) я подтвердил, что работает другое известное имя группы.

Вторая Попытка: IsInRole ()

следующим шагом было пойти более старомодным путем и использовать IPrincipal.IsInRole() и снова возвращается false, другой true.

var wp = (WindowsPrincipal)User;

// false
var inGroup1 = wp.IsInRole(@"domaingroupName1");
// true
var inGroup2 = wp.IsInRole(@"domaingroupName2");

тупик... так что я включаю свои системы, ботаники, и мы перепроверяем. всё. Пользователь является членом группы? Да. Название группы пишется правильно? Да. Следующим шагом было поймать Сида.

третья попытка: Поиск коллекции группы идентичности

в моем контроллере я проверяю WindowsIdentity и просмотрите коллекцию групп для SID проблемной группы:

var wi = (WindowsIdentity)wp.Identity;
var group = wi.Groups.SingleOrDefault(g => g.Value == "group1-sidValue");

на group переменная

2 ответов


ответ:

по сути, это проблемы перевода между WindowsIdentity и NTAccount (обе эти системы.Безопасность.Принципал) и, наконец, фактическая запись Active Directory.

при проверке a WindowsIdentity против AD, если вы хотите использовать что-либо, кроме Sam или Sid, вам нужно будет использовать System.DirectoryServices.AccountManagement.

предостережение: в .Net 4.5 участники безопасности включают утверждения, но это вне контекста.


долго Объяснение:

в веб-приложении с проверкой подлинности Windows,HttpContext.User это WindowsPrincipal объект обертывания базового WindowsIdentity.

WindowsIdentity имеет для большинства намерений и целей, только два свойства, с помощью которых пользователем могут быть определены: Name и User.

эти свойства преобразуются в два свойства в соответствующей записи рекламного аккаунта идентификатора:

WindowsIdentity.Name = SamAccountName

WindowsIdentity.User = SID

на [Authorize] атрибут фильтра в конечном счете называет IsInRole(string role) на основного... и IsInRole() string overload создает экземпляр NTAccount С role ("SamAccountName" в записи объявления).

это объясняет сбой в #1 и #2 выше.

разрешить HttpContext.User против всего, кроме его / ее Sid или SamAccountName, вам понадобится DirectoryServices.AccountManagement или классический LDAP.


у меня есть ASP.Net приложение MVC с использованием проверки подлинности Windows, и я проверяю членство в группе для безопасности действий контроллера. Как бы просто это ни звучало, я не нашел другого вопроса, который может решить проблему, которую я испытываю. Мне потребовалось много времени, чтобы найти что-то http://www.c-sharpcorner.com/uploadfile/scottlysle/test-for-user-group-membership-in-Asp-Net-C-Sharp/

мой код, чтобы проверить, принадлежит ли пользователь к группе объявлений :

foreach (System.Security.Principal.IdentityReference group in System.Web.HttpContext.Current.Request.LogonUserIdentity.Groups)
{
     if (String.Equals(group.Translate(typeof(System.Security.Principal.NTAccount)).ToString(), @"your_domain_name\your_group_name", StringComparison.InvariantCultureIgnoreCase))
     {
         // the user belongs to a group 
     }
}

это все, что мне нужно, кроме <authentication mode="Windows"/> в Интернете.файл config