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

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

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

Síntomas

En un cliente WCF, se crea una nueva ICredentials interfaz a partir de la NetworkCredential clase mediante el nombre de usuario y la contraseña especificados. A continuación, realiza una llamada a un método de contrato WCF que toma ICredentials como argumento. Después de convertir los ICredentials que se reciben en el servicio WCF a una credencial de red, la Password propiedad contiene una cadena vacía. Sin embargo, la Username propiedad todavía contiene 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 SecurePassword a 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 ni 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 la seguridad de transporte https o la seguridad de la capa de mensajes.

Código que reproduce el problema

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

[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);

Con Visual Studio y estableciendo un punto de interrupción en el servicio, value.Password estará vacío. Al examinar las ventanas locales de Microsoft Visual Studio, 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