【问题标题】:WCF net.tcp SSL, certificate and username + password authenticationWCF net.tcp SSL、证书和用户名+密码认证
【发布时间】:2014-03-07 12:21:37
【问题描述】:

我想构建一个客户端-服务器、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。

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

这是可能的还是我徒劳的尝试?

谢谢!

【问题讨论】:

  • 一般不建议通过互联网绑定net.tcp。 WCF(尤其是在 Internet 上)的很大一部分是安全性。一般来说,最适合 Internet 场景的是 WsHttpBinding with Message security。因为它提供end-to-end 安全性并实现WS-* 规范。这是一篇有用的文章:msdn.microsoft.com/en-us/library/ff650874.aspx

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


【解决方案1】:

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

来自链接的文章:

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

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

NetTcpBinding一般推荐用于内网场景。我读过的大部分内容都建议根据您的要求将WsHttpBindingBasicHttpBinding 用于互联网场景。如果安全性是您最关心的问题 - 推荐的选择是 WsHttpBindingMessage 级别的安全性。

为互联网场景选择绑定的指南:Internet Binding Scenarios

【讨论】:

  • 安全性不应成为选择 WsHttp 而不是 NetTcp 绑定的理由 - 两者都支持客户端证书和用户名/密码选项,并提供完整的传输加密。此外,@Leif 列表中的第一项是“Fast”。在这方面,NetTcpBinding 几乎肯定会产生更紧凑的消息,因此具有更好的吞吐量。
  • @Rob:你说得对,安全不应该成为选择WsHttp 而不是NetTcp 的理由。实际上,在撰写本文时,我不相信 NetTcpBinding 支持 Message 级别的安全性 - 感谢您指出这一点。互操作应该是选择WsHttp 而不是NetTcp 的理由,因为NetTcp 是WCF 专门使用的专有协议。使用NetTcp 还需要自定义防火墙配置。它将优于其他绑定,但由于这是一个互联网场景 - 通过互联网引入的延迟将掩盖大部分性能提升。
  • 公平地说,如果互操作是主要问题,WsHttpBinding 将不是可行的方法,BasicHttpBindingWebHttpBinding (REST) 将是更好的绑定选择。哎呀,如果你打算使用 RESTful,那么 ASP.NET Web API 或其他框架会更合适。
猜你喜欢
  • 2011-11-19
  • 2011-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-04
  • 1970-01-01
相关资源
最近更新 更多