WCF错误:服务未对调用方进行身份验证

时间:2008-11-12 16:38:45

标签: .net wcf security wcf-binding

我正在尝试从客户端控制台应用程序访问服务器上的WCF服务以进行测试。我收到以下错误:

  

来电者未经过身份验证   服务

我正在使用wsHttpBinding。我不确定服务期望的身份验证类型是什么?

                                                       
                        
    

<behaviors>
  <serviceBehaviors>
    <behavior name="MyTrakerService.MyTrakerServiceBehavior">
      <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
      <serviceMetadata httpGetEnabled="true"/>
      <!-- To receive exception details in faults for debugging purposes, set the value below to true.  Set to false before deployment to avoid disclosing exception information -->
      <serviceDebug includeExceptionDetailInFaults="false"/>
    </behavior>
  </serviceBehaviors>
</behaviors>

更新的 如果我将绑定更改为<endpoint "basicHttpBinding" ... />(来自wsHttpBinding),它会起作用 在IIS 7.0托管,Windows 2008服务器

11 个答案:

答案 0 :(得分:25)

如果使用basicHttpBinding,请将端点安全性配置为“None”,并将clientCredintialType传输为“None”。

<bindings>
    <basicHttpBinding>
        <binding name="MyBasicHttpBinding">
            <security mode="None">
                <transport clientCredentialType="None" />
            </security>
        </binding>
    </basicHttpBinding>
</bindings>
<services>
    <service behaviorConfiguration="MyServiceBehavior" name="MyService">
        <endpoint 
            binding="basicHttpBinding" 
            bindingConfiguration="MyBasicHttpBinding"
            name="basicEndPoint"    
            contract="IMyService" 
        />
</service>

此外,请确保IIS中的目录身份验证方法启用匿名访问

答案 1 :(得分:23)

我明白了。

如果你想使用wshttpbinding,你需要添加如下的Windows凭证。

svc.ClientCredentials.Windows.ClientCredential.UserName = "abc";
svc.ClientCredentials.Windows.ClientCredential.Password = "xxx";

感谢

答案 2 :(得分:4)

您是否尝试过使用basicHttpBinding而不是wsHttpBinding?如果不需要任何身份验证并且不需要Ws- *实现,那么使用普通的basicHttpBinding可能会更好。 WsHttpBinding实现了WS-Security以实现消息安全和身份验证。

答案 3 :(得分:2)

在虚拟目录中设置匿名访问

将以下凭据写入您的服务

ADTService.ServiceClient adtService = new ADTService.ServiceClient();
adtService.ClientCredentials.Windows.ClientCredential.UserName="windowsuseraccountname";
adtService.ClientCredentials.Windows.ClientCredential.Password="windowsuseraccountpassword";
adtService.ClientCredentials.Windows.ClientCredential.Domain="windowspcname";

之后,您将调用您的Web服务方法。

答案 4 :(得分:1)

如果您使用像我这样的自托管站点,避免此问题的方法(如上所述)是在主机和客户端都规定wsHttpBinding安全模式= NONE。

在客户端和主机上创建绑定时,您可以使用以下代码:

 Dim binding as System.ServiceModel.WSHttpBinding 
 binding= New System.ServiceModel.WSHttpBinding(System.ServiceModel.SecurityMode.None)

 System.ServiceModel.WSHttpBinding binding
 binding = new System.ServiceModel.WSHttpBinding(System.ServiceModel.SecurityMode.None);

答案 5 :(得分:1)

我可以按照以下步骤解决共享问题:

  1. 转到IIS - &gt; 网站 - &gt; 您的网站 - &gt;
  2. 功能查看窗格 - &gt; 身份验证
  3. 匿名身份验证设置为已禁用
  4. Windows身份验证设置为已启用
  5. enter image description here

答案 6 :(得分:0)

我们遇到了一个奇怪的问题,即托管WCF服务的文件夹有一些导致问题的权限。

答案 7 :(得分:0)

如果需要在webconfig中指定域(验证客户端使用的用户名和密码),可以将其放在system.serviceModel服务服务部分中:

<identity>          
<servicePrincipalName value="example.com" />
</identity>

并在客户端指定域名,用户名和密码:

 client.ClientCredentials.Windows.ClientCredential.Domain = "example.com";
 client.ClientCredentials.Windows.ClientCredential.UserName = "UserName ";
 client.ClientCredentials.Windows.ClientCredential.Password = "Password";

答案 8 :(得分:0)

如果客户端位于与服务器不同的域中,则可能导致此错误。

我在从我的PC(客户端)到我的(云)测试服务器测试我的一个应用程序时遇到了这个问题,而我能想到的最简单的解决方案是设置一个vpn。

答案 9 :(得分:0)

我在wsHtppBinding中也遇到了同样的问题。而且我只需要添加指向security的{​​{1}}模式,就可以解决我的问题,而无需切换到noneCheck Here并检查如何禁用WCF安全性。检查以下配置更改以供参考:

basicHttpBinding

答案 10 :(得分:-1)

为什么不能为wsHttpBinding(“none”而不是“message”或“transport”)完全删除安全设置?