C# 跨域使用WCF服务进行身份验证时出现问题

C# 跨域使用WCF服务进行身份验证时出现问题,c#,wcf,wcf-binding,wcf-security,wcf-client,C#,Wcf,Wcf Binding,Wcf Security,Wcf Client,我对WCF及其安全性还不熟悉,所以我正在寻找一些关于我遇到的问题的帮助 我有一个WCF服务,可以部署到一个小域中的每台机器上。WCF服务将托管在Windows服务中,因为其中有需要调用的方法。这项服务目前非常简单(它公开元数据-但我相信这将在以后关闭-这可能吗?)。它使用net.tcp绑定-服务的App.Config如下所示: <?xml version="1.0" encoding="utf-8" ?> <configuration> <system.serv

我对WCF及其安全性还不熟悉,所以我正在寻找一些关于我遇到的问题的帮助

我有一个WCF服务,可以部署到一个小域中的每台机器上。WCF服务将托管在Windows服务中,因为其中有需要调用的方法。这项服务目前非常简单(它公开元数据-但我相信这将在以后关闭-这可能吗?)。它使用net.tcp绑定-服务的App.Config如下所示:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.serviceModel>
    <services>
      <service behaviorConfiguration="SvcBehavior" name="Microsoft.ServiceModel.Samples.Svc">
        <endpoint address="" binding="netTcpBinding"
          contract="Microsoft.ServiceModel.Samples.ISvc" />
        <endpoint address="mex" binding="mexTcpBinding" bindingConfiguration=""
          contract="IMetadataExchange" />
        <host>
          <baseAddresses>
            <add baseAddress="net.tcp://*:8100/ServiceModelSamples/service" />
          </baseAddresses>
          <timeouts closeTimeout="00:10:00" openTimeout="00:10:00" />
        </host>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="SvcBehavior">
          <serviceMetadata httpGetEnabled="false" />
          <serviceDebug includeExceptionDetailInFaults="true" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
</configuration>

对于客户端,我有一个Winforms C应用程序。应用程序提供2个功能,它从服务中提取静态信息,然后给用户一个选项来验证和调用管理方法。因此,身份验证是在客户端级别完成的

我使用Channelfactory连接到该服务,因为主机名是可变的(客户端启动时会提示用户输入该主机名),客户端的app.config文件如下所示-实际上为空:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.serviceModel>
    <bindings>
     </bindings>
    <client />
  </system.serviceModel>
</configuration>

channelfactory代码为:

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
[System.ServiceModel.ServiceContractAttribute(Namespace = "http://Microsoft.ServiceModel.Samples", ConfigurationName = "ISvc")]


ChannelFactory<ISvc> myChannelFactory = new ChannelFactory<ISvc>(new NetTcpBinding(), "net.tcp://" + HostName + ":8100/ServiceModelSamples/service");
        public static ISvc client = null;
[System.CodeDom.Compiler.GeneratedCodeAttribute(“System.ServiceModel”,“4.0.0.0”)]
[System.ServiceModel.ServiceContractAttribute(命名空间=”http://Microsoft.ServiceModel.Samples“,ConfigurationName=“ISvc”)]
ChannelFactory myChannelFactory=newchannelfactory(new NetTcpBinding(),“net.tcp://“+HostName+”:8100/ServiceModelSamples/service”);
公共静态ISvc客户端=null;
我有一个描述服务中方法的接口

我遇到的主要问题是这个。假设有机器1和机器2在domainA上运行。让我们假设Machine1承载服务,Machine2运行客户端

当我使用域帐户domainA\User连接到该服务时,该服务工作正常,但如果我在Machine2上有一个本地用户,并希望以Machine2\LocalUser的身份连接到该服务,则会收到以下错误消息:

服务器已拒绝客户端凭据

我曾尝试过将安全模式设置为“无”(我不喜欢这样做),但后来我发现一个错误,说客户端和服务的配置不匹配

我能做些什么来解决这个问题吗?另外,如果在domainA\Machine1上运行的服务被另一个域(比如domainB\User2)的用户调用,会发生什么情况

提前谢谢-我很感激你能深入了解这一点


Chada

如果关闭服务的安全性,则必须同时关闭客户端的安全性。如果在代码中配置客户端,则必须为
NetTcpBinding
的新实例设置与在配置文件中的服务上相同的配置

当使用Windows安全性时(默认为
NetTcpBinding
),MachineB无法从MachineA验证本地帐户(对重复的本地用户有一些技巧,但我不知道他们是否也使用WCF)。这就是为什么你有一个域名。跨域windows身份验证需要域之间的信任


如果需要对跨域用户或本地用户进行身份验证,则不能使用Windows身份验证。还有其他身份验证机制,但它们需要配置证书(至少在服务上)并使用客户端证书或用户名和密码进行客户端身份验证。

非常感谢您的回答-现在很清楚,我不能真正依靠windows跨域身份验证,也不能使用具有标准身份验证的本地pc帐户-因此,我将停止追求这一点。但是,是否可以在没有证书的情况下使用用户名/密码身份验证?另外,是否有关于关闭客户端安全性的建议(如果我需要这样做的话)-我见过使用服务参考的示例,但没有使用ChannelFactory的示例否不可能在没有证书的情况下使用用户名和密码。此外,没有证书的用户名和密码=无安全性。如果您需要在客户端上设置安全性,请配置您正在实例化的
NetTcpBinding
。这是您应该能够做到的,谢谢您提供的信息,这将帮助我整理绑定配置。谢谢你的帮助。