从客户端传递到WCF的凭据不会存在

时间:2015-10-02 22:23:25

标签: c# wcf

我试图将Windows凭据传递到需要Windows身份验证的WCF服务,但似乎我的凭据没有进入服务。我的服务没有抛出任何错误,但是当我检查下面的2中的任何一个时它们都是空的。  var user = WindowsIdentity.GetCurrent().User; var callerUserName = ServiceSecurityContext.Current.WindowsIdentity.User;

这是我的客户端代码 ServiceReference1.DispatchServiceClient service = new DispatchServiceClient(); service.ClientCredentials.Windows.ClientCredential = ServiceCredentialsManager.GetNetworkCredentials(); service.ClientCredentials.UserName.UserName= ServiceCredentialsManager.GetNetworkCredentials().UserName; service.ClientCredentials.UserName.Password = ServiceCredentialsManager.GetNetworkCredentials().Password;

客户端配置 -       

 <basicHttpBinding>
    <binding name="BasicHttpsBinding_IDispatchService">
      <security mode="Transport">
        <transport clientCredentialType="Windows" />
      </security>
    </binding>
  </basicHttpBinding>
  <basicHttpsBinding>
    <binding name="basicHttpsBindingMax" maxBufferSize="999999999"
      maxReceivedMessageSize="999999999">
      <security mode="Transport">
        <transport clientCredentialType="Windows" />
      </security>
    </binding>
  </basicHttpsBinding>
</bindings>

服务配置 -

 <system.serviceModel>
      <bindings>
      <basicHttpBinding>
          <binding name="basicHttpsBinding">
              <security mode="Transport">
                  <transport clientCredentialType="Windows" />
              </security>
          </binding>
      </basicHttpBinding>
  </bindings>
<behaviors>
  <serviceBehaviors>
    <behavior>
      <!-- To avoid disclosing metadata information, set the values below to false before deployment -->
      <serviceMetadata httpGetEnabled="true" 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" />
    </behavior>
  </serviceBehaviors>
</behaviors>
<protocolMapping>
  <add binding="basicHttpsBinding" scheme="https" />
</protocolMapping>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />

1 个答案:

答案 0 :(得分:2)

请注意,要使用Windows身份验证,必须在同一Windows域中运行服务和客户端应用程序。

还请确保客户端中您分配的值不为空。通常,使用Windows身份验证时无法从代码访问密码。

如果使用Windows身份验证对服务客户端进行身份验证,则可能不应手动​​将凭据传递给服务。身份验证过程应由WCF自动处理,并不仅仅依赖于发送凭据,而是例如它可以使用Kerberos票证。

请在此处查看客户和服务的一些说明和代码示例:

<强>更新

经过一些研究后,我发现有几个消息来源建议在客户端代码中正确设置凭据可能会使WCF从域外进行身份验证:

这些文章中建议的代码示例类似,但与您在问题中发布的代码示例略有不同。我没有测试过这些方法,但它们可能无法在所有情况下使用。