WCF TransportCredential только не отправляет имя пользователя и пароль - PullRequest
9 голосов
/ 09 октября 2009

У меня есть следующая конфигурация клиента WCF:

<basicHttpBinding>
   <binding name="basicHttpOCCWS" closeTimeout="00:01:00" openTimeout="00:01:00"
                 receiveTimeout="00:10:00" sendTimeout="00:01:00" allowCookies="false"
                 bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
                 maxBufferSize="100000000" maxBufferPoolSize="524288"
                 maxReceivedMessageSize="100000000" messageEncoding="Text"
                 textEncoding="utf-8" transferMode="Buffered" useDefaultWebProxy="true">
      <readerQuotas maxDepth="32" maxStringContentLength="8192"
                    maxArrayLength="16384" maxBytesPerRead="4096" 
                    maxNameTableCharCount="16384" />
      <security mode="TransportCredentialOnly">
         <transport clientCredentialType="Basic" />            
      </security>
   </binding>
</basicHttpBinding>

В коде я задаю имя пользователя и пароль следующим образом:

client.ClientCredentials.UserName.UserName = _cacledUserId;
client.ClientCredentials.UserName.Password = _cachedPassword;

Однако веб-служба, работающая на Tomcat, возвращает ошибку:

"Объект аутентификации не найден в контексте безопасности."

Когда я смотрю на заголовок HTTP, в нем отсутствуют учетные данные, как показано ниже:

POST /occ600webservice/services/OCC_WS HTTP/1.1
Content-Type: application/soap+xml; charset=utf-8; action=""
Host: 192.54.173.130:8080
Content-Length: 2223
Expect: 100-continue 

Почему мои учетные данные не отправляются?

ТИА.

Klaus

Ответы [ 2 ]

21 голосов
/ 10 октября 2009

Для тех, кто сталкивается с той же проблемой, оборачивайте каждый вызов к защищенному ресурсу веб-службы следующим образом:

var client = new WCClient(); 

using (OperationContextScope scope = new OperationContextScope(client.InnerChannel))
{
   var httpRequestProperty = new HttpRequestMessageProperty();
   httpRequestProperty.Headers[System.Net.HttpRequestHeader.Authorization] = 
     "Basic " + 
     Convert.ToBase64String(Encoding.ASCII.GetBytes(
            client.ClientCredentials.UserName.UserName + ":" +
            client.ClientCredentials.UserName.Password));

   OperationContext.Current.OutgoingMessageProperties[HttpRequestMessageProperty.Name] =
               httpRequestProperty;

   client.DoSomething();
}

см. Следующие ссылки:

2 голосов
/ 12 мая 2015

Попробуйте изменить элемент безопасности, включив в него также элемент сообщения, в котором для clientCredentialType будет указано имя пользователя. В противном случае транспорт не будет знать, что вы хотите использовать заполненный вами объект ClientCredentials.UserName.

<security mode="TransportCredentialOnly">
  <transport clientCredentialType="Basic" proxyCredentialType="None" />
  <message clientCredentialType="UserName"/>
</security>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...