通过HTTP在SVN 1.5.2上的凭据缓存失败
我们最近在一些服务器/虚拟机上安装了SVN 1.5.2(使用VisualSVN / Apache),现在当我发送带有用户名/密码的命令行命令时,它们不再被缓存。
以前,我们在svn://上运行了随CollabNet安装的SVN 1.5.0,并且凭据在第一个命令之后被缓存。
到目前为止,我在解决此问题时遇到了困难。我的情况是:
- SERVER_SVN(通过svn://的SVN 1.5.2)
- SERVER_HTTP(通过http://的SVN 1.5.2)
从命令行到SERVER_SVN的命令:凭据缓存良好
与SERVER_HTTP相同的命令:不缓存凭据
因此,这似乎是一个http / apache服务器问题...但是,来自Tortoise的凭据被缓存到两个服务器上,因此,这也似乎是一个客户端调用问题。我的想法不多了...
我使用的示例命令序列:
svn ls c:\mylocalfolderSVN --username foo --password bar svn ls c:\mylocalfolderSVN // this works svn ls c:\mylocalfolderHTTP --username foo --password bar svn ls c:\mylocalfolderHTTP // this fails
最后一条命令停止并要求进行身份验证。
svn://和http://之间的凭据缓存是否不同,还是服务器配置中缺少内容?
预先感谢任何建议。
解决方案
AFAIK凭证缓存是客户的责任。服务器要做的就是在必要时要求提供这些凭据。我会检查本地客户端配置文件,也许会看到不同版本的客户端会发生什么。
我们是否完全限定了SVN服务器的域名?如果HTTP的缓存基于cookie,并且服务器正在使用FQDN编写cookie,但是请求未使用FQDN(我们使用的是svnserver,而FQDN是svnserver.company),则该cookie可能无效,并且每个cookie均无效。请求将需要认证。
正如wds所指出的那样,SVN凭据缓存是通过svn.exe在客户端完成的,在收到服务器的响应后,例如"确定,我实际上使用了我们发送的凭据,它们就可以了"。
这就是为什么我不知道发生了什么的原因:我从头开始安装了2台服务器,向两者发送相同的命令行,一组凭据被缓存,另一组则不被缓存,而是使用相同的TortoiseSVN下方的svn.exe会同时缓存两者(也许作弊,缓存凭据,然后svn.exe无法这样做)。
我现在最好的猜测是,http://服务器不会向svn.exe发送"适当的"响应,但是我真的不希望嗅探所有的http请求以查看发生了什么,请称我为懒惰,但是我有很多有趣的事情要做:-)
因此,我更改了设计,现在将SVN密码保留在内存中(WinForm客户端应用程序,全部在内部网络中使用),并与每个命令一起传递。
为了缓存凭据,除了进行适当的配置外,我们还需要像下面这样执行SVN:
svn ls REPOSITORY_URL
代替
svn ls WORKING_COPY_PATH
这是对我有用的方法,不确定在这种情况下这是否是解决方案。