c# - Intranet - Web 到远程 wcf CredentialCache.DefaultNetworkCredentials 不起作用

标签 c# asp.net-mvc wcf authentication intranet

我有一个托管在 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 服务可以信任调用者来验证传入凭据,则可以采用更多方法:
    1. 在服务器本地登录并有权调用服务的特定帐户下运行代码。最简单的方法是您的帖子中显示的方法,但是以纯文本形式存储域密码(或任何密码)并不安全。人们还可以在有权访问远程服务的特殊凭据下运行进程帐户,并在验证用户凭据后临时恢复模拟。
    2. 您还可以将 WCF 服务配置为需要客户端证书,并在调用 WCF 服务时使用此类证书。这样 WCF 服务就可以验证调用者是否已知。

关于c# - Intranet - Web 到远程 wcf CredentialCache.DefaultNetworkCredentials 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25010204/

相关文章:

c# - 使用 EF 数据库设置 WCF 服务的正确方法是什么?

c# - 复选框列表-javascript

c# - IActionContextAccessor 为空

c# - 更改无线网络适配器无线模式属性

c# - 提交表单导致 URL 中出现未知代码

c# - 为 WCF 应用程序设置凭据?

windows - 您是否应该始终在调用之间断开与 WCF 服务的连接?

c# - 禁用按钮触发 WPF 中的事件

javascript - asp.net mvc上传文件时如何获取客户端文件路径?

javascript - 使用 aspnetmvc Turbolinks 时如何在正文中编写 jquery