Я пытаюсь реализовать авторизацию для службы 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 ...)
Заранее благодарим за любую помощь и наилучшими пожеланиями.