如何修复“客户端身份验证方案‘匿名’禁止 HTTP 请求”

Posted

技术标签:

【中文标题】如何修复“客户端身份验证方案‘匿名’禁止 HTTP 请求”【英文标题】:How to fix "The HTTP request was forbidden with client authentication scheme 'Anonymous'" 【发布时间】:2020-04-05 00:16:14 【问题描述】:

我在实现与 WCF 服务对话的客户端时遇到了一些问题。这是由另一家公司托管的 WCF,因此我无权访问其代码。我使用 Visual Studio 中的 Connected Service 提供程序工具来生成客户端代码,以便我可以发出请求,并且在我的本地计算机上一切正常。我在我们的开发环境中遇到问题,如果我尝试向客户端发出请求,我会收到以下错误:

The HTTP request was forbidden with client authentication scheme 'Anonymous'

我一直在查看 Provider 工具生成的客户端代码(代码很多),我认为它可能与以下代码块有关。

System.ServiceModel.BasicHttpBinding result = new System.ServiceModel.BasicHttpBinding();
result.MaxBufferSize = int.MaxValue;
result.ReaderQuotas = System.Xml.XmlDictionaryReaderQuotas.Max;
result.MaxReceivedMessageSize = int.MaxValue;
result.AllowCookies = true;
result.Security.Mode = System.ServiceModel.BasicHttpSecurityMode.Transport;
return result;

【问题讨论】:

尝试通过添加服务引用生成客户端代码,然后我们可以查看客户端自动生成的绑定配置。 【参考方案1】:

这更多地与企业网络内的防火墙规则相关联。

我在使用非授权代理时遇到了同样的问题,但使用 ntlm ClientCredentialType 解决了安全代理

【讨论】:

这正是导致问题的原因:) 一段时间后我设法解决了。【参考方案2】:

result.Security.Mode = System.ServiceModel.BasicHttpSecurityMode.Transport;

使用 HTTPS 提供安全性。该服务必须配置有 SSL 证书。 SOAP 消息使用 HTTPS 作为一个整体进行保护。客户端使用服务的 SSL 证书对服务进行身份验证。客户端身份验证通过 ClientCredentialType 控制。

https://docs.microsoft.com/en-us/dotnet/api/system.servicemodel.basichttpsecuritymode?view=netframework-4.8

【讨论】:

那么,如果我将 ClientCredentialType 设置为“无”,它应该可以工作吗?看起来这就是允许匿名身份验证的原因 - docs.microsoft.com/en-us/dotnet/api/… 取决于服务中实现的代码,你有机会测试吗?【参考方案3】:

此错误通常表明 WCF 服务器使用证书对客户端进行身份验证。当服务器和客户端之间的信任关系尚未建立时会出现该错误。 通常,我们需要提供客户端凭据以供服务器进行身份验证,以便能够调用服务。至于需要提供什么样的凭证,取决于服务端的绑定信息。

 BasicHttpBinding binding = new BasicHttpBinding();
            binding.Security.Mode = BasicHttpSecurityMode.Transport;
binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Windows;

也就是说,上面的错误表明服务器使用证书对客户端进行身份验证。

binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Certificate;

关于使用证书对客户端进行身份验证,详情可以参考以下链接。https://docs.microsoft.com/en-us/dotnet/framework/wcf/feature-details/transport-security-with-certificate-authentication 如果有什么我可以帮忙的,请随时告诉我。

【讨论】:

帮我解决了:)【参考方案4】:

感谢所有建议。这实际上只是由我们组织内设置的防火墙规则引起的。删除后,代码按预期工作。

【讨论】:

您删除的防火墙参数是什么?

以上是关于如何修复“客户端身份验证方案‘匿名’禁止 HTTP 请求”的主要内容,如果未能解决你的问题,请参考以下文章

客户端身份验证方案“匿名”禁止 HTTP 请求

重现问题:客户端身份验证方案“匿名”禁止 http 请求

收到 403 禁止错误。客户端身份验证方案“匿名”禁止 HTTP 请求

客户端身份验证方案“匿名”禁止 HTTP 请求

客户端身份验证方案“匿名”禁止 HTTP 请求。远程服务器返回错误:(403) Forbidden

如何修复 npm 审计修复问题?