Требования:
WCF 4.0
Хост IIS
Обычная аутентификация с пользовательским источником
RESTful
Существует множество примеров и способов реализации базовой аутентификации, от использования UserNamePasswordValidator , минимума ServiceAuthorizationManager и IDispatchMessageInspector и т. Д.
Проблема, с которой я сталкиваюсь, заключается в том, что проверка на самом деле будет получать гораздо больше информации из бэкэнда аутентификации, чем ответ да / нет. И я хочу как-то передать эту информацию вызванным сервисным методам (то есть это будет полноценный пользовательский объект со многими свойствами для управления поведением сервиса). Я хочу избежать повторного вызова хранилища пользователей для получения данных на основе имени пользователя, к которому я могу получить доступ из контекста безопасности.
Пока что самое близкое, что я нашел, это это решение , в котором используется стартовый комплект REST WCF RequestInterceptor, в котором я могу внедрить подкласс ServiceSecurityContext для продолжения мои данные и приведение ServiceSecurityContext.Current обратно в метод обслуживания.
Проблема с вышесказанным в том, что он написан для WCF 3.5, и что я хотел бы избежать использования Starter Kit.
Вопрос: любая идея, какое место было бы наиболее подходящим для цепочки в цепочке, чтобы я мог передавать данные из логики валидации в службу. Или, другими словами, где я мог бы заменить контекст безопасности на мой собственный, чтобы нести нагрузку? Или любой другой механизм несущей?
Что мне нужно, так это поведение:
Клиент (может быть браузер) пытается использовать сервис: GET https://myservcer/service/data
Сервер отвечает «Необходима базовая аутентификация»
Клиент предоставляет заголовок Basic Authentication и снова отправляет запрос
Сервер, основываясь на user / pass в заголовке, вытаскивает объект User из базы данных.
Если пользователь не найден, запросите аутентификацию снова
Если пользователь найден, объект User каким-то образом передается служебному методу
Все это должно произойти без повторного обращения к базе данных
Пока что я понимаю, что UserNamePasswordValidator не будет делать - нет способа передать объект User, если я получу его там.
Я могу создать собственный IAuthorizationPolicy или SecurityToken (который) и поместить объект User. Но ... где это должно произойти. Могу ли я пойти с UserNameSecurityTokenAuthenticator для этого? Будет ли возвращаться правильный код ошибки HTTP для запроса учетных данных? Как / где я могу изменить web.config, чтобы использовать мои собственные вещи? Пока что я вижу, как настроить использование только пользовательского UserNamePasswordAuthenticator.
РЕДАКТИРОВАТЬ: пожалуйста, проверьте мой собственный ответ для моего подхода. Тем не менее вопрос был хорош, и ответы, которые я получил, были ценными.