Los datos de contraseña no se pueden pasar desde un cliente WCF al servicio WCF en el ICredentials .NET Framework 4.5

Este artículo le ayuda a resolver el problema en el que los datos de contraseña no se pueden pasar ICredentials desde un cliente WCF al servicio WCF.

Versión del producto original:   .NET Framework 4.5
Número KB original:   3082119

Síntomas

En un cliente WCF, se crea una nueva interfaz de la clase mediante el nombre de usuario y la ICredentials NetworkCredential contraseña especificados. A continuación, se realiza una llamada a un método de contrato WCF que toma ICredentials como argumento. Encontrará que después de convertir los que se reciben en el servicio WCF de vuelta a una credencial de red, la propiedad ICredentials Password contiene una cadena vacía. Sin embargo, Username la propiedad sigue manteniendo un valor válido y correcto.

Causa

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

Solución

Para solucionar este problema, debe pasar la información de nombre de usuario y contraseña al servicio independientemente de la credencial de red. Puede hacerlo creando un objeto definido por la aplicación para contener las credenciales. A continuación, pase las credenciales a un nuevo método de servicio WCF que acepte el objeto como argumento de método. Este objeto definido por la aplicación contiene información confidencial. Se recomienda enviar los datos a través de una conexión cifrada al servicio WCF mediante https transport security o message layer security.

Código que reproduce el problema

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

[ServiceContract]
[ServiceKnownType(typeof(NetworkCredential))]
public interface IService
{
    [OperationContract]
    string GetData(ICredentials value);
}

Un cliente usa el servicio de la siguiente manera:

iCredService.ServiceClient svcClient = new iCredService.ServiceClient();
ICredentials iCred = new System.Net.NetworkCredential("ABC", "1234");
string outCome = outCome = svcClient.GetData(iCred);

Si Visual Studio y establece un punto de interrupción en el servicio, value.Password estará vacío. Al examinar las ventanas Microsoft Visual Studio locales, verá el texto siguiente:

value {System.Net.NetworkCredential} System.Net.ICredentials {System.Net.NetworkCredential}
[System.Net.NetworkCredential] {System.Net.NetworkCredential} System.Net.NetworkCredential
Domain "" string
Password "" string
+ SecurePassword {System.Security.SecureString} System.Security.SecureString
UserName "ABC" string