具有 Windows 身份验证 NTLM 的 IIS 10 上的 AEM Dispatcher - 启用 Dispatcher 缓存时的身份验证问题
Posted
技术标签:
【中文标题】具有 Windows 身份验证 NTLM 的 IIS 10 上的 AEM Dispatcher - 启用 Dispatcher 缓存时的身份验证问题【英文标题】:AEM Dispatcher on IIS 10 with Windows Authentication NTLM - authentication problem when Dispatcher cache enabled 【发布时间】:2021-08-03 19:24:58 【问题描述】:我在 IIS 10 上的 Windows Server 2019 上运行 AEM Dispatcher 时遇到了奇怪的问题,并打开了 Windows 身份验证。
当 AEM Dispatcher 配置为缓存静态文件时,可以从 Windows 使用 Chrome、IE、Edge 访问该网站。它不适用于 Firefox。 Windows 身份验证不断询问凭据并仅加载 start.html 而没有静态文件。 IIS 为存储在服务器磁盘上的静态文件提供响应代码 401.2。此外,它不适用于 Linux / Mac OS 的任何网络浏览器。
当调度程序配置为不缓存文件时,可以使用所有提到的浏览器从 Windows 和 Linux / MacOS 访问网站。使用 Windows 身份验证通过 NTLM 进行身份验证。
技术细节:
IIS 上的网站配置:<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<rewrite>
<rules>
<clear />
</rules>
</rewrite>
<serverRuntime authenticatedUserOverride="UseWorkerProcessUser" />
<security>
<authentication>
<windowsAuthentication enabled="true" useKernelMode="true" useAppPoolCredentials="false">
<extendedProtection tokenChecking="Require" />
<providers>
<clear />
<add value="Negotiate" />
<add value="NTLM" />
</providers>
</windowsAuthentication>
</authentication>
</security>
<caching enabled="true" enableKernelCache="true" />
</system.webServer>
</configuration>
调度程序版本:dispatcher-iis-windows-x64-ssl1.1-4.3.3
根据 AEM 文档配置 NTFS 权限:应用程序池标识对应用程序主目录具有修改权限,对 Dispatcher 处理程序 (disp_iis.dll) 所在的文件夹具有读取和执行权限,DOC
我测试访问网站的客户端不是域的成员,我使用域\用户形式的域用户凭据(NTLM 后台)
Firefox 文档中提供的 Firefox about:config 的任何更改都无济于事。此外,如果在 Dispatcher 中禁用缓存,它可以正常工作,因此浏览器配置可能不是问题
当在 Windows 身份验证中只有 NTLM 提供程序(没有协商)并且启用了调度程序缓存时,Windows 身份验证会不断询问凭据并提供 401.1
通过 NTLMv2 通信,但我也尝试过使用 NTLMv1,但没关系
我已尝试禁用 useKernelMode 和扩展保护 - 没有任何区别
在 AEM 日志中,尝试访问网站时仅记录了 start.htlm 请求,看起来另一个请求未通过 Windows 身份验证
你们有没有人遇到过类似的问题或知道如何解决它? 提前谢谢你。
更新:
其他测试表明请求已成功通过 WindowsAuthenticationModule 身份验证,然后由 Dispatcher ISAPI Extension 处理。 当在请求标头中有“授权:协商”时,它工作正常(它仍然在幕后使用 NTLM)。它只验证一次。 当有 Authorization: NTLM 它成功验证一次,然后调度程序 ISAPI Extension 处理请求,将处理程序更改为 NewHandlerName="StaticFile 和 WindowsAuthenticationModule 启动并尝试验证两次并抛出错误:
ModuleName="WindowsAuthenticationModule", Notification="AUTHENTICATE_REQUEST", HttpStatus="401", HttpReason="Unauthorized", HttpSubStatus="1", ErrorCode="No credentials are available in the security package (0x8009030e)", ConfigExceptionInfo=""
【问题讨论】:
【参考方案1】:我终于找到了解决问题的方法。 当 http.sys 处理身份验证时,Dispatcher 在身份验证方面遇到问题。当在 NTLM Auth 消息客户端发送“授权:NTLM ...”时,用户未正确验证。有趣的是,当客户端发送“Authorization: Negotiate ...”并且在后台它也是 NTLM 身份验证工作。
为了解决这个问题,我在 IIS 管理器 -> 身份验证 -> Windows 身份验证 -> 高级设置中禁用了选项“useKernelMode”。 它将身份验证从内核 (http.sys) 切换到 IIS。
非常重要的是您需要重新启动整个 IIS,而不仅仅是应用程序池。如果不重新启动 IIS,更改将不会生效。
此外,要使其在 MacOS opcja 上的 Safari 中运行,需要在 IIS 管理器 -> 身份验证 -> Windows 身份验证 -> 高级设置中将“扩展保护”设置为允许或关闭。
最后 web.config 是:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<serverRuntime authenticatedUserOverride="UseWorkerProcessUser" />
<security>
<authentication>
<windowsAuthentication enabled="true" useKernelMode="false" useAppPoolCredentials="true">
<extendedProtection tokenChecking="Allow" />
<providers>
<clear />
<add value="Negotiate" />
<add value="NTLM" />
</providers>
</windowsAuthentication>
</authentication>
</security>
<caching enabled="true" enableKernelCache="true" />
</system.webServer>
</configuration>
也许它会对其他人有所帮助:)
【讨论】:
以上是关于具有 Windows 身份验证 NTLM 的 IIS 10 上的 AEM Dispatcher - 启用 Dispatcher 缓存时的身份验证问题的主要内容,如果未能解决你的问题,请参考以下文章
在 Windows 上配置 Git 以使用 NTLM 代理身份验证
使用集成 Windows 身份验证或 NTLM 登录 Jira