Как передать больше данных, чем имя пользователя / пароль, в метод службы в службе RESTful WCF 4.0 с использованием базовой аутентификации

Требования:

WCF 4.0 Хост IIS Базовая аутентификация с настраиваемым источником RESTful

Существует множество примеров и способов реализации базовой аутентификации с помощью UserNamePasswordValidator , через ServiceAuthorizationManager и IDispatchMessageInspector и т. Д.

Проблема, с которой я столкнулся, заключается в том, что проверка на самом деле получит гораздо больше информации из бэкэнда аутентификации, чем ответ да / нет. И я хочу каким-то образом передать эту информацию вызываемым методам службы (т.е. это будет полноценный объект User со многими свойствами для управления поведением службы). Я хочу избежать второго обращения к пользовательскому хранилищу для извлечения данных на основе имени пользователя, к которому я могу получить доступ из контекста безопасности.

На данный момент наиболее близким, что я нашел, является это решение , который использует RequestInterceptor WCF REST Starter Kit , в котором я могу внедрить подкласс ServiceSecurityContext для передачи моих данных и вернуть ServiceSecurityContext.Current обратно в метод службы.

Проблема с выше, это то, что он написан для WCF 3.5, и я бы хотел избежать использования Starter Kit.

Вопрос: есть идеи, какое место в цепочке лучше всего использовать, чтобы я мог передавать данные от логики проверки к сервису. Или, другими словами, где я мог бы заменить контекст безопасности на свой собственный, чтобы нести нагрузку? Или какой-либо другой механизм связи?

Мне нужно такое поведение:

Клиент (может быть браузер) пытается использовать службу: GET https: // myservcer / service / data Сервер отвечает «Требуется базовая аутентификация» Клиент предоставляет заголовок базовой аутентификации и снова отправляет запрос. Сервер на основе user / pass в заголовке извлекает объект User из базы данных. Если пользователь не найден, повторно запросите аутентификацию Если пользователь найден, объекту User каким-то образом передается служебный метод. Все это должно происходить без повторного обращения к базе данных

На данный момент я понимаю, что UserNamePasswordValidator не будет работать - нет способа передать объект User, если я извлечу его там.

Я могу создать собственный IAuthorizationPolicy или SecurityToken (какой именно) и поместите объект User. Но ... где это должно произойти.Могу ли я использовать для этого UserNameSecurityTokenAuthenticator? Будет ли он возвращать правильный код ошибки HTTP для запроса учетных данных? Как / где я изменяю web.config, чтобы использовать свои собственные данные? Пока я вижу, как настроить использование только настраиваемого UserNamePasswordAuthenticator.

РЕДАКТИРОВАТЬ: пожалуйста, проверьте мой собственный ответ для моего подхода. Тем не менее вопрос был хорошим, и я получил ценные ответы.

10
задан Community 23 May 2017 в 12:24
поделиться