2009-10-09 17 views
9

tengo la siguiente configuración del cliente de WCF:WCF TransportCredentialOnly no enviar nombre de usuario y contraseña

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

En el código, yo pongo el nombre de usuario y la contraseña de la siguiente manera:

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

Sin embargo, el servicio web ejecutándose en Tomcat está devolviendo un error:

"No se encontró un objeto de autenticación en el contexto de seguridad".

Cuando miro a la cabecera HTTP, no se encuentra la información de credenciales, como se muestra a continuación:

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 

¿Por qué no se están enviando mis credenciales?

TIA.

Klaus

+0

En Para formatear correctamente, debe resaltar las secciones de código y xml, y luego hacer clic en el botón "código" (010 101) en la barra de herramientas del editor, o presionar Ctrl-K en su teclado. ¡Hace una gran diferencia! –

Respuesta

21

Para otros que ejecuta en el mismo problema, envuelva cada llamada al recurso de servicio web seguro como esto:

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

ver los siguientes enlaces:

+0

+1 excelente - gracias por esa respuesta! –

+0

@ e28Markaveli> Lo he intentado pero al llamar al método de servicio (client.DoSomthing()) tendré la siguiente excepción: La solicitud HTTP no está autorizada con el esquema de autenticación del cliente 'Basic'. El encabezado de autenticación recibido del servidor era 'Basic realm = \ "localhost \. Realmente necesito pasar esta indenificación del cliente completamente sin seguridad. – Banshee

+1

Esto suena como un problema de configuración del servicio. ¿Su servicio está configurado para el esquema de autenticación básica? –

2

Intente cambiar el elemento de seguridad para incluir también el elemento de mensaje especificando el nombre del usuario clientCredentialType ser de otro modo el transporte no sabe que desea utilizar el objeto ClientCredentials.UserName de haber introducido.

<security mode="TransportCredentialOnly"> 
    <transport clientCredentialType="Basic" proxyCredentialType="None" /> 
    <message clientCredentialType="UserName"/> 
</security> 
Cuestiones relacionadas