No se pueden pasar datos de contraseña en la interfaz ICredentials desde un cliente WCF al servicio WCF en la 4.5 de.NET Framework

Síntomas

En un cliente Windows Communication Foundation (WCF), crear una nueva interfaz de la clase NetworkCredential utilizando el nombre de usuario y la contraseña especificados. A continuación, realice una llamada a un método de contrato WCF que toma ICredentials como argumento. Verá que, después de convertir la interfaz ICredentials que se reciben en el servicio WCF una credencial de red, la propiedad de contraseña contiene una cadena vacía. Sin embargo, la propiedad Username conserva un valor válido y correcto.

Causa

Se trata de un problema conocido que se introdujo en el Microsoft.NET Framework 4.0 cuando una nueva propiedad, SecurePassword, se agregó a la clase NetworkCredential . Esta propiedad sobrescribe la cadena de contraseña original cuando la propiedad SecurePassword se deserializa en el servicio. La propiedad SecurePassword es de tipo SecureString. Por diseño, no es serializado y enviado. Sin embargo, éste sobrescribe la cadena de contraseña original utilizando un valor vacío. Este comportamiento también es por diseño.

Solución

Para corregir este problema, tendrá que pasar la información de nombre de usuario y contraseña al servicio independientemente de las credenciales de red. Puede hacerlo mediante la creación de un objeto definido por la aplicación para almacenar las credenciales y pasar las credenciales a un nuevo método de servicio WCF que acepta el objeto como un argumento de método. Dado que este objeto definido por la aplicación contiene información confidencial, se recomienda que los datos se envían sobre una conexión cifrada con el servicio WCF mediante transporte cualquiera https security o seguridad de nivel de mensaje.

Más información

En el ejemplo siguiente se muestra un servicio WCF que reproduce el problema. El servicio WCF tiene el contrato siguiente:

[ServiceContract]
[ServiceKnownType(typeof(NetworkCredential))]
interfaz pública IService
{

[OperationContract]
cadena de GetData(ICredentials value);
}

Un cliente está utilizando el servicio como sigue:

iCredService.ServiceClient svcClient = new iCredService.ServiceClient();
ICredentials iCred = new System.Net.NetworkCredential ("ABC", "1234");
Resultado de la cadena = resultado = svcClient.GetData(iCred);

Con Visual Studio y establecer un punto de interrupción en el servicio con el valor. Contraseña estará vacía. Al examinar las ventanas de variables locales de Microsoft Visual Studio, verá el siguiente texto:

-valor System.Net.ICredentials {System.Net.NetworkCredential} {System.Net.NetworkCredential}
-      [System.Net.NetworkCredential] {System.Net.NetworkCredential} System.Net.NetworkCredential
Dominio "" cadena
Contraseña "" cadena
+ System.Security.SecureString SecurePassword {System.Security.SecureString}
Cadena de nombre de usuario "ABC"
Propiedades

Id. de artículo: 3082119 - Última revisión: 22 ene. 2017 - Revisión: 1

Microsoft .NET Framework 4.0, Microsoft .NET Framework 4.5, Windows Communication Foundation 4, Windows Communication Foundation 4.5

Comentarios