我目前有客户端设备提示用户输入用户/通行证,并创建一个传递给 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 ,因此它稍微安全,但我觉得传递用户/传递字符串感觉不错。
答案 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);