WCF net.tcp SSL,证书和用户名+密码验证

时间:2014-03-07 12:21:38

标签: wcf ssl forms-authentication net.tcp .net-4.5

我想构建一个客户端服务器,WPF-WCF应用程序,它应该满足以下要求:

  • 快速
  • 客户端与服务器之间的安全通信
  • 如果用户想要使用客户端应用程序,他应该在他的计算机上安装某个证书并提供有效的用户名/密码对
  • 一切都应该通过互联网进行

所以我在两天前开始研究它,在经历了几乎所有的示例/教程后,我发现接近我的场景,我设法使用IIS中托管的net.tcp绑定构建WCF服务( 8我认为)并通过mex端点和一个小的客户端控制台应用程序公开其元数据,该应用程序可以连接到服务并调用其唯一的HelloWorld方法。

一切顺利,直到我开始尝试添加基于证书的安全性。我尝试了无数的配置组合和技术,但仍无法正常工作。

首先,我收到一些特定的错误消息,告诉我有关服务器或客户端证书无效的任何信息或任何方式的任何信息。 然后我跟着这些文章,因为我在开发时需要自签名证书。

然后,在我放弃之前,我开始收到越来越模糊的错误消息。 很可能我误解了WCF的工作原理,因为我没有那么多经验。

有效的配置是:

  • 服务配置

    <configuration>
      <system.web>
        <httpRuntime targetFramework="4.5.1"/>
      </system.web>
      <system.serviceModel>
        <behaviors>
          <serviceBehaviors>
            <behavior name="TcpServiceBehaviour">
              <serviceMetadata />
            </behavior>
          </serviceBehaviors>
        </behaviors>
        <services>
          <service behaviorConfiguration="TcpServiceBehaviour" name="WcfTcpServer.TcpService">
            <endpoint address="net.tcp://serverName/wcftcpserver/TcpService.svc" binding="netTcpBinding" name="TcpServiceEndpoint" contract="WcfTcpServer.ITcpService" />
            <endpoint address="SME" binding="mexTcpBinding" bindingConfiguration="" name="ServiceMetadataEndpoint" contract="IMetadataExchange" />
          </service>
        </services>
      </system.serviceModel>
    </configuration>
    
  • 客户端配置

    <configuration>
      <startup>
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.1" />
      </startup>
      <system.serviceModel>
        <client>
          <endpoint address="net.tcp://serverName/wcftcpserver/TcpService.svc" binding="netTcpBinding" contract="WcfTcpServer.ITcpService" name="TcpServiceEndpoint">
            <identity>
              <servicePrincipalName value="host/serverName.smth.smthElse.ro" />
            </identity>
          </endpoint>
        </client>
      </system.serviceModel>
    </configuration>
    

正如您所见,这就是无证书配置。 我在此配置中使用自签名证书所采取的任何步骤都会破坏应用程序。

我将.NetFramework 4.5.1用于所有内容。

我非常感谢帮助解决这个问题。如果需要,我可以提供我尝试的其他配置。

这甚至可能还是我徒劳无功?

谢谢!

1 个答案:

答案 0 :(得分:1)

简而言之,是的,您可以使用所谓的Supporting Tokens支持多个客户端凭据。

来自链接文章:

  

除了a之外,该示例还添加了X.509二进制安全性令牌   用户名安全令牌。令牌在WS-Security消息中传递   从客户端到服务的标头和部分消息是   使用与X.509安全令牌关联的私钥进行签名   向接收方证明拥有X.509证书。这个   当需要有多个时,它很有用   与消息进行身份验证或授权相关的声明   发件人。

关于在互联网上使用NetTcpBinding的主题:

通常建议将

NetTcpBinding用于Intranet方案。根据您的要求,我所阅读的大部分内容都建议您使用WsHttpBindingBasicHttpBinding进行互联网方案。如果安全性是您的首要关注点 - 建议的选择是WsHttpBinding Message级安全性。

为互联网方案选择绑定的指南:Internet Binding Scenarios