WCFTestClient使用客户端身份验证方案“匿名”对HTTP请求进行了未授权


68

我已经创建了一个WCF服务并将其部署在服务器上。当我浏览此服务时,它会以?wsdl URL给我肯定的答复。现在,我正在尝试通过WCF测试客户端测试服务。它显示正确的元数据。但是,当我尝试从服务中调用任何方法时,它向我显示了一个异常...这是带有堆栈跟踪的错误详细信息。

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

服务器堆栈跟踪:


System.ServiceModel.Channels.HttpChannelUtilities.ValidateAuthentication(HttpWebRequest请求,HttpWebResponse响应,WebException responseException,HttpChannelFactory工厂)处
,使用客户端身份验证方案“匿名”对HTTP请求进行了未授权的操作。从服务器收到的身份验证标头是“ Negotiate,NTLM”。

服务器堆栈跟踪:


System.ServiceModel.Channels.HttpChannelUtilities.ValidateAuthentication(HttpWebRequest请求,HttpWebResponse响应,WebException responseException,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>

当您用真实的客户端调用这些方法时会发生什么?
约翰·桑德斯

好的,谢谢-但是您还需要发布服务器的<services>部分和客户端的<client>部分,以便我们了解如何设置这些端点以及如何调用它们……
marc_s 2009年

对于真正的客户,它没有任何问题。
user82613

我还发布了客户端的<client>部分和dn服务器的<services>部分。
user82613

1
.Net世界的症状是,您对同一问题有很多(有效)不同答案,而没有一个人解释要更改的参数以及原因。有人知道他/她在做什么吗?
Thibault D.

Answers:


83

我没有控制要调用的服务的安全性配置,但是遇到了同样的错误。我能够如下修复我的客户。

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

    <security mode="TransportCredentialOnly">
      <transport clientCredentialType="Windows" proxyCredentialType="None" realm="" />
      <message clientCredentialType="UserName" algorithmSuite="Default" />
    </security>
    
  2. 在代码中,将代理类设置为允许模拟(我向称为客户的服务添加了引用):

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

2
如果以编程方式执行此操作,请确保使用Dim绑定作为New System.ServiceModel.BasicHttpBinding()而不是Dim绑定作为New System.ServiceModel.WSHttpBinding()
Stefan Steiger

2
我真的不知道Customer_PortClient是什么,但是设置安全模式可以帮助我解决问题。
内森

2
使用<security mode="TransportCredentialOnly">时,您似乎不需要包括配置以确保邮件安全;SOAP消息以未加密的纯文本格式发送。该<message>标签似乎被忽略,因此不会造成任何伤害,只是不需要。来源:msdn.microsoft.com/en-us/library/ff648505.aspx
Ben Cottrell,2016年

“配置”在哪里?我有点像新人。编辑:nvmd从这里弄清楚了:docs.microsoft.com/en-us/dotnet/framework/wcf/…–
克里斯蒂安·拉米雷斯

13

我有一个类似的问题,您是否尝试过:

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

10

我发现的该错误的另一种可能的解决方案。可能尚未回答OP的确切问题,但可能会帮助偶然发现此错误消息的其他人。

我正在使用WebHttpBinding在代码中创建我的客户端,以便复制以下行:

<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;


7

我看到这还没有得到答案,这是这里的确切报价:

WSHttpBinding将尝试在SSP层上执行内部协商。为了使此操作成功,您将需要在IIS中为VDir允许匿名。然后,默认情况下,WCF将通过SPNEGO获取窗口凭据。在IIS层允许匿名不允许任何人进入,这将延迟到WCF堆栈。

我是通过以下方式找到的: 网址 http //fczaja.blogspot.com/2009/10/http-request-is-unauthorized-with.html

谷歌搜索之后:http : //www.google.tt/#hl=zh-CN&source=hp&q=+The+HTTP+request+is+un+authorized+with+client+authentication+scheme+%27Anonymous


嗨,@ Irwin,谢谢您的回答。您能否请我提供更多“官方”资源(例如Microsoft产生的原始文档)给我,以证明这一点对审计师?非常感谢!!Marcelo
Marcelo Finki 2014年

5

我有一个类似的问题,并尝试了上面建议的一切。然后,我尝试将clientCreditialType更改为Basic,一切正常。

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

3

这是我必须做的才能使此工作正常进行的步骤。这表示:

  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>        

1

尝试像下面那样在客户端中提供用户名和密码

client.ClientCredentials.UserName.UserName = @“域\用户名”; client.ClientCredentials.UserName.Password =“密码”;


1

在部署我们的服务并在Azure中将临时服务调用到暂存环境后,今天我遇到了同样的错误。在本地将该服务称为外部服务,没有错误,但是在部署之后没有。

最后,事实证明外部服务具有IP验证。Azure中的新环境具有另一个IP,因此被拒绝。

因此,如果您遇到此错误,请致电外部服务

这可能是IP限制。


0

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

我不确定这不是最好的方法,但是它可以用于测试。


您能否在此处共享相同的代码段?
Spidi's Web

我会尝试找到它的,但是这篇文章来自7年前,所以我不知道是否会找到它...
David Brunelle

0

我也有这个错误,最后这个代码对我有用 dot net core 3.1中有用

首先在命令提示符下安装svcutil:dotnet工具install --global dotnet-svcutil

然后关闭命令提示符,然后再次将其打开。

然后在命令提示符下创建Reference.cs

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

(它需要一个回车键以及用户名和密码)

将名为Connected Services的文件夹添加到项目根目录。

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;
        }

    }

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

<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.*" />
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.