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

时间:2011-08-01 09:26:53

标签: 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.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;

我有一个界面来描述服务中的方法。

我遇到的主要问题是这个。假设在 domainA 上运行 Machine1 Machine2 。让我们假设 Machine1 托管服务, Machine2 运行客户端。

当我使用域帐户 domainA \ User 连接到该服务时,该服务运行正常,但说我在 Machine2 上有本地用户并想要连接到作为 Machine2 \ LocalUser 服务,我收到以下错误消息:

  

服务器已拒绝客户端凭据。

我尝试过将安全模式设置为none(不是我喜欢做的事情),但后来我收到一条错误消息,指出客户端和服务的配置不匹配。

我有什么办法可以解决这个问题吗?此外,如果用户从另一个域调用 domainA \ Machine1 上运行的服务,会发生什么情况 - 例如 domainB \ User2

提前致谢 - 我很欣赏对此的一些见解!

查达

1 个答案:

答案 0 :(得分:2)

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

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

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