【问题标题】:How do I properly pass System.Net.NetworkCredential to WCF Client?如何正确地将 System.Net.NetworkCredential 传递给 WCF 客户端?
【发布时间】:2014-04-10 21:26:49
【问题描述】:

我目前有客户端设备提示用户输入用户/密码并创建一个System.Net.NetworkCredential 并传递给WCF 服务。此WCF 服务然后使用凭据在另一个外部服务上使用。

问题是每当我通过System.Net.NetworkCredential 到服务时,它似乎丢失了密码字段,所以我从来没有让它通过外部服务进行身份验证。我已经测试过只是以用户/密码的身份传入纯文本/字符串,它可以工作,但感觉这对安全性不利(尽管我确实为这两个服务之间的所有流量启用了 HTTPS)。

有没有办法将这些凭据正确传递给服务?

这是WCF服务的一些测试代码:

public string TestCred(System.Net.NetworkCredential c, string username, string pass)
{

    cred = c;
    userName = username;
    passWord = pass;
    string s = cred.UserName + cred.Password + "end";
    return s;

}

我让它返回该字符串以测试在服务端实际收到的内容,并且密码完全为空(用户名使其正常)。

这是我在 WCF 服务上用来联系外部服务的代码:

externalService.Credentials =  new System.Net.NetworkCredential(cred.UserName, cred.Password, "domain");

这不起作用,因为 cred.Password 字段为空白,我也尝试过:

externalService.Credentials = cred;

这也失败了。

当我使用纯字符串虽然效果很好:

externalService.Credentials =  new System.Net.NetworkCredential(userName, passWord, "domain");

有什么建议吗?由于客户端设备-WCF 和 Service-External Service 之间的连接都是 HTTPS-SSL 需要的,所以它有点安全,但我感觉不太好通过字符串传递用户/传递。

【问题讨论】:

  • 此类(System.Net.NetworkCredential) 不支持基于公钥的身份验证方法,例如安全套接字层 (SSL) 客户端身份验证
  • 只需传递相同的凭据对象。你为什么要尝试创建一个新的?出于明显的安全原因,密码字段不可访问。
  • @VinayKumar.o NetworkCredentials 与 SSL 等传输加密完全无关。它是存储凭据的类,无论出于何种原因,这些凭据都将被库使用。 WCF 确实支持 SSL
  • @user3393394 你想做什么?为什么您的 client 将凭据传递给服务?这是一个非常奇怪的场景。您是否试图冒充客户?有一些基于标准的方法可以做到这一点,而不涉及通过移动密码来破坏安全性。

标签: c# asp.net .net web-services wcf


【解决方案1】:

你看过 TokenImpersonationLevel 吗? MSDN: TokenImpersonationLevel

                var credentials = new ClientCredentials();
            credentials.Windows.AllowedImpersonationLevel = TokenImpersonationLevel.Impersonation;
            credentials.Windows.ClientCredential = CredentialCache.DefaultNetworkCredentials;

            reportChannel.Endpoint.Behaviors.Remove<ClientCredentials>();
            reportChannel.Endpoint.Behaviors.Add(credentials);

【讨论】:

  • 模拟是答案,但此代码并未解释如何执行此操作。这是在具有OperationBehavior(Impersonation=ImpersonationOption.Required) 属性的service 上配置的。设置AllowedImpersonationLevel 的行只允许在确实首先允许的服务上使用凭据来模拟
猜你喜欢
  • 2011-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-14
相关资源
最近更新 更多