Ограничения безопасности на основе ролей Winforms - PullRequest
3 голосов
/ 11 апреля 2010

Я внедряю безопасность на основе ролей, используя членство в Microsoft и поставщик ролей.

Теоретическая проблема, с которой я столкнулся, заключается в том, что вы выполняете определенную роль в таком методе, как:

[PrincipalPermissionAttribute(SecurityAction.Demand, Role="Supervisor")]
private void someMethod() {}

Что если в какой-то момент в будущем я не не хочу, чтобы супервизоры больше обращались к someMethod ()?

Разве я не должен был бы изменить исходный код, чтобы сделать это изменение? Я что-то упустил?

Кажется, должен быть какой-то способ абстрагировать связь между ролью супервизора и методом, чтобы я мог создать в приложении способ изменить эту связь разрешения роли с методом.

Любое понимание или направление будет оценено. Спасибо.

Ответы [ 2 ]

5 голосов
/ 11 апреля 2010

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();
    }
}
5 голосов
/ 11 апреля 2010

Если вы используете декларативный подход, тогда да - если вы вдруг не хотите, чтобы члены Supervisor могли вызывать ваш метод, вам нужно изменить исходный код для этого.

Однако вы также можете делать все это в программном коде:

private void someMethod() 
{
    WindowsPrincipal currentUser = (Thread.CurrentPrincipal as WindowsPrincipal);
    if (currentUser != null)
    {
        if (currentUser.IsInRole("Supervisor"))
        {
            // do something here
        }
    }

}

Вы всегда можете получить текущий участник Windows, под которым работает приложение Winforms, а затем вы можете вызвать метод IsInRole дляпроверьте, находится ли данный пользователь в данной роли.Конечно, вы также можете сделать все это настраиваемым, например, прочитать нужную роль из файла конфигурации, и если вы хотите, чтобы все могли войти, просто измените роль на Users или что-то

...