У меня есть код, который выглядит примерно так:
[PrincipalPermission(SecurityAction.Demand, Role = "RoleA")]
class Foo
{
[PrincipalPermission(SecurityAction.Demand, Role = "RoleB")]
public static bool Bar()
{
return true;
}
}
Если я попытаюсь запустить Foo.Bar();
, он не сработает, если у меня нет RoleA, но никогда не проверяет RoleB. Он работает независимо от того, есть ли у меня RoleB, если у меня есть RoleA.
Если я удалю [PrincipalPermission(SecurityAction.Demand, Role = "RoleA")]
из определения класса, тогда он проверяет RoleB как ожидалось.
Я обыскал и нашел эту точную проблему, упомянутую в двух разных SO-вопросах ( здесь и здесь ) с нет ответа в любом случае. У одного есть комментарий, который указывает на старую ссылку Microsoft Connect, которая якобы содержит ответ, но нет комментариев или ответов, которые действительно говорят, в чем проблема.
Я действительно очень благодарен за любую помощь в этом .
Несколько запросов PrincipalPermissionAttribute Объединяются с использованием OR, поэтому в вашем случае:
Из-за этого ваш код эквивалентен:
Если вы хотите Комбинация Задачи с использованием AND, вы должны указать Role = как список, разделенный запятыми, например"RoleA, RoleB". Или используйте SecurityAction.Deny соответствующим образом.
Пример ниже иллюстрирует это:
PrincipalPermissionAttribute
. В основном CAS в CLR должен, по-видимому, оценивать все активныеPrincipalPermissionAttribute
'перед выполнением метода и делать свои вещи. Я лично не буду пытаться настраивать атрибут; почему бы просто не использовать роли, разделенные запятыми?