【问题标题】:SecurityNegotiationException raises for WCF Service client为 WCF 服务客户端引发 SecurityNegotiationException
【发布时间】:2015-07-30 13:36:18
【问题描述】:

我有一个使用用户名和密码保护的 WCF 服务。 我写了一个简单的客户端,但是当我尝试调用 Web Service 方法时,我收到 SecurityNegotiationException 异常。

Web服务的配置如下:

<services>
  <service name="MyServ.Service1"
           behaviorConfiguration="MyBehavior">
    <endpoint address=""
              binding="basicHttpBinding"
              bindingConfiguration="MyBindingConfiguration"
              contract="MyServ.IService1" />
    <endpoint address="mex"
              binding="mexHttpsBinding"
              contract="IMetadataExchange" />
  </service>

</services>

<bindings>
  <basicHttpBinding>
    <binding name="MyBindingConfiguration">
      <security mode="TransportWithMessageCredential">
        <message clientCredentialType="UserName" />
      </security>
    </binding>
  </basicHttpBinding>
</bindings>

<behaviors>
  <serviceBehaviors>
    <behavior name="MyBehavior">
      <serviceMetadata httpsGetEnabled="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="true"/>
      <serviceCredentials>
        <userNameAuthentication userNamePasswordValidationMode="Custom"
                                customUserNamePasswordValidatorType="MyServ.CustomValidator, MyServ"/>
      </serviceCredentials>
    </behavior>
  </serviceBehaviors>
</behaviors>

客户端程序如下所示:

        var binding = new BasicHttpBinding(BasicHttpSecurityMode.TransportWithMessageCredential);
        var endpointAddress = new EndpointAddress(@"https://localhost:8083/MyServ/Service1.svc");

        using (var service = new Service1Client(binding, endpointAddress))
        {
            var loginCredentials = new ClientCredentials();
            loginCredentials.UserName.UserName = @"user";
            loginCredentials.UserName.Password = @"password";

            var defaultCredentials = service.Endpoint.Behaviors.Find<ClientCredentials>();
            service.Endpoint.Behaviors.Remove(defaultCredentials); //remove default ones
            service.Endpoint.Behaviors.Add(loginCredentials); //add required ones

            var data = service.GetData(100);
            Console.WriteLine(data);
            Console.ReadLine();
        }

每次执行 service.GetData(100) 时,我都会收到 SecurityNegotiationException 异常。

有人可以帮忙吗?

【问题讨论】:

  • 作为一个想法...你可以初始化 service.ClientCredentials.UserName.UserName 和 ervice.ClientCredentials.UserName.Password 而是创建一个新的并删除删除默认 ClientCredentials
  • 我听从了您的建议,但没有帮助。存在同样的错误。
  • 如果你在你的服务器验证器上进入验证方法,你能检查调试器吗?
  • 这是另一个问题。我没有得到验证方法。你能猜到为什么吗?

标签: c# wcf service https


【解决方案1】:

这可能有很多原因。不幸的是,WCF 错误消息没有明确提示您出了什么问题。

如果我是你,我会建议以下路线图:

  1. 已检查防火墙规则。查看你的 8083 端口是否打开
  2. 检查是否正确订阅了 SLL 证书netsh http add sslcert ipport=0.0.0.0:8083 certhash={your hash} appid={your id}
  3. 临时设置your security modeNone并测试查看wcf服务网站(wsdl站点)
  4. 如果您可以看到 wcf 服务站点,请将您的客户端调整为 None security mode 并尝试调用方法。如果不起作用。尝试在非常强大的用户下运行您的客户端as Admin
  5. 当 WCF 服务在 HTTPS 下没有问题时,通过用户名和密码进入 Auth 时

【讨论】:

    猜你喜欢
    • 2011-01-09
    • 2011-02-16
    • 2011-02-08
    • 2014-08-22
    • 1970-01-01
    • 2011-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多