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

6gpjuf90  于 2022-11-15  发布在  .NET
关注(0)|答案(1)|浏览(128)

我目前的客户端装置会提示使用者输入user/pass,并建立传递至 WCF 服务的System.Net.NetworkCredential。然后,此 WCF 服务会使用凭证来用于其他外部服务。
问题是每当我通过System.Net.NetworkCredential传递到服务时,它似乎丢失了密码字段,因此我从未让它与外部服务进行身份验证。我已经测试过,只是将纯文本/字符串作为user/pass传递,它工作正常,但感觉这对安全性不是很好(尽管我为两个服务之间的所有流量启用了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 必需的,所以它稍微安全一些,但是我觉得用字符串传递user/pass不是很好。

yqhsw0fo

yqhsw0fo1#

您是否查看过令牌模拟级别?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);

相关问题