Преобразование декларативного основного платежа в программный. Спрос - PullRequest
3 голосов
/ 21 декабря 2010

У меня сейчас две роли:

[PrincipalPermission (SecurityAction.Demand, Роль = "Домен \ Admin")] [PrincipalPermission (SecurityAction.Demand, Роль = "Домен \ AnotherRole")]

Проблема в том, что этот унаследованный код специфичен для домена, и я хочу в итоге получить роли из файла web.config, чтобы я мог работать на виртуальной машине, не входящей в домен.

Я видел такой пример:

PrincipalPermission permCheck = new PrincipalPermission(
                                     null, 
                                     @"Domain\Admin"); 
permCheck.Demand();

Поскольку это вызывает исключение, если пользователь не в роли, как мне изменить этот пример, чтобы разрешить любую из двух ролей? Я мог бы использовать несколько IPrincipal.IsInRole () и затем выдать собственное исключение, но, похоже, есть способ использовать метод .Demand с несколькими ролями.

Обновление 12/21: пример кода на основе ссылки Union из ответа Ладислава ниже:

PrincipalPermission ppAdmin = new PrincipalPermission(null, @"Domain\Admin");
PrincipalPermission ppAnother = new PrincipalPermission(null, @"Domain\AnotherRole");
(ppAdmin.Union(ppAnother)).Demand();

Но AzMan (предложенный Ладиславом выглядит как лучшее, но более сложное решение).

1 Ответ

2 голосов
/ 21 декабря 2010

PrincipalPermission имеет метод Union .Этот метод позволяет объединить несколько PrincipalPermissions перед вызовом Demand.Но вместо использования императивных разрешений вы можете проверить Диспетчер авторизации (AzMan) и связанный поставщик ролей ( AuthorizationStoreRoleProvider ).Диспетчер авторизации позволяет вам определять абстрактные роли в вашем приложении и назначать реальные группы пользователей и роли через MMC.

...