Проверьте членство в роли другого пользователя (IsInRole, WindowsIdentity / Principal) - PullRequest
1 голос
/ 12 декабря 2011

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

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

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

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

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

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


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

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

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

Спасибо

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

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

1 Ответ

2 голосов
/ 12 декабря 2011

Основываясь на комментарии Роба А., 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, но я думаю, это то, что я должен сделать для себя.

...