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

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

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

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

Есть идеи?

2 ответа

Решение

Похоже, вы ищете службу аутентификации Windows Communication Foundation.

РЕДАКТИРОВАТЬ:

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

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

Чтобы гарантировать, что оба приложения могут шифровать / дешифровать cookie-файл проверки подлинности форм одним и тем же способом, необходимо настроить <machineKey> элемент для обоих приложений (в 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),

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

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

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

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

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

[AspNetCompatibilityRequirements(
    RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]

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

Другие вопросы по тегам