Поведение SecurityManager.IsGranted () - PullRequest
3 голосов
/ 22 ноября 2008

Кто-нибудь может объяснить, пожалуйста, следующее поведение c #? Я написал небольшое консольное приложение, чтобы узнать о CAS, но не могу понять, почему следующие строки кода работают так, как они:

string[] myRoles = new string[] { "role1", "role2", "role3" };
GenericIdentity myIdentity = new GenericIdentity("myUsername", "customAuthType");
GenericPrincipal myPrincipal = new GenericPrincipal(myIdentity, myRoles);

System.Threading.Thread.CurrentPrincipal = myPrincipal;

Console.WriteLine(SecurityManager.IsGranted(new PrincipalPermission(null, "role1")));
Console.WriteLine(SecurityManager.IsGranted(new PrincipalPermission(null, "roleX")));

Вывод «true» для обоих вызовов SecurityManager.IsGranted ().

Если я добавлю следующие строки:

 new PrincipalPermission(null, "role1").Demand();
 new PrincipalPermission(null, "roleX").Demand();

первый вызов по требованию проходит, но второй (как и ожидалось) вызывает исключение SecurityException.

Почему SecurityManager.IsGranted () не возвращает вызов false для разрешения roleX?

Ответы [ 3 ]

1 голос
/ 26 ноября 2008

Из ответов на аналогичный вопрос здесь видно, что IsGranted () работает только с разрешениями CAS, но не с разрешениями не-CAS.

Цитаты из статьи:

SecurityManager.IsGranted () определяет дается ли разрешение изучение разрешений CAS, которые были предоставлены администратор. поскольку WorkingTimePermission не является CAS разрешение, что означает безопасность политики, установленные администратором, имеют не влияет на это разрешение. Другими словами, нет никакого способа для администратор, чтобы предоставить или отозвать [не-CAS разрешение]. Следовательно SecurityManager.IsGranted () будет всегда возвращать ложь для [разрешение не в CAS].

и

Мне потребовалось некоторое время, чтобы привыкнуть к CAS по сравнению с разрешениями не-CAS, и понять, что ключевые фразы, как только "политики безопасности" и "политика" применить к разрешениям CAS. Однажды я получил удобно с этим, расшифровывая по-видимому невинные записи справки, такие как SecurityManager. Замечания IsGranted раздел стал намного проще:

«Предоставление разрешений определяется по политике ... "

Это подразумевает - но явно не заявить - что метод работает только с разрешениями CAS, потому что это проверка текущей политики безопасности. Требуется некоторое привыкание.

1 голос
/ 13 июня 2013

В .NET 4.0 SecurityManager.IsGranted устарел.

Это то, что было, и если вы скомпилируете в .NET 4.0 совместимость, он будет жаловаться.

bool isGranted = SecurityManager.IsGranted(new SecurityPermission(SecurityPermissionFlag.Infrastructure))

Чтобы исправить это:

var permissionSet = new PermissionSet(PermissionState.None);
permissionSet.AddPermission(new SecurityPermission(SecurityPermissionFlag.UnmanagedCode));
bool isGranted = permissionSet.IsSubsetOf(AppDomain.CurrentDomain.PermissionSet);

Справка:
http://www.stringbuilder.net/post/2009/07/31/In-NET-40-SecurityManagerIsGranted-is-obsolete.aspx

0 голосов
/ 23 ноября 2008

Я считаю, SecurityManager.IsGranted в основном рассматривает требования к коду (сборка и т. Д.), А не конкретные требования, такие как основные разрешения.

Чтобы делать то, что вы хотите:

    static bool HasAccess(string role)
    {
        IPrincipal principal = System.Threading.Thread.CurrentPrincipal;
        return principal == null ? false : principal.IsInRole(role);
    }
...