Авторизация WCF - доступ к операциям через заявки - PullRequest
2 голосов
/ 18 июля 2009

Я пытаюсь реализовать авторизацию для службы WCF, но столкнулся с некоторыми существенными трудностями. Я думаю, что мне нужно использовать гибридное решение, сочетающее пользовательскую аутентификацию и утверждения, но я не уверен, что это правильно.

Мое приложение использует проверку подлинности Windows для подключения к приложению. Как только пользователь авторизован, доступ к функциям должен быть предоставлен на основе информации о разрешениях, хранящейся в базе данных.

Пользователям могут быть назначены разрешения через интерфейс приложения. Один уровень иерархии разрешений соответствует доступу к отдельным функциям WCF:

  • Доступ к модулю (чисто организационный)
    • Доступ к функции (доступ к функции WCF, проверяется автоматически)
      • Разрешения для конкретных функций (динамически проверяется в коде)

Пример структуры и использования:

  • Доставка
    • Может создать отправку
      • Может переопределять соглашения об именах
    • Может отгрузка
      • Должен быть проверен руководителем
      • Может генерировать таможенную документацию ...

</p> <pre> class ShippingService : IShippingService { // Access corresponds to "Can create shipment" permission public bool <b>CreateShipment</b>(string name) { ... // Check the function-specific permission dynamically. if (!ConformsToNamingConvention(name) && !<b>CheckPermission(Permissions.CanOverrideNamingConvention)</b>) return false; .... return true; } } </pre> <p>

Я думаю, что мне нужно создать собственную Политику авторизации путем реализации IAuthorizationPolicy. Это позволит подключиться к базе данных, получить права доступа для пользователя и добавить заявку для каждого из разрешений. Затем мне нужно будет создать собственный менеджер авторизации, который будет сравнивать запрошенное действие со списком заявок, чтобы определить, авторизован ли подключающийся пользователь.

Это правильный способ подойти к этому, или я:

а) усложнение вопроса или

b) неправильное использование компонентов WCF (таких как утверждения, IAuthorizationPolicy, AuthorizationManager ...)

Заранее благодарим за любую помощь и наилучшими пожеланиями.

1 Ответ

2 голосов
/ 19 июля 2009

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

Если вы можете жить с предопределенными ролями, есть несколько решений. Вы проверили поставщика ролей ASP.NET ? Он является частью более общего набора поставщиков членства и ролей ASP.NET, но его также можно использовать отдельно.

Чтобы активировать его, используйте этот фрагмент в своей конфигурации (как только вы настроите базовую инфраструктуру для поставщика ролей ASP.NET):

<behaviors>
 <serviceBehaviors>
  <behavior name="CalculatorServiceBehavior">
   <serviceAuthorization principalPermissionMode ="UseAspNetRoles"
                         roleProviderName ="SqlRoleProvider" />
  </behavior>
 </serviceBehaviors>
</behaviors>

Единственная другая идея, которую я имею, - это просмотр диспетчера авторизации (AzMan): это набор инструментов, который позволяет вам указывать довольно детальные «атомарные» разрешения, которые бизнес-пользователь может затем объединять в роли и назначать пользователей этим , Но, в конце концов, на нижнем уровне гранулярных функций программы («Задачи» в AzMan) вы снова имеете дело со статическим набором прав.

Ознакомьтесь с этой статьей MSDN о AzMan в качестве вступления и ознакомьтесь с этой статьей в руководстве по безопасности WCF о том, как использовать ее из службы WCF. Я не знаю текущего статуса AzMan и не знаю, будет ли он развиваться дальше - это выглядит как-то не похоже (но я не уверен в этом на 100%).

Марк

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