PrincipalPermissionAttribute
обычно не используется во многих приложениях, над которыми я работал, по причине, которую вы затронули; атрибут применяет политику, которая может быть изменена только путем изменения кода.
Альтернатива - использовать класс PrincipalPermission
напрямую. Все атрибуты безопасности разрешаются в классы с одинаковыми именами и вызовы методов во время выполнения. В случае вашего атрибута выполняется следующий код:
PrincipalPermission permission = new PrincipalPermission(null, "Supervisor");
permission.Demand(); // Throws SecurityException if user is not in the role.
Если вы используете классы разрешений напрямую, вы получаете больше контроля над тем, как формируются ваши разрешения. У вас может быть база данных, которую вы запрашиваете, чтобы получить список ролей и выполнить запрос на них, например:
private void someMethod()
{
IEnumerable<string> roles = GetRolesForMethod("someMethod");
PrincipalPermission permission = null;
foreach(string role in roles)
{
if(permission == null)
{
permission = new PrincipalPermission(null, role);
}
else
{
permission = permission.Union(
new PrincipalPermission(null, role);
);
}
}
if(permission != null)
{
permission.Demand();
}
}