2009-04-30 15 views
19

he creado un proxy de un Servicio Web con Visual Studio 2008, y creó para mí la siguiente entrada en el app.config:Conectar con WCF para un servicio web autenticado con nombre de usuario/contraseña

<system.serviceModel> 
     <bindings> 
      <basicHttpBinding> 
       <binding name="MyNameHandlerSoapBinding" closeTimeout="00:01:00" 
        openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" 
        allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" 
        maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536" 
        messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered" 
        useDefaultWebProxy="true"> 
        <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" 
         maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
        <security mode="None"> 
         <transport clientCredentialType="None" proxyCredentialType="None" 
          realm="" /> 
         <message clientCredentialType="UserName" algorithmSuite="Default" /> 
        </security> 
       </binding> 
      </basicHttpBinding> 
     </bindings> 
     <client> 
      <endpoint address="http://www.***/***/***" 
       binding="basicHttpBinding" bindingConfiguration="MyNameHandlerSoapBinding" 
       contract="***.MyNameHandler" name="MyName"> 
      </endpoint> 
     </client> 
    </system.serviceModel> 

El servicio web tiene autenticación de nombre de usuario/contraseña, así que necesito agregarla en algún lugar aquí.

Estoy un poco perdido en el mar de la documentación de WCF, creo que tengo que cambiar de basicHttpBinding a wsHttpBinding o CustomBinding para poder agregar los elementos de autenticación, pero realmente no lo entiendo. ¿Alguien podría dar algún consejo rápido o algún enlace útil que diga cómo hacerlo?

EDIT:

He cambiado la sección de seguridad a:

<security mode="Transport"> 
    <transport clientCredentialType="Basic" proxyCredentialType="None" 
     realm="" /> 
</security> 

y se añaden en el código:

ws.ClientCredentials.UserName.UserName = ""; 
ws.ClientCredentials.UserName.Password = ""; 

ahora parece que podría estar utilizando las credenciales pero es dándome el error:

el esquema URI proporcionado 'http' es URI no válido espera 'https'

Ni siquiera sé si este es el camino correcto a seguir ...

+3

WCF es la configuración del infierno. ¿Qué tienda de autenticación quieres usar? Windows ... ¿Membresía ASP o personalizada como una base de datos? Y ha mirado a través de esto: http://msdn.microsoft.com/en-us/library/bb398990.aspx –

+0

De hecho. Es un servicio web externo que tiene un nombre de usuario/contraseña único para usar siempre para todas mis llamadas. Y es http. ¡Así que supongo que podría ser más una autorización de punto final, si eso tiene sentido! – antonioh

+0

Al principio está molestando que no se pueda especificar el nombre de usuario y la contraseña en cualquier lugar de la configuración (pero solo en el código). De nuevo, ¿le gustaría tener su contraseña en un archivo de configuración de texto claro? ¿DE VERDAD? –

Respuesta

34

he puesto aquí la solución para los futuros lectores:

<system.serviceModel> 
    <bindings> 
     <basicHttpBinding> 
     <binding name="MyHandlerSoapBinding" closeTimeout="00:01:00" 
      openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" 
      allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" 
      maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536" 
      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> 
    </bindings> 
    <client> 
     <endpoint address="http://www.***/***/***/MyHandler" 
      binding="basicHttpBinding" bindingConfiguration="MyHandlerSoapBinding" 
      contract="***.MyHandler" name="MyHandler"> 
     </endpoint> 

    </client> 
    </system.serviceModel> 

Al final pude utilizar el basicHttpBinding defecto. La única diferencia con el código publicado en la pregunta es nodo de seguridad.

También tenga en cuenta el mode = "TransportCredentialOnly", esto le permite enviar nombre de usuario/contraseña utilizando http en lugar de https. Esto es necesario para entornos de prueba como el que estoy usando. Más adelante, obviamente, preferirá https para enviar sus credenciales.

Después de código que deberá introducir su nombre de usuario/contraseña:

var ws = new ***.MyHandlerClient("MyHandler"); 
ws.ClientCredentials.UserName.UserName = "myUsername"; 
ws.ClientCredentials.UserName.Password = "myPassword"; 
var result = ws.executeMyMethod(); 
+0

Esto realmente me hizo el día! Muchas gracias por compartir, esto le ahorró a mucha gente muchos problemas. – cudahead

+0

@antonioh obtengo 'La solicitud HTTP estaba prohibida con el esquema de autenticación de cliente 'Básico'. Con ese enfoque; ¿sabes lo que podría estar causando esto? – FMFF

+0

Argh ... quién habría encontrado el ... NombreDeUsuario.NombreUsuario .... –

5

El mensaje de error es correcto. WCF no permitirá el transporte de nombres de usuario y contraseñas sobre un protocolo desprotegido. El servidor web debe ser mediante HTTPS (SSL con el certificado de asistente)

Una vez que tenga un certificado SSL tiene dos opciones sobre cómo se envían las credenciales, el transporte o la seguridad y múltiples opciones para el tipo de credencial. MSDN tiene un good guide para todas las opciones.

+1

Lo encontré. Le permite con la opción . Por supuesto, esto es para un entorno de prueba, más adelante debe usar https. Saludos – antonioh

1

que tenían el mismo problema y trató la solución anterior De alguna manera esto no funcionó para mí que era seguir recibiendo el mensaje " No se encontró ningún encabezado de WS-Security "

Después de un largo tiempo de prueba e intento me las arreglo para hacer que funcione Agregué el código de encabezado en el cliente de la siguiente manera y luego funciona.

<client> 
    <endpoint address="http://your.service.com" binding="basicHttpBinding" bindingConfiguration="XXXBinding" contract="contract.XXX" name="XXXPort"> 
     <headers xmlns:wsse="http://your.xsd"> 
      <wsse:Security mustUnderstand="1"> 
       <wsse:UsernameToken> 
        <tenant>XXX</tenant> 
        <wsse:Username>XXX</wsse:Username> 
        <wsse:Password Type="http://www.xxxx.com/wss#PasswordText">XXX</wsse:Password> 
       </wsse:UsernameToken> 
      </wsse:Security> 
     </headers> 
    </endpoint> 
</client> 
Cuestiones relacionadas