2016-09-30 6 views
0

При использовании базового HTF-привязки WCF с базовой аутентификацией я замечаю, что первый запрос после сброса IIS отправляется без данных пользователя/пароля (без авторизации: Basic ... Header данные)basicHttpBinding с базовой аутентификацией отправьте первый запрос без данных пользователя/пароля

Код:

client.ClientCredentials.UserName.UserName = "myUserName"; 
client.ClientCredentials.UserName.Password = "myPassword"; 
string anything = client.getValue(@"anyParam.."); 

Config:

<basicHttpBinding> 
    <binding name="ServiceNameHereServiceBinding" > 
     <security mode="TransportCredentialOnly"> 
      <transport clientCredentialType="Basic" proxyCredentialType="None" 
        realm=""> 
      </transport> 
     </security> 
    </binding> 
</basicHttpBinding> 

После монитора с помощью Фидлера, я обнаружил, что первый запрос Всегда возвращайте 401 (идти без заголовка аутентификации), затем выдается другой запрос и возвращает ошибку 505. После этого служба будет работать на всех последующих запросах.

ответ

0

Я нашел решение, и я думал, что могу поделиться им с вами, это может помочь.

Решение здесь http://plainoldstan.blogspot.ca/2008/07/avoid-http-401-roundtrip-with-adding.html Станислав Dvoychenko

Это просто создать основной заголовок аутентификации самостоятельно, а не зависеть от Клиента сделать это. потому что из коробки клиент будет считать конечную точку уже предварительно аутентифицированной.

// Assign client.ClientCredentials.UserName.UserName and client.ClientCredentials.UserName.Password 
SetupClientAuthentication(); 

HttpRequestMessageProperty httpRequestProperty = new HttpRequestMessageProperty(); 

httpRequestProperty.Headers[HttpRequestHeader.Authorization] = "Basic " + 
    Convert.ToBase64String(Encoding.ASCII.GetBytes(client.ClientCredentials.UserName.UserName + ":" + 
    client.ClientCredentials.UserName.Password)); 

using (OperationContextScope scope = new OperationContextScope(client.InnerChannel)) 
{ 
    OperationContext.Current.OutgoingMessageProperties[HttpRequestMessageProperty.Name] = 
     httpRequestProperty; 

    // Invoke client 
}