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

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

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

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

Есть идеи?

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

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

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

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

    Чтобы гарантировать, что оба приложения могут шифровать / дешифровать файл cookie проверки подлинности форм таким же образом, вы должны настроить элемент для обоих приложений (в web.config или machine.config в зависимости от того, хотите ли вы сделать это на машине или приложении уровень). Вы должны посмотреть на атрибуты validationKey , decryption и decryptionKey .

    Убедитесь, что ваши элементы в обоих файлах web.config настроены аналогичным образом. В частности, атрибуты name , path и domain .

    Вероятно, это относится только к файлам cookie, переданным в / из веб-браузера (но может быть полезно в этом случае). Чтобы разрешить передачу файлов cookie между веб-сайтами http://www.foo.com и bar.foo.com, вы должны настроить forms элемент, как показано ниже, чтобы cookies устанавливались на одном сайте и успешно передавались другому:

      

    Передача файла cookie в службу WCF, вероятно, будет сложным битом. Я не очень опытен с WCF, поэтому я адаптировал код с kennyw.com :

     HttpRequestMessageProperty httpRequestProperty = new HttpRequestMessageProperty(); httpRequestProperty.Headers.Add(HttpRequestHeader.Cookie, ""); using (OperationContextScope scope = new OperationContextScope(serviceClient.InnerChannel)) { OperationContext.Current.OutgoingMessageProperties[HttpRequestMessageProperty.Name] = httpRequestProperty; serviceClient.MethodName(); } 

    Если вы размещаете WCF в IIS (а не самостоятельно), вы можете передать запрос WCF через конвейер обработки ASP.NET, установив

        

    Если вы являетесь самостоятельным хостингом, вы можете изучить заголовки запросов, используя свойства входящего сообщения в OperationContext.Current.IncomingMessageProperties и получить значение cookie для проверки подлинности форм и расшифровать его с помощью FormsAuthentication.Decrypt(string) .

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

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

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

        

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

     [AspNetCompatibilityRequirements( RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] 

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

    Давайте будем гением компьютера.