Проверьте членство в роли другого пользователя (IsInRole, WindowsIdentity/Principal)

Я пишу код ASP.NET для работы во внутренней сети, где будет использоваться проверка подлинности Windows. Некоторые операции потребуют от меня проверки членства в группе других пользователей (не текущего пользователя).

ПРИМЕЧАНИЕ. Я НЕ пытаюсь выдать себя за эту учетную запись или получить доступ к какой-либо информации в контексте этого другого пользователя. Просто пытаюсь выяснить, что это за пользователь для внутренней бизнес-логики.

Моей первой мыслью было использовать

new WindowsPrincipal(new WindowsIdentity("MACHINENAME\\username"))
      .IsInRole("MACHINENAME\\Group1")

Однако конструктор WindowsIdentity завершается с ошибкой SecurityException «Предоставленное имя не является правильно сформированным именем учетной записи».

Если я удалю MACHINENAME\ из параметра, я получу другую ошибку: В настоящее время нет доступных серверов входа в систему для обслуживания запроса на вход.


Поставщик роли WindowsTokenRoleProvider явно работает только с текущим пользователем и не будет проверять учетные записи других пользователей.

Существуют ли ограничения безопасности для проверки ролей других пользователей? Будет ли иметь значение, если веб-сервер будет находиться в домене, а я проверяю учетные записи домена?

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

Спасибо

ОБНОВЛЕНИЕ: теперь я смог протестировать это на домене - код работает в контексте AD, если я не использую доменное имя (проверить «имя пользователя» против «Группа1», а не «ДОМЕН\имя пользователя»). " против "ДОМЕН\Группа1")

Итак, как мне заставить это работать в контексте локальных пользователей и групп?


person Clyde    schedule 12.12.2011    source источник
comment
Клайд, вы пытались настроить ContextTypes и ContextOptions и тому подобное. Кажется, я могу справиться с проверкой домена или dmz, но в моем решении используется сервер ldap. _connection = new PrincipalContext(ContextType.Domain, _ldapserver, DC=domainname, DC=com, ContextOptions.SimpleBind, _adminUser, _adminPassword);   -  person Rob Allen    schedule 12.12.2011
comment
PrincipalContext кажется решением... это работает для меня.   -  person Clyde    schedule 12.12.2011


Ответы (1)


Основываясь на комментарии Роба А, PrincipalContext и UserPrincipal — это классы, которые мне, по-видимому, нужно использовать:

   using (PrincipalContext ctx = new PrincipalContext(ContextType.Machine))
        {

            var u = UserPrincipal.FindByIdentity(ctx, IdentityType.Name, "username");

            var b = u.IsMemberOf(ctx, IdentityType.Name, "Group1");


            var groups = u.GetAuthorizationGroups();

        }

И, изменив ContextType, можно переключаться между локальными учетными записями и учетными записями AD. Я бы хотел, чтобы это было встроено в RoleProvider, но я думаю, что это то, что мне придется сделать для себя.

person Clyde    schedule 12.12.2011