WCFTestClient 该 HTTP 请求未经授权,客户端身份验证方案为“匿名”

我已经创建了一个 WCF 服务并将其部署到 Server 上。当我浏览这个服务的时候,它会给我正面的回应?Wsdl 网址。现在我尝试通过 WCF 测试客户端测试服务。它显示了正确的元数据。但是,当我尝试从服务调用任何方法时,它会显示一个异常... ... 下面是带有堆栈跟踪的错误详细信息。.

HTTP 请求未经授权 客户端认证方案客户端认证方案 “匿名”。身份验证标题 从服务器收到的是 “谈判,NTLM”。

服务器堆栈跟踪:


系统。服务模型。通道。 HttpChannelUtilitys.ValidateAuthentication (HttpWebRequest 请求,HttpWebResponse 响应, 例外, HttpChannelFactory)
客户端的 HTTP 请求是未经授权的 「匿名」认证计划 接收到的身份验证标头 服务器是“谈判,NTLM”。

服务器堆栈跟踪:


系统。服务模型。通道。 HttpChannelUtilitys.ValidateAuthentication (HttpWebRequest 请求,HttpWebResponse 响应, 例外, HttpChannelFactory)

客户端绑定:

<bindings>
<wsHttpBinding>
<binding name="WSHttpBinding_IServiceMagicService" closeTimeout="00:01:00"
openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard"
maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true"
allowCookies="false">
<readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
maxBytesPerRead="4096" maxNameTableCharCount="16384" />
<reliableSession ordered="true" inactivityTimeout="00:10:00"
enabled="false" />
<security mode="None">
<transport clientCredentialType="Windows" proxyCredentialType="None"
realm="" />
<message clientCredentialType="Windows" negotiateServiceCredential="true"
establishSecurityContext="true" />
</security>
</binding>
</wsHttpBinding>
</bindings>

服务器绑定:

<bindings>
<wsHttpBinding>
<binding name="WSHttpBinding_SEOService" closeTimeout="00:10:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:10:00" bypassProxyOnLocal="true" transactionFlow="false" hostNameComparisonMode="StrongWildcard" maxBufferPoolSize="999524288" maxReceivedMessageSize="655360000" messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true" allowCookies="false">
<readerQuotas maxDepth="32" maxStringContentLength="900000" maxArrayLength="900000" maxBytesPerRead="900000" maxNameTableCharCount="900000" />
<reliableSession ordered="true" inactivityTimeout="00:10:00" enabled="false" />
<security mode="None">
<transport clientCredentialType="Windows" proxyCredentialType="None" realm="" />
<message clientCredentialType="Windows" negotiateServiceCredential="true" establishSecurityContext="true" />
</security>
</binding>
<binding name="WSHttpServiceMagicBinding" closeTimeout="00:10:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:10:00" bypassProxyOnLocal="true" transactionFlow="false" hostNameComparisonMode="StrongWildcard" maxBufferPoolSize="999524288" maxReceivedMessageSize="655360000" messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true" allowCookies="false">
<readerQuotas maxDepth="32" maxStringContentLength="900000" maxArrayLength="900000" maxBytesPerRead="900000" maxNameTableCharCount="900000"/>
<reliableSession ordered="true" inactivityTimeout="00:10:00" enabled="false"/>
<security mode="None">
<transport clientCredentialType="Windows" proxyCredentialType="None" realm=""/>
<message clientCredentialType="Windows" negotiateServiceCredential="true" establishSecurityContext="true"/>
</security>
</binding>
</wsHttpBinding>
</bindings>

客户组:

<client>
<endpoint address="http://hydwebd02.solutions.com/GeoService.Saveology.com/ServiceMagicService.svc"
binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IServiceMagicService"
contract="IServiceMagicService" name="WSHttpBinding_IServiceMagicService" />
</client>

服务器服务组:

<services>
<service behaviorConfiguration="GeoService.Saveology.com.CityStateServiceProviderBehavior"
name="GeoService.Saveology.com.CityStateServiceProvider">
<endpoint binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_SEOService"
contract="SEO.Common.ServiceContract.ICityStateService" />
<endpoint address="mex" binding="mexHttpBinding" bindingConfiguration=""
contract="IMetadataExchange" />
</service>
<service behaviorConfiguration="GeoService.Saveology.com.ServiceMagicServiceProviderBehavior"
name="GeoService.Saveology.com.ServiceMagicServiceProvider">
<endpoint binding="wsHttpBinding" bindingConfiguration="WSHttpServiceMagicBinding"
contract="SEO.Common.ServiceContract.IServiceMagicService">
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" bindingConfiguration="" contract="IMetadataExchange" />
</service>
</services>
299246 次浏览

我也有类似的问题,你有没有试过:

proxy.ClientCredentials.Windows.AllowedImpersonationLevel =
System.Security.Principal.TokenImpersonationLevel.Impersonation;

只是在开发机器上遇到了这个问题(生产工作正常)。我修改 IIS 中的配置以允许匿名访问,并将我的名称和密码作为凭据。

不是最好的方式,我肯定,但它的工程测试目的。

我看到这还没有答案,这是一个确切的引用 从这里:

WSHttpBinding 将尝试在 SSP 层执行内部协商。为了使其成功,您需要在 VDir 的 IIS 中允许匿名。然后,WCF 将默认情况下从一个 SPNEGO 窗口凭据。允许在 IIS 层匿名是不允许任何人进入,它是遵从 WCF 堆栈。

我通过 http://fczaja.blogspot.com/2009/10/http-request-is-unauthorized-with.html找到了这个

谷歌之后: http://www.google.tt/#hl=en&source=hp&q=+The+HTTP+request+is+unauthorized+with+client+authentication+scheme+%27Anonymous

我不能控制要调用的服务的安全配置,但是得到了同样的错误。我可以把我的委托人改造成这样。

  1. 在配置中,设置安全模式:

    <security mode="TransportCredentialOnly">
    <transport clientCredentialType="Windows" proxyCredentialType="None" realm="" />
    <message clientCredentialType="UserName" algorithmSuite="Default" />
    </security>
    
  2. In the code, set the proxy class to allow impersonation (I added a reference to a service called customer):

    Customer_PortClient proxy = new Customer_PortClient();
    proxy.ClientCredentials.Windows.AllowedImpersonationLevel =
    System.Security.Principal.TokenImpersonationLevel.Impersonation;
    

我必须这么做,这意味着:

  1. 自定义 UserNamePasswordValidator (不需要 Windows 帐户、 SQLServer 或 ActiveDirectory ——您的 UserNamePasswordValidator 可以硬编码用户名和密码,或者从文本文件、 MySQL 或其他文件中读取)。
  2. Https
  3. IIS7
  4. . net 4.0

我的网站是通过 DotNetPanel 管理的,它有3个虚拟目录的安全选项:

  1. 允许匿名访问
  2. 启用基本身份验证
  3. 启用集成 Windows 身份验证

只有“允许匿名访问”是必需的(尽管,这本身是不够的)。

设置

proxy.ClientCredentials.Windows.AllowedImpersonationLevel =  System.Security.Principal.TokenImpersonationLevel.Impersonation;

对我来说没什么区别。

然而,使用这种绑定是有效的:

      <security mode="TransportWithMessageCredential">
<transport clientCredentialType="Windows" />
<message clientCredentialType="UserName" />
</security>

我发现的这个错误的另一个可能的解决方案。可能没有回答 OP 的确切问题,但是可以帮助那些偶然发现这个错误消息的人。

我使用 WebHttpBinding 在代码中创建我的 Client,以便复制以下代码行:

<security mode="TransportCredentialOnly">
<transport clientCredentialType="Windows" proxyCredentialType="Windows" />
</security>

我必须这么做:

var binding = new WebHttpBinding(WebHttpSecurityMode.TransportCredentialOnly);
binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Windows;
binding.Security.Transport.ProxyCredentialType = HttpProxyCredentialType.Windows;

以及设置 proxy.ClientCredentials.Windows.AllowedImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Impersonation;

试着像下面这样在你的客户端提供用户名和密码

client.ClientCredentials.UserName.UserName = @"Domain\username";
client.ClientCredentials.UserName.Password = "password";

我今天也犯了同样的错误,因为我们将我们的服务调用外部服务部署到了天蓝色的临时环境中。本地服务调用外部服务时没有错误,但是在部署之后就没有了。

最后证明,外部服务具有 IP 验证。Azure 中的新环境有另一个 IP,但是被拒绝了。

因此,如果您在调用外部服务时遇到此错误

可能是知识产权限制。

我也遇到过类似的问题,所以我尝试了上面提到的所有方法。然后,我尝试将 clientCredialType 更改为 Basic,一切正常。

<basicHttpBinding>
<binding name="BINDINGNAMEGOESHERE" >
<security mode="TransportCredentialOnly">
<transport clientCredentialType="Basic"></transport>
</security>
</binding>
</basicHttpBinding>

我也有这个错误,最后这个代码为我工作的 点网核心3.1

在命令提示符中首先安装 Svcutil: dotnet tool install —— global dotnet-svcutil

然后 差不多命令提示符,再次打开它。

然后在命令提示符中创建 参考文献:

Dotnet-svcutil http://YourService.com/SayHello.svc

(它需要一个输入键以及 UserName 和 Password)

将名为 联网服务的文件夹添加到项目根目录。

Reference.cs 文件复制到 Connected Services 文件夹。

在创建 BasicHttpBinding 和设置 MaxBufferSize 后面的行添加这些 4行到 Reference.cs:

result.Security.Mode = BasicHttpSecurityMode.TransportCredentialOnly;
result.Security.Transport.ClientCredentialType = HttpClientCredentialType.Basic;
result.Security.Transport.ProxyCredentialType = HttpProxyCredentialType.None;
result.Security.Message.ClientCredentialType = BasicHttpMessageCredentialType.UserName;

在控制器中使用此服务:

public async Task<string> Get()
{
try
{
var client = new EstelamClient();
client.ClientCredentials.UserName.UserName = "YourUserName";
client.ClientCredentials.UserName.Password = "YourPassword";
var res = await client.EmployeeCheckAsync("service parameters");
return res.ToString();
}
catch (Exception ex)
{
return ex.Message + " ************ stack : " + ex.StackTrace;
}


}

不要忘记在 csproj 中安装这些软件包:

<PackageReference Include="System.ServiceModel.Duplex" Version="4.6.*" />
<PackageReference Include="System.ServiceModel.Http" Version="4.6.*" />
<PackageReference Include="System.ServiceModel.NetTcp" Version="4.6.*" />
<PackageReference Include="System.ServiceModel.Security" Version="4.6.*" />