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

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

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

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

Есть идеи?

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

Это достаточно просто сделать, если вы размещаете службу WCF на аутентифицированном сайте IIS.

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

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

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

[AspNetCompatibilityRequirements(
    RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]

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

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

Похоже, вы ищетеСлужба проверки подлинности 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).

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

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