Вопрос

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

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

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

Есть какие-нибудь идеи?

Это было полезно?

Решение

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

Редактировать:

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

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

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

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

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

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

[AspNetCompatibilityRequirements(
    RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top