WCF 服务的 basicHttpBinding 上的 HTTPS

Posted

技术标签:

【中文标题】WCF 服务的 basicHttpBinding 上的 HTTPS【英文标题】:HTTPS on basicHttpBinding for WCF Service 【发布时间】:2012-01-10 09:34:56 【问题描述】:

我使用的是 IIS 7。HTTPS 绑定在其上启用了端口号 443。我在网站下有一个 WCF 服务作为应用程序。我正在尝试基于http://msdn.microsoft.com/en-us/library/ms729700.aspx 向服务(使用basicHttpBinding)引入HTTPS 安全性

我收到以下错误 - “提供的 URI 方案 'https' 无效;预期'http'。”。当我检查事件日志时,它的堆栈跟踪如下:

Stack Trace :    at System.ServiceModel.Channels.TransportChannelFactory`1.ValidateScheme(Uri via)

at System.ServiceModel.Channels.HttpChannelFactory.ValidateCreateChannelParameters(EndpointAddress remoteAddress, Uri via)

需要进行哪些更改才能使用 basicHttpBinding 在 HTTPS 上工作?

注意:证书是使用 IIS 7 中的“创建自签名证书”创建的。

 <system.serviceModel>

  <behaviors>
<serviceBehaviors>
  <behavior name="serviceFaultBehavior">
    <serviceMetadata httpGetEnabled="true" />
    <serviceDebug includeExceptionDetailInFaults="true"/>
  </behavior>
</serviceBehaviors>
  </behaviors>

  <services>
<service name="Business.TV.Clearance.Services.ServiceHandler"
         behaviorConfiguration="serviceFaultBehavior">
  <endpoint address=""
            binding="basicHttpBinding"
            contract="Business.TV.Clearance.Services.IServiceHandler"
            bindingConfiguration="httpBinding">
    <identity>
      <dns value="localhost" />
    </identity>
  </endpoint>
</service>

  <bindings>
<basicHttpBinding>

  <binding name="httpBinding"
           maxReceivedMessageSize="2000000"
           maxBufferSize="2000000">

    <security mode="Transport">
      <transport clientCredentialType="Windows" />
    </security>


    <readerQuotas maxDepth="2147483647"
                  maxStringContentLength="2147483647"
                  maxArrayLength="2147483647" />
  </binding>
</basicHttpBinding>
  </bindings>

   <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />

   <extensions>
 <behaviorExtensions>
  <add name="serviceFaultBehavior"
type="Business.TV.Clearance.Services.ServiceFaultBehaviorExtensionElement,Business.TV.Clearance.Services, Version=1.0.0.0, Culture=neutral"/>
</behaviorExtensions>
  </extensions>

</system.serviceModel>

【问题讨论】:

你试过在端点地址中显式吗? 我尝试使用显式地址“10.10.XXX.YYY/MyService/ServiceHandler.svc”。仍然存在同样的问题。没有其他终点。 取决于您的证书的颁发目的。它通常用于机器名称,而不是 IP。您在配置中有其他端点吗?您是否尝试过指定端点地址? 也应该是机器名 证书是使用 IIS 7 中的“创建自签名证书”创建的。 【参考方案1】:

你需要改变:

<serviceMetadata httpGetEnabled="true" />

到:

<serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />

【讨论】:

我添加了 httpsGetEnabled="true"。仍然存在同样的错误 它会允许生成服务引用,但这里还没有问题【参考方案2】:

请尝试如下图:

<service name="UserNameWithoutSSL.UsernameWithSSLService" behaviorConfiguration="TransportWithSecurity">
  <endpoint address="" binding="basicHttpBinding" bindingConfiguration="usernameViaSSL" contract="UserNameWithoutSSL.IUsernameWithSSLService">
    <identity>
      <dns value="localhost"/>
    </identity>
  </endpoint>
  <endpoint address="mex" binding="mexHttpsBinding" contract="IMetadataExchange" />
  <host>
    <baseAddresses>
      <add baseAddress="https://PCName/" />
    </baseAddresses>
  </host>
</service>

<basicHttpBinding>
  <binding name="usernameViaSSL">
    <security mode="TransportWithMessageCredential">
      <message clientCredentialType="UserName"/>
    </security>
  </binding>
</basicHttpBinding>

<serviceBehaviors>
  <behavior name="TransportWithSecurity">
    <serviceCredentials>
      <serviceCertificate findValue="localhost" storeLocation="LocalMachine"
        storeName="My" x509FindType="FindBySubjectName" />
      <userNameAuthentication userNamePasswordValidationMode="Windows" />
    </serviceCredentials>
    <serviceMetadata httpsGetEnabled="true" />
    <serviceDebug includeExceptionDetailInFaults="true" />
  </behavior>
</serviceBehaviors>

现在在虚拟目录上的 IIS 上,您需要映射 443 以接受 Https 流量并分配它需要用于保护传输层的证书。

【讨论】:

clientCredentialType="用户名"。我在哪里定义服务的用户名?有任何参考文件可以为此完成完整的申请吗? 您可以将其从“用户名”更改为“Windows”。这取决于您想要用于身份验证的客户端证书类型【参考方案3】:

请尝试替换以下内容,这应该可以。

原文:

<security mode="Transport">
<transport clientCredentialType="Windows" />
</security>

替换为:

<security mode="Transport">
<transport clientCredentialType="None" />
</security>

【讨论】:

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

WCF 服务 maxReceivedMessageSize basicHttpBinding 问题

自托管 WCF 服务和 basicHttpBinding:绑定不提供表示调用者的 Windows 标识

WCF 4 Web 服务中的 UsernameToken 和 SSL - 但使用 basicHttpBinding

没有 MEX 端点的带有 BasicHttpBinding 的 WCF 服务可以被绝对陌生的人利用吗?

如何在 IIS 中将 WCF 与 basichttpbinding only 、 SSL 和 Basic Authentication 一起使用?

WCF 服务的 PerCall InstanceContextMode 行为