Передача 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 для ограничения доступа по роли или отдельным пользователям.