Я пытаюсь реализовать авторизацию для службы WCF, но столкнулся с некоторыми существенными трудностями. Я думаю, мне нужно использовать гибридное решение, сочетающее пользовательскую аутентификацию и утверждения, но я не уверен, правильно ли это.
Мое приложение использует проверку подлинности Windows для подключения к приложению. После авторизации пользователя необходимо предоставить доступ к функциям на основе информации о разрешениях, хранящейся в базе данных.
Пользователям могут быть назначены разрешения через интерфейс приложения. Один уровень иерархии разрешений соответствует доступу к отдельным функциям WCF:
- Access to module (purely organizational)
- Access to function (access to WCF function, checked automatically)
- Function-specific permissions (checked dynamically in code)
- Access to function (access to WCF function, checked automatically)
Структура образца и использование:
- Shipping
- Can Create Shipment
- Can override naming conventions
- Can Package Shipment
- Must be verified by supervisor
- Могу формировать таможенную документацию ...
- Can Create Shipment
class ShippingService : IShippingService { // Access corresponds to "Can create shipment" permission public bool CreateShipment(string name) { ... // Check the function-specific permission dynamically. if (!ConformsToNamingConvention(name) && !CheckPermission(Permissions.CanOverrideNamingConvention)) return false; .... return true; } }
Я думаю, что мне нужно создать настраиваемую политику авторизации, реализовав IAuthorizationPolicy. Это подключится к базе данных, получит разрешения для пользователя и добавит утверждение для каждого из разрешений. Затем мне нужно будет создать настраиваемый диспетчер авторизации, который будет сравнивать запрошенное действие со списком утверждений, чтобы определить, авторизован ли подключающийся пользователь.
Это правильный подход к этому, или я:
а) чрезмерное усложнение проблемы, или
б) неправильное использование компонентов WCF (таких как утверждения, IAuthorizationPolicy, AuthorizationManager ...)
Заранее благодарим за любую помощь и с наилучшими пожеланиями.