Как установить заголовок «Cookie» в новом запросе из ответа заголовка «Set-Cookie» для клиента SOAP в приложении WPF - PullRequest
0 голосов
/ 18 января 2019

Я интегрирую свое приложение WPF с двумя приложениями WCF (одно - «Приложение аутентификации», а другое - «настоящее» приложение, требующее аутентификации). «Приложение аутентификации» возвращает 3 Set-Cookie заголовка, и мне нужно добавить их в заголовок запроса «реального» приложения. Но я не уверен, как получить те заголовки (только результат), которые я могу получить:

AuthenticationApplicationService.SoapClient authenticationSoapClient = new AuthenticationApplicationService.SoapClient("AuthenticationApplicationServiceSoap");
bool loggedInSuccess = await authenticationSoapClient.PerformLoginAsync();
// how do I get the cookie headers from this call and set them on the next?

RealService.SoapClient realSoapClient = new RealService.SoapClient("RealServiceSoap");
realSoapClient.PostAsync("hello");

Этот первый вызов PerformLoginAsync возвращает true или false для успешного входа в систему, а заголовки включают Set-Cookie. Как я могу получить эти заголовки и установить Cookie заголовки при следующем запросе на PostAsync?

Если есть дополнительные вопросы, пожалуйста, дайте мне знать!

1 Ответ

0 голосов
/ 18 января 2019

Вы должны использовать OperationContext, у него есть свойства, которые могут отправлять cookie. Чтобы включить cookie, вам следует установить для свойства allowcookie значение true в конфигурации привязки.

 <bindings>
  <basicHttpBinding>
    <binding name="AuthSoap" allowCookies="true" />
  </basicHttpBinding>
</bindings>
<client>
  <endpoint address="http://localhost:63599/Auth" binding="basicHttpBinding"
    bindingConfiguration="AuthSoap" contract="Auth.AuthSoap" name="AuthSoap" />
</client>

Тогда вы можете вызвать метод входа в систему следующим образом.

 Auth.AuthSoapClient authSoapClient = new Auth.AuthSoapClient();
        using (new OperationContextScope(authSoapClient.InnerChannel))
        {
// please put the call of method in OperationContextScope
            authSoapClient.Login("admin", "admin");

          // the following code get the set-cookie header passed by server

            HttpResponseMessageProperty response = (HttpResponseMessageProperty)
            OperationContext.Current.IncomingMessageProperties[
                HttpResponseMessageProperty.Name];
            string header  = response.Headers["Set-Cookie"];
          // then you could save it some place  
        }

После того, как вы получите cookie, вы должны устанавливать его в заголовке каждый раз, когда вызываете ваш метод.

 Auth.AuthSoapClient authSoapClient = new Auth.AuthSoapClient();
        using (new OperationContextScope(authSoapClient.InnerChannel))
        {
             //below code sends the cookie back to server

            HttpRequestMessageProperty request = new HttpRequestMessageProperty();
            request.Headers["Cookie"] =  please get the cookie you stored when you   successfully logged in               
 OperationContext.Current.OutgoingMessageProperties[
                HttpRequestMessageProperty.Name] = request;
// please put the call of method in OperationContextScope
            string msg = authSoapClient.GetMsg();
        }

Если вы чувствуете, что отправлять cookie-файлы каждый раз после успешного входа в систему проблематично. Можно использовать MessageInspector, см. Последний фрагмент кода ссылки. https://megakemp.com/2009/02/06/managing-shared-cookies-in-wcf/

...