Передача cookie-файла FormsAuthentication в службу WCF
-
23-08-2019 - |
Вопрос
У меня есть веб-сайт, который взаимодействует с удаленной веб-службой 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 для ограничения доступа по ролям или конкретным пользователям.