Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Intranet-web到远程wcf CredentialCache.DefaultNetworkCredentials不工作_C#_Asp.net Mvc_Wcf_Authentication_Intranet - Fatal编程技术网

C# Intranet-web到远程wcf CredentialCache.DefaultNetworkCredentials不工作

C# Intranet-web到远程wcf CredentialCache.DefaultNetworkCredentials不工作,c#,asp.net-mvc,wcf,authentication,intranet,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.Clien

我有一个托管在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,并显示消息:服务未对调用方进行身份验证。 内部异常是:由于身份验证失败,无法满足对安全令牌的请求。


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

我假设如果您在
凭据缓存.DefaultNetworkCredentials
属性中查找,您将看不到凭据信息。 从Microsoft网站:DefaultNetworkCredentials属性返回的身份验证信息仅适用于NTLM、协商或Kerberos身份验证

要获取凭据,您需要实现此身份验证

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

此处的详细信息:

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

<basicHttpBinding>
    <binding name="MyBasicBinding">
      <security mode="TransportCredentialOnly">
        <transport clientCredentialType="Windows" />
      </security>
    </binding>
</basicHttpBinding>
ServiceSecurityContext.Current.WindowsIdentity
请确保服务web.config中存在以下配置


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



我尝试通过使用上述配置传递
System.Net.CredentialCache.DefaultNetworkCredentials
,并且工作正常。如果它不适用于您,则将调试点放在传递凭据的行上,并观察
System.Net.CredentialCache.DefaultNetworkCredentials
域、用户名和密码值是否为空。如果为空,则它应该可以工作。

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

可以使用以下搜索词找到更多信息:,即

标准溶液:

  • Kerberos(通常需要花费大量精力才能获得批准才能启用/配置)
  • 使用Windows以外的其他身份验证形式。考虑是否有OAuth.不要去基本授权
  • 将WCF服务切换到
  • 如果WCF服务可以,它可以信任调用者来验证传入凭据,则可以使用更多方法:
  • 在服务器上本地登录并具有调用服务权限的特定帐户下运行代码。最简单的方法是在您的帖子中显示的方法,但是以纯文本形式存储域密码(或任何密码)是不安全的。还可以在特殊凭据下运行process account,这些凭据可以访问远程服务并在验证用户凭据后临时还原模拟
  • 您还可以将WCF服务配置为需要客户端证书,并在调用WCF服务时使用此类证书。通过这种方式,WCF服务可以验证调用方是否已知

但当您使用WCF时,它不是NTLM、协商或Kerberos?我不想实现我自己的安全性我想在我的web中获取当前的注册用户凭据并将其传递给WCF客户端代理。在IIS中,您已为intranet web应用程序定义了身份验证,如NTLM、KERBEROS、匿名。。。要通过webservices WCF保留用户的信息,您需要使用模拟。您可以编写代码吗?我如何将凭据传递到WCF客户端代理?我进行了所有这些配置,但仍然不知道如何将当前用户凭据从web服务器传递到WCF客户端代理。。。所以现在我得到了相同的错误…请在客户端和服务器端web.config上进行配置更改,然后尝试创建服务代理并调用该方法。无需显式传递windows凭据。在服务器端,您可以使用
ServiceSecurityContext.Current.WindowsIdentity
获取windows凭据,如果可能,还可以向我发送演示应用程序。所以,我可以帮助你。我目前正在使用wsHttpBinding。。。在我的配置中,可以使用此绑定完成吗?在wsHttpBinding中,我没有mode=“TransportCredentialOnly”选项。。。我应该选择什么?或者用wsHttpBinding实现它是不可能的?我已经更新了答案。请仔细阅读并应用相同的配置。
ServiceSecurityContext.Current.WindowsIdentity