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

Требования:

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.

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

Ответы [ 3 ]

4 голосов
/ 29 июля 2011

Мы внедрили наш собственный модуль HTTP аутентификации. Модуль подключается к событию «Проверка подлинности по запросу» приложения HttpApplication и запускает проверку подлинности на основе серверной части. Сервер может свободно возвращать все, что хочет (и в нашем случае он возвращает больше, чем да / нет. Возвращаемый объект реализует интерфейс System.Security.Principal.IIdentity. После успешной аутентификации мы присоединяем идентификатор (объект, возвращаемый auth) субъекту, который переносится в HttpContext.User.

Вниз по конвейеру вы можете в любой момент получить доступ к пользователю текущего контекста и получить всю информацию о вашей личности.

Единственным существенным недостатком этого подхода является то, что он требует совместимости с ASP.net, но если вы уже используете такие службы Rest, то это не должно быть проблемой.

0 голосов
/ 09 сентября 2011

В итоге я вообще не использовал WCF. Нэнси было намного проще создавать и тестировать RESTFull API, и с последними изменениями (это будет в версии 0,8), о чем я спрашивал, очень легко.

0 голосов
/ 28 июля 2011

Вы можете создать реализацию IAuthorizationPolicy и заменить основной идентификатор на тот, который вы получаете во время аутентификации. Посмотрите на эти ссылки, которые показывают, как избежать попадания в базу данных дважды:

WCF Custom Validator: Как инициализировать объект «Пользователь» из пользовательского валидатора

Когда и где установить пользовательскую идентификацию при реализации пользовательской аутентификации

...