将 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 服务停止工作的主要内容,如果未能解决你的问题,请参考以下文章