我是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 ?
提前致谢 - 我很欣赏对此的一些见解!
查达
答案 0 :(得分:2)
如果您关闭服务的安全性,您也必须在客户端上关闭。如果在代码中配置客户端,则必须为NetTcpBinding
的新实例设置与配置文件中的服务相同的配置。
当使用Windows安全性时(默认为NetTcpBinding
),MachineB无法对MachineA中的本地帐户进行身份验证(有一些重复本地用户的技巧,但我不知道它们是否也适用于WCF)。这就是你有域名的原因。跨域Windows身份验证需要域之间的信任。
如果您需要对跨域用户或本地用户进行身份验证,则无法使用Windows身份验证。还有其他身份验证机制,但它们需要配置证书(至少在服务上),并使用客户端证书或用户名和密码进行客户端身份验证。