2010-09-01 25 views
8

Tengo un servicio simple e intento configurar la autenticación. En el cliente, quiero que el usuario ingrese su cuenta de usuario de Windows. Y el WCF usará el nombre de usuario/contraseña proporcionado por el cliente y los autenticará contra la autenticación de Windows.Autenticación de seguridad WCF

Aquí es mi servidor app.config

<system.serviceModel> 
    <services> 
     <service name="WcfService.Service1" behaviorConfiguration="WcfService.Service1Behavior"> 
     <host> 
      <baseAddresses> 
      <add baseAddress = "http://localhost:8731/Design_Time_Addresses/WcfService/Service1/" /> 
      </baseAddresses> 
     </host> 
     <endpoint address ="" binding="wsHttpBinding" contract="WcfService.IService1"> 
      <identity> 
      <dns value="localhost"/> 
      </identity> 
     </endpoint> 
     <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/> 
     </service> 
    </services> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior name="WcfService.Service1Behavior"> 
      <serviceMetadata httpGetEnabled="True"/> 
      <serviceDebug includeExceptionDetailInFaults="True" /> 

      <serviceCredentials> 
      <userNameAuthentication userNamePasswordValidationMode = "Windows"/> 
      </serviceCredentials> 

     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    </system.serviceModel> 

Aquí es mi app.config cliente

<system.serviceModel> 
    <bindings> 
     <wsHttpBinding> 
      <binding name="WSHttpBinding_IService1"> 

       <security mode = "Message"> 
       <message clientCredentialType = "UserName"/> 
       </security> 

      </binding> 
     </wsHttpBinding> 
    </bindings> 
    <client> 
     <endpoint address="http://localhost:8731/Design_Time_Addresses/WcfService/Service1/" 
      binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IService1" 
      contract="ServiceReference1.IService1" name="WSHttpBinding_IService1"> 
      <identity> 
       <dns value="localhost" /> 
      </identity> 
     </endpoint> 
    </client> 
</system.serviceModel> 

Aquí está mi código en el cliente

ServiceReference1.Service1Client client = new WcfAuthentication.ServiceReference1.Service1Client(); 

client.ClientCredentials.UserName.UserName = "mywindowsusername"; 
client.ClientCredentials.UserName.Password = "mywindowsuserpassword"; 
Console.WriteLine(client.GetData(5)); 

Pero estoy obteniendo siempre esta excepción:

{"No se puede abrir el canal seguro porque la negociación de seguridad con el punto final remoto ha fallado. Esto puede deberse a EndpointIdentity ausente o especificado incorrectamente en EndpointAddress utilizado para crear el canal. Verifique que EndpointIdentity especificado o implícito en EndpointAddress identifique correctamente el punto extremo remoto. "} {" La solicitud de token de seguridad tiene elementos válidos o malformados "}

Respuesta

7

Parece que ha generado el servicio y la configuración del cliente por separado (a mano). Por lo general, es una buena idea generar la configuración del cliente desde el servicio usando svcutil o la 'Agregar referencia de servicio' de Visual Studio. De esta manera sabrá que obtiene la configuración del cliente que corresponde al configuración de servicio

Lo que desea es posible, pero WCF no le permite transmitir su token de nombre de usuario/contraseña en texto sin formato al usar wsHttpBinding. Esto significa que debe alojar su servicio usando https o usar un certificado de servicio. Here es una publicación con más detalles.

Pero también me pregunto por qué quieres algo como esto. Puede ser una mejor idea usar la autenticación integrada de Windows. Esta es incluso la configuración predeterminada para wsHttpBinding. De esta forma, no necesita que su (s) cliente (s) ingrese (n) su nombre de usuario/contraseña de Windows.

+1

Interesante, tiene sentido que debe usar una conexión segura. Fue solo un ejercicio para comprender las diferentes posibilidades de autenticación que ofrece wcf. En el mundo real. Es para mi aplicación móvil, que el usuario deberá proporcionar la credencial de cuenta de Windows en su dispositivo móvil. Así que está usando basichttpbinding y para asegurar la comunicación voy a ir con SSL (https). Así que, por ejemplo, el uso de nettcpbinding debería ser correcto, ya que creo que de forma predeterminada está utilizando la seguridad de transporte, que ya debería estar cifrada con tcp. – pdiddy

-2
binding.Security = new WSHttpSecurity{Mode = SecurityMode.None}; 
Cuestiones relacionadas