Какой принципал проверяет PrincipalPermission.Demand ()? - PullRequest
0 голосов
/ 24 сентября 2018

У меня есть код в общей библиотеке, которая выполняет проверку авторизации следующим образом

AppDomain.CurrentDomain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal);    
new PrincipalPermission(null, "AD_GROUP_NAME").Demand();

У меня возникают некоторые проблемы, когда он вызывается из сторонней структуры планирования заданий.Проверка не пройдена.Я пытался выяснить, почему.Когда я проверяю значение WindowsIdentity.GetCurrent().Name, это один пользователь (UserA), а когда я проверяю Thread.CurrentPrincipal.Identity.Name, это другой пользователь (UserB).Оба пользователя должны иметь правильный доступ, поэтому он не должен выходить из строя.Я подозреваю, что он проверяет что-то, кроме этих двух.

Я сделал небольшую тестовую программу, которая только проверяет.Я использовал команду Runas, чтобы запустить ее как с UserA, так и с UserB, и оба проходили проверку, когда я делаю это таким образом.

Обновление: я почти уверен, что проверка сделана против Thread.CurrentPrincipal (то есть. UserB).Когда я отлаживаю, я вижу, что принципал является ClaimsPrincipal, а не WindowsPrincipal.Я предполагаю, что вызов SetPrincipalPolicy не имеет эффекта.Документация, кажется, намекает, что вызов должен быть выполнен, потому что поток создан, и это не так.Сторонний фреймворк устанавливает поток прежде, чем он достигнет моего кода.

1 Ответ

0 голосов
/ 24 сентября 2018

Проблема заключалась в том, что Thread.CurrentPrincipal не был принципалом Windows.

Я добавил некоторый код, чтобы установить для принципала новый WindowsPrincipal на основе WindowsIdentity.GetCurrent().После того как я проверил авторизацию, я восстановил принципал до прежнего значения, такого как

var savedPrincipal = Thread.CurrentPrincipal;
try
{
     Thread.CurrentPrincipal = new WindowsPrincipal(WindowsIdentity.GetCurrent());

     // Call the code that does the authorization check
}
finally
{
     Thread.CurrentPrincipal = savedPrincipal;
}

. Это также делает проверку прав UserA, что я бы предпочел.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...