You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,需补充以下配置:

  1. 在<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>
      
  2. 在<preConditions>节点下新增跳转响应的预条件:

    <preCondition name="IsRedirect">
        <add input="{RESPONSE_STATUS}" pattern="^3\d\d$" />
    </preCondition>
    
  3. 确保ARR已启用出站重写功能,且允许修改响应内容与响应头。

  4. 开启logRewrittenUrl="true"记录重写日志,验证规则是否生效。

内容的提问来源于stack exchange,提问作者JT-66

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 06:25:17