我有一个托管在 IIS 中的 ASP.NET MVC Intranet 应用程序,该应用程序添加了 WCF 服务引用,WCF 驻留在另一台计算机上,并且还需要 Windows 身份验证。 在我的网站中,这段代码运行良好:
proxy = new MyProxyClient("configurationName", "remoteAddress");
proxy.ClientCredentials.Windows.ClientCredential.UserName = "myUserName";
proxy.ClientCredentials.Windows.ClientCredential.Password = "MyPassword";
proxy.SomeMethod(); //work great
但如果我希望凭证不要像这样被硬编码,我正在使用:CredentialCache.DefaultNetworkCredentials,如下所示:
proxy = new MyProxyClient("configurationName", "remoteAddress");
proxy.ClientCredentials.Windows.ClientCredential = CredentialCache.DefaultNetworkCredentials;
proxy.SomeMethod(); //not working throw exception
上面的代码抛出 SecurityNegotiationException 并显示消息:调用者未经服务验证。 内部异常是:由于身份验证失败,无法满足对安全 token 的请求。
如何在不硬编码用户名和密码的情况下将当前用户的凭据传递给 WCF 服务?
最佳答案
如果您的组织使用常规 Windows 身份验证 (NTLM),由于“一跳”限制,您无法执行您想要的操作:从用户计算机传递到您的服务器的凭据使用“一跳”(从直接登录到一个外部计算机),并且此类凭据不能用于从第一个服务器验证其他服务器。
使用以下搜索词可以找到更多信息:ntlm one hop ,IE。 Why NTLM fails and Kerberos works .
标准溶液:
- Kerberos(通常需要付出巨大努力才能获得启用/配置批准)
- 使用 Windows 之外的其他形式的身份验证。考虑 OAuth 是否可行。不要进行基本身份验证。
- 将 WCF 服务切换到 claims based authentication .
- 如果 WCF 服务可以信任调用者来验证传入凭据,则可以采用更多方法:
- 在服务器本地登录并有权调用服务的特定帐户下运行代码。最简单的方法是您的帖子中显示的方法,但是以纯文本形式存储域密码(或任何密码)并不安全。人们还可以在有权访问远程服务的特殊凭据下运行进程帐户,并在验证用户凭据后临时恢复模拟。
- 您还可以将 WCF 服务配置为需要客户端证书,并在调用 WCF 服务时使用此类证书。这样 WCF 服务就可以验证调用者是否已知。
关于c# - Intranet - Web 到远程 wcf CredentialCache.DefaultNetworkCredentials 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25010204/