我在将 IIS/ARR 反向代理到 WildFly 应用服务器时遇到了困难。在 Linux 上,我们使用 Web 服务器来卸载应用服务器的 HTTPS、身份验证和安全功能,因此最初的想法是对 IIS 执行相同的操作。
- 应用程序使用 WebSockets,这意味着 Jakarta ISAPI 重定向器没有帮助,我们改用 ARR。
- ARR 无法转发经过身份验证的用户信息,因此我们不得不停止在 IIS 上使用 Kerberos,现在 WildFly 通过 waffle 模块支持它。
- 我们知道 HeliconTech 的产品(例如 ISAPI Rewrite),但不想使用额外收费的软件。
看来 IIS 会阻止或中断客户端与应用程序服务器之间的协商。我放置在应用程序服务器中的测试 servlet 可以直接访问,但通过 IIS/ARR 访问时会弹出身份验证窗口。
<rule name="ReverseProxyInboundRuleAT" enabled="true" stopProcessing="true">
<match url="^(auth-test)(/.*|$)"/>
<action type="Rewrite" url="http://127.0.0.1:8080/{R:0}" logRewrittenUrl="true" />
<serverVariables>
<set name="HTTP_SEC_WEBSOCKET_EXTENSIONS" value="" />
<set name="HTTP_X-Forwarded-Proto" value="https" />
<set name="HTTP_X-Forwarded-Port" value="443" />
<set name="HTTP_X-Forwarded-HOST" value="site.example.com" />
</serverVariables>
</rule>
身份验证失败,出现华夫饼错误:
error logging in user: com.sun.jna.platform.win32.Win32Exception: The token supplied to the function is invalid
它发生在 Windows Server 2016/2019 和 IIS 10 上。是否可以将受 Kerberos 保护的 SSO 应用程序置于 IIS 后面?
更新:我已检查过,Apache HTTP Server 不会破坏协商协议代理对 WildFly 的请求,但 IIS 会。与 Apache 代理服务器相比,IIS 在协商对话过程中“吃掉”了两个数据包,例如初始提议和回复。
答案1
我发现如果刚安装了此功能,IIS 会“吃掉”身份验证数据包。因此,如果您想要协商直通,只需通过服务器管理器卸载它即可。无论如何,整个任务更加复杂,因为看起来协商中的 NTLMSSP 数据包可以通过 IIS/ARR 传递,但 Kerberos 可能不行。正如这里所述,它在 IIS 上中断,就像在额外的跳跃上一样。