Intranet – Web到远程wcf CredentialCache.DefaultNetworkCredentials无法正常工作

我有一个在IIS中托管的ASP.NET MVC Intranet应用程序,它添加了WCF服务引用,WCF驻留在另一台计算机中,并且还需要Windows身份validation。 在我的网站上,这段代码很有用:

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: 调用者未被服务认证。 内部exception是: 无法满足安全令牌请求,因为身份validation失败。

如何在没有硬编码的用户名和密码的情况下将当前用户的凭据传递给WCF服务?

如果您的组织使用常规Windows身份validation(NTLM),由于“一跳”限制,您无法执行所需操作:从用户计算机传递到服务器的凭据使用“一跳”(从直接登录到一台外部计算机)并且此类凭据不能用于从第一个服务器validation其他服务器。

可以使用以下搜索词找到更多信息: ntlm one hop ,即为什么NTLM失败并且Kerberos正常工作 。

标准解决方案

  • Kerberos(通常需要大量工作才能获得启用/配置的批准)
  • 使用其他forms的身份validation而不是Windows。 考虑OAuth是否可行。 不要去基本认证。
  • 将WCF服务切换到基于声明的身份validation 。
  • 如果WCF服务可以信任调用者来validation传入凭证,则可以采用更多方法:
    1. 在特定帐户下运行代码,该帐户在服务器上本地登录并具有调用服务的权限。 最简单的方法是您的post中显示的内容,但以纯文本格式存储域密码(或任何密码)并不安全。 还可以在可以访问远程服务的特殊凭据下运行进程帐户,并在validation用户凭据后临时还原模拟。
    2. 您还可以将WCF服务配置为需要客户端证书,并在调用WCF服务时使用此类证书。 这样WCF服务可以validation调用者是否已知。

在web.config(客户端和服务器)中,在部分添加/修改绑定,看起来像这样:

        

并将此添加到客户端web.config 部分:

   

这两个更改将使最终用户成为Web请求的当前用户,然后将在WCF消息中发送。

然后可以在服务器端检索用户,如下所示:

 ServiceSecurityContext.Current.WindowsIdentity 

请确保服务web.config中有以下配置。

在您的客户端配置文件中应该存在以下内容。

我尝试使用上面的配置传递System.Net.CredentialCache.DefaultNetworkCredentials并为我工作正常。 如果它不适合您,则将调试点放在传递凭证的行上,并观察System.Net.CredentialCache.DefaultNetworkCredentials域,用户名和密码值是否为空。 如果是空白那么它应该工作。

我假设如果您在CredentialCache.DefaultNetworkCredentials attribut中查看,您将看不到凭据信息。 来自Microsoft网站:DefaultNetworkCredentials属性返回的身份validation信息仅适用于NTLM,Negotiate或Kerberos身份validation。

要获取凭据,您需要实现此身份validation。

您可以通过使用Intranet应用程序模拟来使用它。 模拟允许您的Intranet应用程序由此用户执行。

更多信息请访问: http : //technet.microsoft.com/en-us/library/cc961980.aspx