如何在 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"/>
【问题讨论】:
您是否希望它仅与webHttpBinding
或basichttpbinding
一起也能达到目的?
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'
。这是因为 你需要在绑定中设置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?的主要内容,如果未能解决你的问题,请参考以下文章
如何理解一个服务调用是“Restful 服务调用”还是“标准 wcf 调用”?
如何使用用户名/密码 + SSL 使用 WCF 配置安全 RESTful 服务