Я внедряю безопасный сервис WCF. Аутентификация выполняется с использованием имени пользователя / пароля или учетных данных Windows. Служба размещена в процессе службы Windows. Теперь я пытаюсь найти лучший способ реализации авторизации для каждой операции сервиса.
Например, рассмотрим следующий метод:
public EntityInfo GetEntityInfo(string entityId);
Как вы, возможно, знаете, в WCF существует объект OperationContext, из которого вы можете получить учетные данные безопасности, переданные абонентом / клиентом. Теперь аутентификация уже будет завершена к тому времени, когда будет вызвана первая строка в методе. Однако как мы реализуем авторизацию, если решение зависит от самих входных данных? Например, в приведенном выше случае, скажем, пользователям с правами администратора (чьи разрешения и т. Д. Хранятся в базе данных) разрешено получать информацию об объектах, а другим пользователям не разрешается ... куда мы помещаем проверки авторизации? 1010 *
Скажем, мы поместили его в первую строку метода следующим образом:
CheckAccessPermission(PermissionType.GetEntity, user, entityId) //user is pulled from the current OperationContext
Теперь есть пара вопросов:
Проверяем ли мы идентификатор объекта (например, проверяем нулевое / пустое значение и т. Д.) ДО проверки полномочий или ВНУТРИ проверки авторизации? Другими словами, если проверки авторизации должны быть включены в каждый метод, это хороший шаблон? Что должно произойти первым - проверка аргумента или авторизация?
Как мы можем провести модульное тестирование службы WCF, когда проверки авторизации повсеместно, как это, и у нас нет OperationContext в модульном тесте !? (Предполагается, что я пытаюсь протестировать реализацию этого класса обслуживания напрямую, без установки WCF).
Есть идеи, ребята?