Передача токена SAML в службу WCF из Asp.Net

Когда я пытаюсь вызвать службу WCF из приложения asp.net (RP), которое аутентифицируется другим приложением asp.net (IP), я получаю сообщение об ошибке с содержимым страницы входа в систему (оно пытается войти в систему. страницу, потому что не удалось проверить подлинность запроса).

Поставщик удостоверений: _http: //localhost/AuthenticatonWS/Login.aspx

Веб-сайт проверяющей стороны: _http: //localhost/RPWebsite/Default.aspx

Служба WCF: _http: //localhost/RPWebsite/Service1.svc

(В моем решении я вызываю service1.svc из default.aspx.cs)

Я не хочу, чтобы сервис был анонимным. В настоящее время сайт (RPWebsite) использует STS и доверяет локальному провайдеру удостоверений, но на производстве он может доверять любому внешнему провайдеру удостоверений через ADFS.

Может ли кто-нибудь подсказать мне, как я могу передать информацию о токене в службу со страницы aspx, я пробовал несколько примеров из Интернета, но не смог заставить его работать.


person user1294385    schedule 27.03.2012    source источник


Ответы (2)


Проблема вполне может заключаться в том, что RPWebsite использует ClaimsAuthorizationModule в <system><httpModules> или <system.webserver><modules> в web.config. Это приводит к тому, что любой вызов веб-службы перенаправляется на STS для аутентификации, как если бы это был интерактивный запрос браузера, как вы заметили.

Кроме того, этот модуль можно добавить в раздел web.config, относящийся к WIF, то есть в <microsoft.identityModel><service>, и в этом случае этот модуль используется только для вызовов веб-службы WCF на основе утверждений. Вы добавляете его в следующей форме: <claimsAuthorizationManager type="MyNamespace.CustomClaimsAuthenticationManager, MyAssembly"/>. (Этот тип должен расширять ClaimsAuthorizationManager, как описано на странице документации WIF "ClaimsAuthenticationManager, ClaimsAuthorizationManager и OriginalIssuer".)

Ссылка: Витторио Берточчи, «Программирование WIF», стр. 43.

person MarnixKlooster ReinstateMonica    schedule 27.03.2012

Думаю, есть несколько вариантов:

  1. Использование постоянных файлов cookie аутентификации, поддерживающих несколько клиентских сеансов. Или поддержите сеанс обмена между вашей службой RP и WCF, чтобы WCF мог повторно использовать файлы cookie проверки подлинности, выпущенные для RP, когда RP обращается к службе WCF. Если честно, я никогда не пробовал реализовать это в действии. Это всего лишь моя теория.
  2. Create an separate authentication service which require no user-interaction (such as entering username/password). And then you have plenty of way to call WCF from your RP:
    • From your RP, ask the authentication service to issue a token for WCF; attach the token into request header of WCF call (e.g.: Authorization); then call WCF service. This requires a custom HttpModule to accept custom request header containing token at WCF service.
    • Из своей RP вы также можете сохранить имя пользователя / пароль или уникальное утверждение идентификации пользователя, которое может идентифицировать пользователя; прикрепите эту информацию к заголовку запроса вызова WCF (например: авторизация); затем вызовите службу WCF. Это также требует, чтобы настраиваемый HttpModule принимал настраиваемый заголовок запроса в службе WCF.

Я бы порекомендовал второй вариант, более полезную информацию и рекомендации вы можете найти в Блог Доминика Байера.

Только мои 2 цента.

person Duy Pham    schedule 15.10.2013