2009-10-09 7 views
9

Ho la seguente configurazione del client di WCF:WCF TransportCredentialOnly non l'invio di username e password

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

In codice, io pongo il nome utente e la password come segue:

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

Tuttavia, il servizio web l'esecuzione su Tomcat restituisce un errore:

"Un oggetto di autenticazione non è stato trovato nel contesto di sicurezza."

Quando guardo l'header HTTP, manca informazioni sulle credenziali come illustrato di seguito:

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 

Perché le mie credenziali non viene inviato?

TIA.

Klaus

+0

In per formattare correttamente, è necessario evidenziare le sezioni di codice e xml, quindi fare clic sul pulsante "codice" (010 101) sulla barra degli strumenti dell'editor o premere Ctrl-K sulla tastiera. Fa enorme differenza! –

risposta

21

Per gli altri che corrono lo stesso problema, avvolgere ogni chiamata alla risorsa protetta servizio Web in questo modo:

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(); 
} 

vedere i seguenti link:

+0

+1 eccellente - grazie per quella risposta! –

+0

@ e28Markaveli> Ho provato questo, ma quando si chiama il metodo di servizio (client.DoSomthing()) otterrò l'eccezione fallowing: la richiesta HTTP non è autorizzata con lo schema di autenticazione client 'Base'. L'intestazione di autenticazione ricevuta dal server era "Realm di base = \" localhost \. Ho davvero bisogno di passare questi indentificazioni del client completamente senza sicurezza – Banshee

+1

Questo suona come un problema di configurazione del servizio.Il servizio è configurato per lo schema di autenticazione di base? –

2

Provare a cambiare l'elemento di sicurezza per includere anche l'elemento messaggio specificando il clientCredentialType essere UserName altrimenti il ​​trasporto non sa che si desidera utilizzare l'oggetto che si ClientCredentials.UserName compilato.

<security mode="TransportCredentialOnly"> 
    <transport clientCredentialType="Basic" proxyCredentialType="None" /> 
    <message clientCredentialType="UserName"/> 
</security> 
Problemi correlati