我们正在用 Java 开发 WebDAV 服务器,希望为 Windows 的文件资源管理器客户端提供服务。我可以运行以下curl
命令,它会给出良好的响应:
>curl -i -X OPTIONS http://localhost:8080/storage-explorer/rest/dav -u joe:JoeSchmo1!
如果我尝试使用文件资源管理器“映射网络驱动器”,同时指定与命令中相同的用户和密码curl
,我会收到“未授权”的响应。
我们正在用 Java 开发一个 WebDAV 服务器,希望它能为 Windows 的文件资源管理器客户端提供服务。我可以运行以下 curl 命令,它会给出良好的响应:
curl -i -X OPTIONS http://localhost:8080/storage-explorer/rest/dav -u joe:JoeSchmo1! 如果我尝试使用文件资源管理器“映射网络驱动器”,同时指定与 curl 命令中相同的用户和密码,我会收到“未授权”的响应。
我使用 WireShark 检查了请求和响应。对于curl
,我看到:
OPTIONS /storage-explorer/rest/dav HTTP/1.1
Host: localhost:8080
Authorization: Basic am9lOkpvZVNjaG1vMSE=
User-Agent: curl/8.4.0
Accept: */*
HTTP/1.1 200 OK
Expires: 0
Cache-Control: no-cache, no-store, must-revalidate
Server: milton.io-3.0.0.1
Pragma: no-cache
DAV: 1, 2
Accept-Ranges: bytes
Date: Wed, 27 Mar 2024 17:46:05 GMT
Allow: HEAD, PROPFIND, REPORT, OPTIONS, HEAD, PROPPATCH
Connection: keep-alive
Content-Length: 0
MS-Author-Via: DAV
对于文件资源管理器,我看到:
OPTIONS /storage-explorer/rest/dav HTTP/1.1
Connection: Keep-Alive
User-Agent: Microsoft-WebDAV-MiniRedir/10.0.19045
translate: f
Host: localhost:8080
HTTP/1.1 401 Unauthorized
Expires: 0
Connection: keep-alive
WWW-Authenticate: Basic realm="ApplicationRealm"
Cache-Control: no-cache, no-store, must-revalidate
Pragma: no-cache
Content-Type: text/html;charset=UTF-8
Content-Length: 71
Date: Wed, 27 Mar 2024 18:06:34 GMT
<html><head><title>Error</title></head><body>Unauthorized</body></html>
另一个奇怪的事情是,我可以在我们的 web 应用程序日志中看到请求的活动curl
,但看不到文件资源管理器请求的活动。
两个 OPTIONS 请求之间有什么重要区别导致不同的响应?我可以从文件资源管理器中执行哪些操作以使其生成可接受的请求,例如,相当于 的请求curl
?
基于此文章,我曾经regedit
修改HKLM\SYSTEM\CurrentControlSet\Services\WebClient\Parameters\BasicAuthLevel
设置以允许http,但没有什么区别。
我愿意接受任何调试建议。
答案1
重要的区别在于这部分:
Authorization: Basic am9lOkpvZVNjaG1vMSE=
“Basic”后面的字符串是您的用户名和密码的 base64 编码。您的 WebDAV 服务器显然不允许匿名访问此资源。
我不知道您的页面和服务器代码是如何编程的,但显然输入的用户名/密码并没有像生成的请求那样传递到服务器。
通过标头传递用户/密码的另一种方法Authorization
是通过附加到 URL 的查询参数来实现,例如http://example.com?u=username,p=password
。另一个选项是:。http://username:[email protected]/
您的 WebDAV 服务器应该被编程来理解这些参数。