C# Intranet-web到远程wcf CredentialCache.DefaultNetworkCredentials不工作
我有一个托管在IIS中的ASP.NET MVC intranet应用程序,该应用程序添加了WCF服务引用。WCF驻留在另一台计算机上,还需要windows身份验证。 在我的网站上,这段代码非常有效: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
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服务可以验证调用方是否已知
ServiceSecurityContext.Current.WindowsIdentity
获取windows凭据,如果可能,还可以向我发送演示应用程序。所以,我可以帮助你。我目前正在使用wsHttpBinding。。。在我的配置中,可以使用此绑定完成吗?在wsHttpBinding中,我没有mode=“TransportCredentialOnly”选项。。。我应该选择什么?或者用wsHttpBinding实现它是不可能的?我已经更新了答案。请仔细阅读并应用相同的配置。
ServiceSecurityContext.Current.WindowsIdentity