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
Comentarios
https://aka.ms/ContentUserFeedback.
Próximamente: A lo largo de 2024 iremos eliminando gradualmente GitHub Issues como mecanismo de comentarios sobre el contenido y lo sustituiremos por un nuevo sistema de comentarios. Para más información, vea:Enviar y ver comentarios de