被 https 中 WCF 服务的“远程服务器返回错误:(403)禁止”所困扰

Posted

技术标签:

【中文标题】被 https 中 WCF 服务的“远程服务器返回错误:(403)禁止”所困扰【英文标题】:Stumped by "The remote server returned an error: (403) Forbidden" with WCF Service in https 【发布时间】:2011-02-27 00:30:55 【问题描述】:

我有一个 WCF 服务,由于这个错误,我已经归结为几乎没有。它把我逼到了墙角。这就是我现在所拥有的。

一个非常简单的 WCF 服务,其中一个方法返回一个值为“test”的字符串。

一个非常简单的 Web 应用程序,它使用服务并将字符串的值放入标签中。

在 Win 2003 上运行带有 SSL 证书的 IIS 6 的 Web 服务器。

在同一台服务器上工作的其他 WCF 服务。

我将 WCF 服务发布到它的 https 位置

我在 VS 中以调试模式运行 Web 应用程序,它运行良好。

我将 Web 应用程序发布到 WCF 服务驻留在同一 SSL 证书下的同一台服务器上的 https 位置

我得到,“远程服务器返回错误:(403) Forbidden”

我几乎更改了 IIS 以及 WCF 和 Web 应用程序中的所有设置,但无济于事。我比较了 WCF 服务中的设置,一切都一样。

以下是 WCF 服务和 WEB 应用程序的 web.config 中的设置:

看来问题与 Web 应用程序有关,但我没有想法。任何想法:

WCF 服务:

  <system.serviceModel>
<bindings>

<client />

<services>
  <service behaviorConfiguration="Ucf.Smtp.Wcf.SmtpServiceBehavior" name="Ucf.Smtp.Wcf.SmtpService">
    <host>
      <baseAddresses>
        <add baseAddress="https://test.net.ucf.edu/webservices/Smtp/" />
      </baseAddresses>
    </host>
    <endpoint address="" binding="wsHttpBinding" contract="Ucf.Smtp.Wcf.ISmtpService" bindingConfiguration="SSLBinding">
      <identity>
        <dns value="localhost"/>
      </identity>
    </endpoint>
    <endpoint address="mex" binding="mexHttpsBinding" contract="IMetadataExchange"/>
  </service>
</services>

<behaviors>
  <serviceBehaviors>
    <behavior name="Ucf.Smtp.Wcf.SmtpServiceBehavior">
      <serviceMetadata httpsGetEnabled="true" />
      <serviceDebug includeExceptionDetailInFaults="true" httpsHelpPageEnabled="True"/>
    </behavior>
  </serviceBehaviors>
</behaviors>

网络应用:

    <system.serviceModel>
    <bindings><wsHttpBinding>
<binding name="WSHttpBinding_ISmtpService" closeTimeout="00:01:00"
 openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
 bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard"
 maxBufferPoolSize="524288" maxReceivedMessageSize="65536" messageEncoding="Text"
 textEncoding="utf-8" useDefaultWebProxy="true" allowCookies="false">
 <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
  maxBytesPerRead="4096" maxNameTableCharCount="16384" />
 <reliableSession ordered="true" inactivityTimeout="00:10:00"
  enabled="false" />
 <security mode="Transport">
  <transport clientCredentialType="None" proxyCredentialType="None"
   realm="" />
  <message clientCredentialType="Windows" negotiateServiceCredential="true"
   establishSecurityContext="true" />
 </security>
</binding>

<client>


<endpoint address="https://net228.net.ucf.edu/webservices/smtp/SmtpService.svc"
binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_ISmtpService"
contract="SmtpService.ISmtpService" name="WSHttpBinding_ISmtpService">
<identity>
 <dns value="localhost" />
</identity>

  </client>
</system.serviceModel>

【问题讨论】:

【参考方案1】:

我将在这个问题上花费数小时后回答我自己的问题。我希望这可以帮助所有其他试图解决这个问题的人。我们终于让网络管理员参与进来并解决了这个问题。

这是场景和解决方案:

我们有一个生产服务器 - 一切正常。 我们有一个测试服务器 - 我们收到 403 禁止错误。 在本地调试工作正常。

所有的设置都和我们想的差不多。

有一个设置错误。在 IIS 中的目录安全选项卡下的 web 服务的虚拟目录的属性中,第二个编辑按钮用于 IP 限制。我们设置为拒绝访问所有 IP,除了应该包含测试服务器 IP 的列表。测试网络服务器的 IP 未被授予权限。它没有权限的原因是它最近是从生产虚拟服务器克隆的,并且从未调整此设置以添加测试虚拟服务器。

【讨论】:

【参考方案2】:

在我的例子中,我从另一台机器上复制了源代码,并且这里没有创建虚拟目录。一旦我进入项目属性并创建了虚拟目录,它就可以正常工作了。

【讨论】:

【参考方案3】:

确保您已设置compilation debug="true"

【讨论】:

【参考方案4】:

唯一让我感到震惊的是您正在通过消息传递 Windows 身份,如果传递的用户帐户无权访问 WCF 服务,这可能会导致权限问题。可能需要在网络应用上进行模拟?

【讨论】:

【参考方案5】:

默认情况下,WCF 绑定不允许匿名 (no-auth) 访问。你需要modify the bindings 允许它:

  <wsHttpBinding> 
    <binding ...> 
        <security mode ="None"/> 
    </binding> 
  </wsHttpBinding>

【讨论】:

【参考方案6】:

在我的情况下,我的 apppool 用户由于某种原因没有对“C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files”的读\写访问权限。

【讨论】:

以上是关于被 https 中 WCF 服务的“远程服务器返回错误:(403)禁止”所困扰的主要内容,如果未能解决你的问题,请参考以下文章

向 WCF 发送集合时,远程服务器返回错误:NotFound

WCF - 远程服务器返回意外响应:(400)错误请求

Post 请求WCF接口报:远程服务器返回错误: (415)

具有 30mb 输入字符串的 WCF 服务 - 远程服务器返回错误:(413)请求实体太大

WCF LIST 传输大数据,远程服务器返回了意外响应 400

远程服务器返回了意外响应:(400) Bad Request WCF REST