在 ICredentials 中的密码数据不能从 WCF 客户端传递到.NET Framework 4.5 的 WCF 服务

重要说明:本文是由 Microsoft 机器翻译软件进行的翻译并可能由 Microsoft 社区通过社区翻译机构(CTF)技术进行后期编辑,或可能是由人工进行的翻译。Microsoft 同时向您提供机器翻译、人工翻译及社区后期编辑的文章,以便对我们知识库中的所有文章以多种语言提供访问。翻译的文章可能存在词汇、句法和/或语法方面的错误。Microsoft 对由于内容的误译或客户对内容的使用所导致的任何不准确、错误或损失不承担责任。

点击这里察看该文章的英文版: 3082119
症状
在 Windows 通讯基础 (WCF) 客户端,您创建新的 ICredentials 接口从NetworkCredential类使用的用户名和密码指定。然后,您可以进行 WCF 协定采用的方法,ICredentials 作为参数调用。您发现强制转换回网络凭据的 WCF 服务中收到的 ICredentials 后,口令属性将保留为空字符串。但是,用户名属性仍持有有效的、 正确的值。
原因
这是一个已知的问题,引入了在 Microsoft.NET Framework 4.0 的新属性时, SecurePassword,已添加到NetworkCredential类。在服务端上的SecurePassword属性进行反序列化时,此属性将覆盖原始密码字符串。SecurePassword属性属于类型 SecureString。按照设计,它不是序列化并发送。但是,它会使用空值覆盖原始密码字符串。这种现象也是设计使然。
解决方案
若要解决此问题,您必须将用户名和密码信息传递到独立于网络凭据的服务。您可以通过创建应用程序定义的对象来保存凭据,并将凭据传递给新的 WCF 服务方法接受的对象作为方法参数来执行此操作。因为此应用程序定义的对象包含敏感信息,所以使用或者 https 通过加密连接到 WCF 服务发送数据的 werecommend 传输安全或消息层安全。
更多信息
Followingexample 显示的 WCF 服务的产生的问题。WCF 服务有以下合同:

[] ServiceContract
[] ServiceKnownType(typeof(NetworkCredential))
公共接口 IService
{

[] OperationContract
字符串 GetData(ICredentials value);
}

客户端使用服务,如下所示:

iCredService.ServiceClient svcClient = 新 iCredService.ServiceClient();
ICredentials iCred = 新的 System.Net.NetworkCredential ("ABC","1234");
字符串结果 = 结果 = svcClient.GetData(iCred);

使用 Visual Studio 并在服务的值设置一个断点。密码为空。当您检查 Microsoft Visual Studio 的局部变量窗口时,您会看到以下文本:

-value{System.Net.NetworkCredential}System.Net.ICredentials {System.Net.NetworkCredential}
-[System.Net.NetworkCredential]{System.Net.NetworkCredential}System.Net.NetworkCredential
"字符串"域
"字符串的密码"
+SecurePassword{System.Security.SecureString}System.Security.SecureString
用户名"ABC"的字符串
ICredentials NetworkCredential WCF SecurePassword

属性

文章 ID:3082119 - 上次审阅时间:08/30/2015 02:13:00 - 修订版本: 1.0

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

  • kbmt KB3082119 KbMtzh
反馈