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