2016-09-30 3 views
0

Lorsque vous utilisez WCF basicHttpBinding avec authentification de base, je remarque que la première requête après la réinitialisation IIS est envoyée sans données utilisateur/passe (sans autorisation: Basic .... En-tête données)basicHttpBinding avec authentification de base envoyer la première requête sans données utilisateur/passe

code:

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> 

Après moniteur par Fidler, je trouve que, la première demande de retour toujours 401 (aller sans l'en-tête d'authentification), une autre requête sort et renvoie l'erreur 505. Ensuite, le service fonctionnera bien pour toutes les autres demandes.

Répondre

0

J'ai trouvé la solution et j'ai pensé que je pourrais la partager avec vous, cela peut aider.

La solution est ici http://plainoldstan.blogspot.ca/2008/07/avoid-http-401-roundtrip-with-adding.html par Stanislav Dvoychenko

Il est par créer simplement l'en-tête d'authentification de base vous-même, au lieu de dépendre du client pour le faire. car le client final considérera que le point de fin est déjà pré-authentifié.

// 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 
}