如何在 WCF RESTful 服务上启用 HTTPS?

Posted

技术标签:

【中文标题】如何在 WCF RESTful 服务上启用 HTTPS?【英文标题】:How to enable HTTPS on WCF RESTful Service? 【发布时间】:2015-05-28 14:10:36 【问题描述】:

如何使 wcf 在 https 上工作。我想在 https 上使用这个 wcf 我已经搜索了很多文章我没有得到答案请帮助 iam 新 wcf 概念。我想从ajax,jquery调用它

 <system.serviceModel >
<services>
  <service
    name="WcfRestfulService.HttpService" behaviorConfiguration="ServiceBehaviour" >
    <endpoint address="" binding="webHttpBinding" behaviorConfiguration="web"
              contract="WcfRestfulService.IHttpService">
    </endpoint>
  </service>
</services>
<behaviors>
  <serviceBehaviors>
    <behavior name="ServiceBehaviour">
      <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
      <serviceMetadata httpsGetEnabled="true"/>
      <!-- To receive exception details in faults for debugging purposes, set the value below to true.  Set to false before deployment to avoid disclosing exception information -->
      <serviceDebug includeExceptionDetailInFaults="false"/>
    </behavior>
  </serviceBehaviors>
  <endpointBehaviors>
    <behavior name="web">
      <webHttp/>
    </behavior>
  </endpointBehaviors>
</behaviors>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true"/>

【问题讨论】:

您是否希望它仅与webHttpBindingbasichttpbinding 一起也能达到目的? Derek W 的回答是完美的,但有一点:<bindings>元素不能在 <services> 中- 在 </services> 之后将其移动到位在<行为>之前。 【参考方案1】:

您似乎正在使用 WCF 构建一个 RESTful 服务,并且您真的很接近来保护它。

您需要采取以下措施来保护它:

    添加新的WebHttpBinding 配置,将安全模式设置为Transport。 将新的WebHttpBinding 配置分配给您的服务端点绑定。 通过设置httpGetEnabled="false",确保您的 RESTful 服务只能通过 HTTPS 访问。 将元数据发布端点设置为使用 HTTPS。

这些更改都在修改后的配置文件中进行了总结(请参阅 cmets 了解更改的要点)。另请注意,您的服务端点必须使用 HTTPS 方案而不是 HTTP。

<system.serviceModel >
  <services>
     <service name="WcfRestfulService.HttpService"
              behaviorConfiguration="ServiceBehaviour" >
         <endpoint address="" 
                   binding="webHttpBinding"
                   <!-- Add reference to secure WebHttpBinding config -->
                   bindingConfiguration="webHttpTransportSecurity"
                   behaviorConfiguration="web"
                   contract="WcfRestfulService.IHttpService" />
         <!-- Need to make sure that our metadata 
              publishing endpoint is using HTTPS as well -->
         <endpoint address="mex"
                   binding="mexHttpsBinding"
                   contract="IMetadataExchange" />
     </service>
  </services>
  <!-- Add secure WebHttpBinding config -->
  <bindings>
     <webHttpBinding>
        <binding name="webHttpTransportSecurity">
           <security mode="Transport" />
         </binding>
      </webHttpBinding>
  </bindings>
  <behaviors>
      <serviceBehaviors>
         <behavior name="ServiceBehaviour">
             <serviceMetadata httpsGetEnabled="true"
                              <!-- Make sure the service can 
                                 be accessed only via HTTPS -->
                              httpGetEnabled="false"/>
             <serviceDebug includeExceptionDetailInFaults="false"/>
         </behavior>
      </serviceBehaviors>
      <endpointBehaviors>
         <behavior name="web">
             <webHttp/>
         </behavior>
      </endpointBehaviors>
  </behaviors>
  <serviceHostingEnvironment multipleSiteBindingsEnabled="true"/>
</system.serviceModel>

【讨论】:

这对我有所帮助,但稍作调整。使用相同的答案,我遇到了这个错误Unrecognized element 'bindings'。这是因为 必须在 之外【参考方案2】:

你需要在绑定中设置security mode="Transport"

  <basicHttpBinding>
    <binding name="secureHttpBinding">
      <security mode="Transport">
        <transport clientCredentialType="None"/>
      </security>
    </binding>
  </basicHttpBinding>

阅读更多MSDN

【讨论】:

带有 WCF 的 RESTful 服务需要使用 WebHttpBinding 而不是 BasicHttpBinding.WebHttpBinding 是 WCF 以 RESTful 方式公开服务的方式。在基于 SOAP 的服务的上下文中,您的答案是正确的。【参考方案3】:

我有同样的问题,但想测试 HTTP 获取请求,因为我的服务是内部的。

记得也要启用 HTTPS。 httpsGetEnabled="true"

下面是我的配置示例:

   <bindings >
      <basicHttpBinding>
        <binding name="secureHttpBinding" >
          <security mode="Transport" />
        </binding>
   </bindings>
    .....
    <behaviors>
      <serviceBehaviors>
        <behavior >
          <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
          <serviceDebug includeExceptionDetailInFaults="false"/>
        </behavior>
       </serviceBehaviors>
     </behaviors>

【讨论】:

以上是关于如何在 WCF RESTful 服务上启用 HTTPS?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 WCF 4.0 REST 服务上启用基本身份验证?

如何理解一个服务调用是“Restful 服务调用”还是“标准 wcf 调用”?

如何对 WCF 4 RESTful 服务进行身份验证?

如何使用用户名/密码 + SSL 使用 WCF 配置安全 RESTful 服务

如何在 JBoss AS 上使用 java RESTful Web 服务启用 CORS

如何在 Restful WCF 服务中管理会话