Передача файла cookie FormsAuthentication службе WCF

У меня есть веб-сайт, который общается с удаленным веб-сервисом WCF. Оба используют один и тот же пользовательский поставщик FormsAuthentication. Я хотел бы пройти проверку подлинности с помощью службы WCF, олицетворяющей пользователя, который в данный момент вошел на сайт. Я уже сделал это вручную, используя учетные данные клиента UserName, но мне нужно знать пароль пользователя. Итак, то, что работает так далеко, это: аутентифицированный пользователь делает запрос, я создаю Service Client и устанавливаю его учетные данные:

serviceClient.ClientCredentials.UserName.UserName = username;
serviceClient.ClientCredentials.UserName.Password = password;

Но я действительно хочу передать cookie FormsAuthentication напрямую, потому что я не хочу хранить пароль пользователя.

Есть идеи?

 Joe Ratzer18 дек. 2009 г., 11:04
Привет Ариэль, как ты справился с этим? Я знаю кого-то с похожими проблемами.

Ответы на вопрос(2)

Решение Вопроса

Служба проверки подлинности Windows Communication Foundation.

EDIT:

После более внимательного прочтения вопроса (и после комментария Ариэля) я бы хотел отозвать вышеупомянутое предложение. Служба аутентификации WCF не добавит многого в этот сценарий.

Я не делал этого между WCF и ASP.NET, однако я настроил приложения ASP.NET для совместного использования пользователей, прошедших проверку подлинности с помощью форм, возможно, я смогу чем-то помочь.

Чтобы гарантировать, что оба приложения могут шифровать / дешифровать cookie-файл проверки подлинности форм таким же образом, вам следуетнастроить<machineKey> element для обоих приложений (в web.config или machine.config в зависимости от того, хотите ли вы сделать это на уровне компьютера или приложения). Вы должны посмотреть наvalidation, validationKey, decryption а такжеdecryptionKey атрибутов.

Убедитесь, что ваш<forms> элементы в обоих файлах web.config настроены одинаково. В частности,name, path а такжеdomain атрибутов.

Вполне вероятно, что это относится только к файлам cookie, передаваемым в / из веб-браузера (но может быть полезным в этом случае): чтобы файлы cookie передавались между веб-сайтами.www.foo.com а такжеbar.foo.com вы бы настроитьforms элемент следующим образом, чтобы файлы cookie могли быть установлены на одном сайте и успешно переданы другому:

<forms ... domain=".foo.com" ... />

Передача cookie в службу WCF, скорее всего, будет непростой задачей. Я не очень разбираюсь в WCF, поэтомуЯ адаптировал код от kennyw.com:

HttpRequestMessageProperty httpRequestProperty = new HttpRequestMessageProperty();
httpRequestProperty.Headers.Add(HttpRequestHeader.Cookie, "<Forms Authentication Cookie>");

using (OperationContextScope scope = new OperationContextScope(serviceClient.InnerChannel))
{
  OperationContext.Current.OutgoingMessageProperties[HttpRequestMessageProperty.Name] = httpRequestProperty;
  serviceClient.MethodName();
} 

Если вы размещаете WCF в IIS (а не самостоятельно), вы можете передать запрос WCF через конвейер обработки ASP.NET, установив

<system.serviceModel>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" ... />
</system.serviceModel>

Если вы самостоятельно размещаете хостинг, вы можете проверить заголовки запроса, используя свойства входящего сообщения вOperationContext.Current.IncomingMessageProperties и получить значение cookie проверки подлинности формы и расшифровать его, используяFormsAuthentication.Decrypt(string).

Я понятия не имею, сработает ли что-нибудь из этого, но хотелось бы услышать, если это сработает!

 Ariel Popovsky07 июл. 2009 г., 16:04
Спасибо за предложение, я попробую это и поделюсь результатами здесь.
 06 июл. 2009 г., 20:58
Привет Ариэль. Извините, я пытался ответить слишком быстро, не прочитав ваш вопрос. Я отредактирую его с обновлением.
 Ariel Popovsky06 июл. 2009 г., 19:53
Я не вижу, как может помочь служба аутентификации. Мой сценарий таков: USER - & gt; Веб-сайт A - & gt; Служба B WCF, размещенная в другом месте. Пользователь входит в систему A, A выполняет вызов B, используя учетные данные пользователя. Где бы вы добавили службу аутентификации?

если вы размещаете службу WCF на аутентифицированном сайте IIS.

Включите совместимость, добавив следующее в раздел system.ServiceModel в файле web.config.

<system.serviceModel>  
  <serviceHostingEnvironment aspNetCompatibilityEnabled="true" /> 
</system.serviceModel>

Затем украсьте каждую услугу, которую вы хотите принять cookie, следующим

[AspNetCompatibilityRequirements(
    RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]

Теперь объект HttpContext.Current.User.Identity будет заполнен правильно, и вы также можете использовать требования PrinciplePermission для ограничения доступа по роли или отдельным пользователям.

 Ariel Popovsky07 июл. 2009 г., 17:28
Я так думаю, приложение будет размещено во внутренней сети в рамках одного корневого домена. Мы также можем установить идентичные машинные ключи, но имейте в виду, что пользователь получает доступ к веб-сайту, и веб-сайт использует WCF в качестве источника данных, выдавая себя за пользователя. Он отлично работает с аутентификацией Windows, но передача cookie FormsAuthentication - это отдельная история. Я попробую предложение dariom (или любое другое, если оно доступно).
 07 июл. 2009 г., 17:15
Ах, черт возьми! Можете ли вы хотя бы поставить их на одно доменное имя? Если это так, вы можете установить область проверки подлинности форм cookie и поделиться ею таким образом.
 Ariel Popovsky07 июл. 2009 г., 16:06
Ну, это проблема, я не могу использовать тот же IIS. Требованием для системы, которую я строю, было размещение веб-сайта и службы на отдельных компьютерах. Я подумывал об использовании общего токена, но я использовал Forms - самое простое решение для реализации на ASP.net.
 07 апр. 2010 г., 15:04
Blowdart, просто хотел сообщить вам, что хотя этот ответ не ответил на вопрос автора, он ответил на мой. Я ценю, что вы не удалили его!

Ваш ответ на вопрос