IIS ARR反向代理正常运行,启用SSO后故障排查
问题:IIS ARR反向代理启用后端SSO后认证失败
我是IIS及ARR V3.0反向代理的新手。启用后端SSO认证前所有功能正常,直接访问后端应用时反向代理工作正常,但外部用户通过反向代理尝试认证时失败。
禁用SSO时流程:
- 公网用户→公网URL→IIS/ARR→认证→展示应用登录界面(后端仅一台Web服务器处理登录),一切正常。
启用SSO时流程:
- 公网用户→公网URL→IIS/ARR→认证→应用服务器→SSO应用服务器→IIS/ARR返回内部SSO服务器名称,出现DNS错误(外部DNS无该内部服务器记录)。浏览器显示内部服务器URL(
https://em004tcss066.xxxx.xxxx.xxx:8443/)并超时,背景可见redirectToSSO提示。
当前ARR重写规则配置:
<?xml version="1.0" encoding="UTF-8"?> <configuration> <system.webServer> <rewrite> <rules> <clear /> <rule name="ReverseProxyInboundRule1" stopProcessing="false"> <match url="^(.*)$" /> <conditions logicalGrouping="MatchAll" trackAllCaptures="false" /> <serverVariables> <set name="HTTP_REFERER" value="{HTTP_ACCEPT_ENCODING}" /> <set name="HTTP_X_ORIGINAL_ACCEPT_ENCODING" value="{HTTP_ACCEPT_ENCODING}" /> <set name="HTTP_ACCEPT_ENCODING" value="" /> </serverVariables> <action type="Rewrite" url="https://em004tcweb062.xxx.xxxxxxxxx.xxx:3000/{R:1}" logRewrittenUrl="true" /> </rule> </rules> <outboundRules> <rule name="ReverseProxyOutboundRule1" preCondition="ResponseIsHtml1"> <match filterByTags="A, Base, Form, Img" pattern="^http(s)?://em004tcweb062.xxx.xxxxxxxxx.xxx:3000/(.*)" /> <action type="Rewrite" value="https{R:1}://xxxxxteamcentertraining.xxx.xxxxxxxxx.xxx/{R:2}" /> </rule> <rule name="RestoreAcceptEncoding" preCondition="NeedsRestoringAcceptEncoding"> <match serverVariable="HTTP_ACCEPT_ENCODING" pattern="^(.*)$" /> <action type="Rewrite" value="{HTTP_X_ORIGINAL_ACCEPT_ENCODING}" /> </rule> <preConditions> <preCondition name="ResponseIsHtml1"> <add input="{RESPONSE_CONTENT_TYPE}" pattern="^text/html" /> </preCondition> <preCondition name="NeedsRestoringAcceptEncoding"> <add input="{RESPONSE_CONTENT_TYPE}" pattern=".+" /> </preCondition> </preConditions> </outboundRules> </rewrite> <defaultDocument enabled="true" /> </system.webServer> </configuration>
解决方案:
问题核心是SSO服务器返回的内部地址未被ARR反向代理替换为公网可访问的URL,需补充以下配置:
在
<outboundRules>节点下新增两条规则:- 匹配HTML内容中的SSO内部地址并替换:
<rule name="RewriteSSOInternalUrl" preCondition="ResponseIsHtml1"> <match filterByTags="A, Form, Img, Base, Link, Script" pattern="^http(s)?://em004tcss066\.xxxx\.xxxx\.xxx:8443/(.*)" /> <action type="Rewrite" value="https{R:1}://xxxxxteamcentertraining.xxx.xxxxxxxxx.xxx/{R:2}" /> </rule> - 匹配跳转响应头中的SSO内部地址并替换:
<rule name="RewriteSSOLocationHeader" preCondition="IsRedirect"> <match serverVariable="RESPONSE_Location" pattern="^http(s)?://em004tcss066\.xxxx\.xxxx\.xxx:8443/(.*)" /> <action type="Rewrite" value="https{R:1}://xxxxxteamcentertraining.xxx.xxxxxxxxx.xxx/{R:2}" /> </rule>
- 匹配HTML内容中的SSO内部地址并替换:
在
<preConditions>节点下新增跳转响应的预条件:<preCondition name="IsRedirect"> <add input="{RESPONSE_STATUS}" pattern="^3\d\d$" /> </preCondition>确保ARR已启用出站重写功能,且允许修改响应内容与响应头。
开启
logRewrittenUrl="true"记录重写日志,验证规则是否生效。
内容的提问来源于stack exchange,提问作者JT-66
相关产品推荐
相关产品推荐

