Подтвердить что ты не робот

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

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

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

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

Любые идеи?

4b9b3361

Ответ 1

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

EDIT:

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

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

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

Я не знаю, будет ли это работать, но хотелось бы услышать, если это произойдет!

Ответ 2

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

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

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

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

[AspNetCompatibilityRequirements(
    RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]

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