繁体   English   中英

具有Windows身份验证的WCF服务将引发异常“未定义用户名”,即使已定义

[英]WCF service with Windows authentication throws exception “Username not defined” even if it is defined

我正在C#控制台项目上使用WCF服务。 此WCF服务使用Windows身份验证和HTTPS,因此我如下修改了App.config:

<configuration>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
  </startup>
  <system.serviceModel>
    <bindings>
      <basicHttpsBinding>
        <binding name="TestYannisSOAPBinding">
          <security mode="TransportWithMessageCredential">
            <transport clientCredentialType="Windows" proxyCredentialType="Windows" realm="xxxxx.xxxx.eu" />
            <message clientCredentialType="UserName" algorithmSuite="Default" />
          </security>
        </binding>
        <binding name="TestYannisSOAPBinding1" />
      </basicHttpsBinding>
    </bindings>
    <client>
      <endpoint address="https://xxxxx.xxxxx.eu/TESTYANNIS_WEB/awws/TestYannis.awws"
              binding="basicHttpsBinding" bindingConfiguration="TestYannisSOAPBinding"
              contract="ServiceReference1.TestYannisSOAPPortType" name="TestYannisSOAPPort" />
    </client>        
  </system.serviceModel>
</configuration>

如您所见,我指定了安全模式TransportWithMessageCredential ,将传输作为Windows客户端凭据类型。

在后面的代码中,我确实指定了以下Windows凭据:

TestYannisSOAPPortTypeClient client = new TestYannisSOAPPortTypeClient();
client.ClientCredentials.Windows.ClientCredential.UserName = "yannis";
client.ClientCredentials.Windows.ClientCredential.Password = "xxxxxx";

在运行时,我收到以下异常:

System.InvalidOperationException:用户名未定义。 在ClientCredentials中指定一个用户名。

我可以通过指定用户名和密码来摆脱这种异常:

client.ClientCredentials.UserName.UserName = "yannis";
client.ClientCredentials.UserName.Password = "xxxxxx";

但是,这次我从远程服务器收到一个异常,该异常不希望我通过这种方式进行身份验证。 为什么只在client.ClientCredentials而不在Windows.ClientCredential挖掘?

我可以说WCF服务通过使用称为Ready!API的服务测试软件在服务器端工作。 这是完全相同的请求的屏幕截图:

在此处输入图片说明

我猜问题出在我的App.config上,但我已经尝试了所有方法。 安全模式为Transport ,带有或不带有Message对象等。

这是由于您的应用程序配置的这一行:

 <message clientCredentialType="UserName" algorithmSuite="Default" />

但是我不明白为什么要修改您的应用程序配置。 通常,当您添加服务引用时,它会基于服务的wsdl生成权限绑定。 要使用Windows身份验证,您应该在绑定中输入以下内容:

  <binding name="TestYannisSOAPBinding">
      <security mode="TransportCredentialOnly">
        <transport clientCredentialType="Windows" ... />
      </security>
    </binding>

您可以准备尝试这种情况:

        <binding name="TestYannisSOAPBinding">
            <security mode="TransportWithMessageCredential">
                <transport clientCredentialType="None" />
                <message clientCredentialType="Windows"/>
            </security>
        </binding>

您不需要指定传输安全标签。 由于使用HTTPS连接来保护您的安全,因此传输已得到保护。 对于这种安全模式,传输标签在您的应用程序中不会起作用。 对于您遇到的错误,请确保仅在IIS中启用匿名身份验证。 然后尝试再次运行该应用程序。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM