gpt4 book ai didi

c# - Intranet - 网络到远程 wcf CredentialCache.DefaultNetworkCredentials 不工作

转载 作者:太空宇宙 更新时间:2023-11-03 10:41:59 25 4
gpt4 key购买 nike

我有一个托管在 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 - 网络到远程 wcf CredentialCache.DefaultNetworkCredentials 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25010204/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com