如何正确地将System.Net.NetworkCredential传递给WCF客户端?

时间:2014-03-07 16:11:02

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

我目前有客户端设备提示用户输入用户/通行证,并创建一个传递给 WCF 服务的System.Net.NetworkCredential。然后,此 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和服务外部服务之间的连接都需要 HTTPS-SSL ,因此它稍微安全,但我觉得传递用户/传递字符串感觉不错。

1 个答案:

答案 0 :(得分:0)

你看过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);