Использование пользовательских атрибутов для создания Role Checker - PullRequest
2 голосов
/ 30 марта 2011

Рассмотрим следующую строку кода, вводимого в каждую операцию моего ServiceContract:

if (!Roles.IsUserInRole("Administrators")) 
    throw new Exception("You are not authorized to perform this operation");

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

Вместо этого я хотел бы создать собственный атрибут, который я мог бы иметь в моих OperationContracts: RequireMinimumRoleAttribute, который бы выглядел следующим образом: [RequireMinimumRole("Administrators"].

Прежде всего, я хочу, чтобы это работало как контекст фильтра в MVC, я хочу проверить Роль до того, как будет вызвана фактическая операция. Это возможно?

Во-вторых, я хотел бы иметь еще один атрибут, который я наложил на мой ServiceContract: FallbackRequireMinimumRoleAttribute, который использовался бы, если бы RequireMinimumRoleAttribute не был указан в определенной операции.

Пример

Договор на обслуживание

[ServiceContract]
public class ICalculator
{
    [OperationContract]
    public int Add(int a, int b);

    [OperationContract]
    public string Information();
}

Осуществление

[FallbackRequireMinimumRole("Users")]
public class Calculator : ICalculator
{
    [RequireMinimumRole("Administrators")]
    public int Add(int a, int b) { return a + b; }

    public string Information() { return "This is a calculator service"; }
}

В этом случае Add потребует права администратора, а операция Information потребует только права пользователя.

Возможно ли это? Если да, то как?

Ответы [ 2 ]

1 голос
/ 30 марта 2011

Вот один из возможных способов:

Реализация пользовательского IOperationInvoker, который упаковывает существующий Invoker в DispatchOperation. Он должен просто выполнить проверку авторизации, прежде чем связать его с исходным инициатором для отправки операции. Для этого потребуется ctor, который берет IOperationInvoker (тот, в котором он находится), и имя роли для проверки.

Чтобы установить соответствующие экземпляры пользовательского активатора при сборке среды выполнения диспетчера WCF: внедрите IOperationBehavior в RequireMinimumRoleAttribute и IServiceBehavior в FallbackRequireMinimumRoleAttribute. В каждом случае реализация ApplyDispatchBehavior должна перемещаться по объекту DispatcherRuntime, чтобы найти соответствующий Invoker экземпляр (ы) для переноса и замены на пользовательский.

1 голос
/ 30 марта 2011

Я не уверен относительно ваших провайдеров аутентификации \ авторизации, но посмотрите на атрибут PrincipalPermissionAttribute, если он может решить вашу проблему.Отметьте здесь Как: ограничить доступ с помощью класса PrincipalPermissionAttribute

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...