将 HTTPS 绑定添加到 IIS 后,具有 Windows 身份验证的 WCF SOAP Web 服务停止工作

Posted

技术标签:

【中文标题】将 HTTPS 绑定添加到 IIS 后,具有 Windows 身份验证的 WCF SOAP Web 服务停止工作【英文标题】:WCF SOAP Web Service with Windows Authentication stops working, after adding an HTTPS binding to IIS 【发布时间】:2020-10-03 16:16:01 【问题描述】:

我看到了奇怪的行为。当我将 HTTPS 绑定添加到 IIS 时,我的 Web 服务停止工作。无论我是否通过以“http://”或“https://”开头的 URL 使用我的服务,都会发生这种情况。

来自我的服务的错误消息

主机上配置的认证方案 ('IntegratedWindowsAuthentication') 不允许那些在 绑定“BasicHttpsBinding”(“匿名”)。请确保 SecurityMode 设置为 Transport 或 TransportCredentialOnly。 此外,这可以通过更改身份验证来解决 此应用程序的方案通过 IIS 管理工具,通过 ServiceHost.Authentication.AuthenticationSchemes 属性,在 应用程序配置文件在 元素,通过更新绑定上的 ClientCredentialType 属性, 或通过调整 AuthenticationScheme 属性 HttpTransportBindingElement。

我在 IIS 中添加的 HTTPS 绑定

在 IIS 中验证我的服务

我的服务的 web.config

<?xml version="1.0"?>
<configuration>

  <appSettings>
    <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
  </appSettings>
  <system.web>
    <compilation debug="true" targetFramework="4.5" />
    <httpRuntime targetFramework="4.5"/>
  </system.web>
  <system.serviceModel>
    <bindings>
      <basicHttpBinding>
        <binding name="">
          <security mode="TransportCredentialOnly">
            <transport clientCredentialType="Windows" />
          </security>
        </binding>
      </basicHttpBinding>
    </bindings>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <!-- To avoid disclosing metadata information, set the values below to false before deployment -->
          <serviceMetadata httpGetEnabled="true" 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="true"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <protocolMapping>
        <add binding="basicHttpsBinding" scheme="https" />
    </protocolMapping>    
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
  </system.serviceModel>
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
    <!--
        To browse web app root directory during debugging, set the value below to true.
        Set to false before deployment to avoid disclosing web app folder information.
      -->
    <directoryBrowse enabled="true"/>
  </system.webServer>

</configuration>

问题

此错误的原因是什么? 如何避免这种紧耦合?

【问题讨论】:

匿名访问好像被禁用了。您可以在 IIS 中启用它。有关详细信息,请参阅此链接:***.com/questions/37326076/… @Leth 也许我不明白。不会启用匿名身份验证,会破坏启用 Windows 身份验证的目的吗? 【参考方案1】:

默认情况下,IIS 似乎假定使用匿名身份验证的 basicHttpsBinding。我通过在我已经存在的无名 basicHttpBinding 下方添加一个带有 Windows 身份验证的 basicHttpsBinding(再次无名,以便它覆盖默认值)来解决它。

<basicHttpsBinding>
  <binding name="">
    <security mode="Transport">
      <transport clientCredentialType="Windows" />
    </security>
  </binding>
</basicHttpsBinding>

为此,我使用了内置于 Visual Studio 中的 WCF 配置编辑器。如果有人想知道所有这些设置的来源:

无论 IIS 中是否存在 HTTPS 绑定,它现在都能正常工作 我的服务现在也可以通过以“http://”或“https://”开头的 URL 工作

Microsoft 应该为 web.config 提供与 IIS 相同的结构,其中身份验证独立于绑定。如果他们将配置留给 IIS,这样设置就不会发生冲突,那就更好了。他们真的把球放在了这个上。

我的服务的新 web.config

<?xml version="1.0"?>
<configuration>

  <appSettings>
    <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
  </appSettings>
  <system.web>
    <compilation debug="true" targetFramework="4.5" />
    <httpRuntime targetFramework="4.5"/>
  </system.web>
  <system.serviceModel>
    <bindings>
      <basicHttpBinding>
        <binding name="">
          <security mode="TransportCredentialOnly">
            <transport clientCredentialType="Windows" />
          </security>
        </binding>
      </basicHttpBinding>
      <basicHttpsBinding>
        <binding name="">
          <security mode="Transport">
            <transport clientCredentialType="Windows" />
          </security>
        </binding>
      </basicHttpsBinding>
    </bindings>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <!-- To avoid disclosing metadata information, set the values below to false before deployment -->
          <serviceMetadata httpGetEnabled="true" 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="true"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <protocolMapping>
        <add binding="basicHttpsBinding" scheme="https" />
    </protocolMapping>    
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
  </system.serviceModel>
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
    <!--
        To browse web app root directory during debugging, set the value below to true.
        Set to false before deployment to avoid disclosing web app folder information.
      -->
    <directoryBrowse enabled="true"/>
  </system.webServer>

</configuration>

【讨论】:

请标记答案,以便帮助其他有类似问题的人 @samwu 我还不能。它说“您可以在 7 小时内接受自己的答案”

以上是关于将 HTTPS 绑定添加到 IIS 后,具有 Windows 身份验证的 WCF SOAP Web 服务停止工作的主要内容,如果未能解决你的问题,请参考以下文章

iis7 运行多个https,433端口监听多个htps 站点

IIS 具体怎样添加网站?

IIS实现全站HTTPS自动替换HTTP

IIS实现全站HTTPS自动替换HTTP

IIS实现全站HTTPS自动替换HTTP

以编程方式将具有写入权限的 IIS_IUSRS 添加到目录