Office 始终以匿名用户身份请求文件

问题描述

我正在实现一个 webdav 服务器。我的匿名访问一切正常,但现在我想要求身份验证。

用户单击链接打开 Word 文档(我使用的是 ms-word: 协议)时,Word 会发送几个 HTTTP OPTIONS 请求,首先在Bearer 标头,服务器使用 Authorization 标头响应该标头,并且一切正常(在用户使用 Word 进行身份验证后,Word 会在标头中发送带有令牌值的后续 HTTP OPTIONS 请求).

但是,当 Word 请求文件本身(使用 HTTP GET)时,没有 WWW-Authenticate 标头。我曾尝试让服务器以 Authorization 状态响应,但是当它响应时,Word 只是放弃并通知用户无法打开文件

更令人不安的是,据我所知,Word 并行发送 GET 和 OPTIONS 请求,因此在发送 GET 请求时,它不知道它将使用 OPTIONS 请求进行身份验证。

解决方法

不确定这是否总是我上面描述的问题的答案,但我认为这是我遇到的问题的组合。以下是我如何解决遇到的问题的基础知识。

  1. 删除 Office Webdav 缓存。 Office 非常积极地缓存有关 Webdav 服务器的信息。缓存位于注册表中的以下位置:Computer\HKEY_CURRENT_USER\SOFTWARE\Microsoft\Office\X\Common\Internet\Server Cache 其中 X 是您安装的 Office 的当前版本。删除所有包含您的服务器 URL 的子项。
  2. 请勿将 localhost127.0.0.1 用于您的 Webdav。如果 Office 知道您的服务器是本地服务器,它的行为似乎有所不同。这可能意味着需要将条目添加到您的 hosts 文件中,以“欺骗”它认为您的站点位于远程服务器上。
  3. 如果使用某种联合身份验证(Azure AD、Google、Facebook 等)并且您使用的是不记名令牌,则需要告诉 Office 去哪里进行身份验证,这是通过响应未经身份验证的请求来完成的401 状态和 WWW-Authenticate 标头值设置为类似这样的值(我可以确认这适用于 Azure AD):
Bearer authorization_uri="https://login.microsoftonline.com/[Tenant ID]/oauth2/authorize",trusted_issuers="https://login.microsoftonline.com/*/",client_id="[Azure AD App Client ID]"
  1. 即使设置了客户端 ID,应用注册中的 Application ID URI 似乎也需要匹配服务器的基本 URL(协议 + 主机 + 端口)