具有 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 Auth NTLM 进行身份验证

在 Windows 上配置 Git 以使用 NTLM 代理身份验证

使用集成 Windows 身份验证或 NTLM 登录 Jira

使用NTLM的windows身份验证的nginx反向代理

Safari 访问受 Windows 集成身份验证 (aka NTLM) 保护的网站时出现问题

NTLM 身份验证 - 在 PHP 中获取 Windows 登录名、域和主机