首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Eclipse EGit TFS Git连接-身份验证不支持

Eclipse EGit TFS Git连接-身份验证不支持
EN

Stack Overflow用户
提问于 2021-05-11 18:55:13
回答 2查看 1.3K关注 0票数 0

Hi,

当使用eclipse中的egit时,我们面临着“不支持的身份验证”这个可怕的问题。我读过许多文章和问题,但似乎没有一个能解决手头的问题。

我们正在使用2015,它可以提供一个git存储库作为版本控制系统。但是使用eclipse的egit插件,身份验证机制似乎不起作用。我们检查了使用eclipse 2020-06、2020-12、2021-03的不同eclipse版本,使用了不同的jdk设置1.8、11和15,但没有成功。

对于git命令行(git bash - windows),即使是遗留的eclipse,克隆、推送/提取也能很好地工作,而不是最新的。这个问题似乎与NTLM身份验证有关。在较新版本的eclipse中,即使服务器使用WWW-身份验证: NTLM响应,egit也不会协商或发送NTLM令牌。

下面是更新版本和旧版本的详细信息,通过TCP/IP监视器实现流量捕获。TFS git存储库克隆协议是http,即使门户位于https上。

Eclipse 2021-03

请求:

代码语言:javascript
复制
GET /tfs/xxx/_git/xxx/info/refs?service=git-upload-pack HTTP/1.1
Accept-Encoding: gzip
Pragma: no-cache
User-Agent: JGit/5.11.0.202103091610-r
Accept: application/x-git-upload-pack-advertisement, */*
Git-Protocol: version=2
Host: tfs-xxx-xx:8090
Connection: Keep-Alive

响应:

代码语言:javascript
复制
HTTP/1.1 401 Unauthorized
Cache-Control: private
Content-Type: text/html
Server: Microsoft-IIS/8.5
X-TFS-ProcessId: 76ec3355-4bc2-498d-ba64-xxxxxxx
X-FRAME-OPTIONS: SAMEORIGIN
Access-Control-Allow-Origin: *
Access-Control-Max-Age: 3600
Access-Control-Allow-Methods: OPTIONS,GET,POST,PATCH,PUT,DELETE
Access-Control-Expose-Headers: ActivityId,X-TFS-Session
Access-Control-Allow-Headers: authorization
Set-Cookie: Tfs-SessionId=3b370bd6-2197-xxxxxxxxx; path=/
Set-Cookie: Tfs-SessionActive=2021-05-11T17:25:24; path=/
WWW-Authenticate: NTLM
X-Powered-By: ASP.NET
P3P: CP="CAO xxxxxxxxxxxxxxxxx"
X-Content-Type-Options: nosniff
Date: Tue, 11 May 2021 17:25:24 GMT
Content-Length: 1293

Eclipse开普勒

第一次请求/答复与上述类似。

第二次请求:

代码语言:javascript
复制
GET /tfs/xxx/_git/xxx/info/refs?service=git-upload-pack HTTP/1.1
Accept-Encoding: gzip
Pragma: no-cache
User-Agent: JGit/3.2.0.201312181205-r
Accept: application/x-git-upload-pack-advertisement, */*
Cache-Control: no-cache
Host: tfs-pmo-app:8090
Connection: keep-alive
Authorization: NTLM TlRMTVxxxxxxx - Length 72 chars

第二反应:

代码语言:javascript
复制
HTTP/1.1 401 Unauthorized
Content-Type: text/html; charset=us-ascii
WWW-Authenticate: NTLM TlRMxxxxxx== - Length 354 chars
Server: Microsoft-HTTPAPI/2.0
Date: Tue, 11 May 2021 17:33:00 GMT
Content-Length: 341

第三次请求:

代码语言:javascript
复制
GET /tfs/xxx/_git/xxx/info/refs?service=git-upload-pack HTTP/1.1
Accept-Encoding: gzip
Pragma: no-cache
User-Agent: JGit/3.2.0.201312181205-r
Accept: application/x-git-upload-pack-advertisement, */*
Cache-Control: no-cache
Host: tfs-pmo-app:8090
Connection: keep-alive
Authorization: NTLM TlRMTVNxxxxx - Length 256 chars

第三次答复:

代码语言:javascript
复制
HTTP/1.1 200 OK
Cache-Control: private
Content-Type: application/x-git-upload-pack-advertisement
Server: Microsoft-IIS/8.5
X-TFS-ProcessId: 76ec3355-4bc2-xxxxxxxxxxxxxx
X-FRAME-OPTIONS: SAMEORIGIN
Access-Control-Allow-Origin: *
Access-Control-Max-Age: 3600
Access-Control-Allow-Methods: OPTIONS,GET,POST,PATCH,PUT,DELETE
Access-Control-Expose-Headers: ActivityId,X-TFS-Session
Access-Control-Allow-Headers: authorization
Set-Cookie: Tfs-SessionId=xxxxxxxxxxxx; path=/
Set-Cookie: Tfs-SessionActive=2021-05-11T17:33:01; path=/
X-VSS-UserData: 69b58752-xxxxxxxxxxxxx
X-AspNet-Version: 4.0.30319
Persistent-Auth: true
X-Powered-By: ASP.NET
P3P: CP="CAO xxxxxxxxxxxxxxxxxxxxxxxxx"
X-Content-Type-Options: nosniff
Date: Tue, 11 May 2021 17:33:00 GMT
Content-Length: 1098

到目前为止,我们尝试的是将连接超时增加到300,在Eclipse首选项中更改Git的http客户端,在克隆回购时添加用户名/密码--这不会产生任何明显的影响,用jdk更改eclipse的不同变体,将git凭据助手更改为wincred,manager,存储,甚至在没有凭据助手的情况下存储,尝试配置cntlm,但是在测试期间,它说您不需要代理,这一切似乎都不起作用。

这可能意味着egit/jgit实现中存在一个bug。从错误中查看当前实现源和跟踪堆栈:

代码语言:javascript
复制
!ENTRY org.eclipse.egit.core 4 0 2021-05-08 04:56:02.018
!MESSAGE Pulling 1 repository
!SUBENTRY 1 org.eclipse.egit.core 4 0 2021-05-08 04:56:02.021
!MESSAGE http://xxxxx:8090/tfs/xxxx/_git/xxx: authentication not supported
!STACK 0
org.eclipse.jgit.api.errors.TransportException: http://xxxxx:8090/tfs/xxxx/_git/xxx: authentication not supported
    at org.eclipse.jgit.api.FetchCommand.call(FetchCommand.java:224)
    at org.eclipse.jgit.api.PullCommand.call(PullCommand.java:263)
    at org.eclipse.egit.core.op.PullOperation$PullJob.run(PullOperation.java:255)
    at org.eclipse.core.internal.jobs.Worker.run(Worker.java:63)
Caused by: org.eclipse.jgit.errors.TransportException: http://xxxxx:8090/tfs/xxxx/_git/xxx: authentication not supported
    at org.eclipse.jgit.transport.TransportHttp.connect(TransportHttp.java:674)
    at org.eclipse.jgit.transport.TransportHttp.openFetch(TransportHttp.java:465)
    at org.eclipse.jgit.transport.FetchProcess.executeImp(FetchProcess.java:142)
    at org.eclipse.jgit.transport.FetchProcess.execute(FetchProcess.java:94)
    at org.eclipse.jgit.transport.Transport.fetch(Transport.java:1309)
    at org.eclipse.jgit.api.FetchCommand.call(FetchCommand.java:213)
    ... 3 more

https://git.eclipse.org/r/plugins/gitiles/jgit/jgit/+/refs/tags/v5.11.0.202103091610-r/org.eclipse.jgit/src/org/eclipse/jgit/transport/TransportHttp.java

代码语言:javascript
复制
org.eclipse.jgit.transport.TransportHttp.connect(TransportHttp.java:674):

Line 671:   case HttpConnection.HTTP_UNAUTHORIZED:
Line 672:                       authMethod = HttpAuthMethod.scanResponse(conn, ignoreTypes);
Line 673:                       if (authMethod.getType() == HttpAuthMethod.Type.NONE)
Line 674:                           throw new TransportException(uri, MessageFormat.format(
Line 675:                                   JGitText.get().authenticationNotSupported, uri));

看起来scanResponse方法正在为导致问题的auth方法类型返回none,所以让我们回顾一下HttpAuthMethod:

https://git.eclipse.org/r/plugins/gitiles/jgit/jgit/+/refs/tags/v5.11.0.202103091610-r/org.eclipse.jgit/src/org/eclipse/jgit/transport/HttpAuthMethod.java

这里的代码基本上检查了3种身份验证方法,基本方法、摘要方法和协商方法,在我们的例子中,标题"WWW-Authenticate: NTLM“并不是任何支持的方法,因此出现了例外。

但令人困惑的是开普勒如何成功地为NTLM进行身份验证,答案可能是(通过网络搜索),实际上jdk可能要对此负责,因为HttpURLConnection类下的jdk本质上是在发送NTLM令牌,而更新的jdk可能并不是这样(不知道为什么)。

结论:,我似乎没有找到正确的答案,问题在哪里?

  1. 这是因为新jdks本身并不支持NTML (在幕后)吗?
  2. egit/jgit不应该回到其他机制,比如基本身份验证吗?
  3. 为什么我不能先发制人地使用egit/jgit来绕过NTLM呢?

在编写这篇文章时,P.S.似乎没有为基本的身份验证支持配置我们的服务器,但我使用git命令尝试了不同的身份验证类型,它们确实起作用了。我将再次检查wireshark捕获并查看底层机制。

,谢谢,如果你读了整个帖子:)。

EN

Stack Overflow用户

回答已采纳

发布于 2021-05-14 17:26:34

我终于解决了这个问题。

由于开普勒版本(JDK1.7)能够与tfs通信,所以我查看了在1.7之后jdk中是否有什么变化,幸运的是:

HttpURLConnection中的NTLM身份验证不工作于JRE,而在JDK环境中工作。

如何在调用任何url时提供ntlm身份验证?

从jdk1.8.0_181开始,默认情况下将禁用基于http的ntlm透明身份验证,因此,只需将其设置为allHosts就可以解决此问题。

您只需在jre/lib/net.properties文件中注释这一行Java 8,或< Java _HOME>/conf/net.properties for Java 11/15:

代码语言:javascript
复制
#jdk.http.ntlm.transparentAuth=disabled

并取消这个评论:

代码语言:javascript
复制
jdk.http.ntlm.transparentAuth=allHosts

此外,还可以使用"-Djdk.http.ntlm.transparentAuth=allHosts“作为jvm参数设置相同的参数。

另外,由于这适用于HttpUrlConnection jdk本地客户端,所以我们还需要更改git客户端配置,以使用“Java内置HTTP”而不是"Apache“。

票数 0
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67492788

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档