使用 TFS 个人访问令牌克隆 Git 存储库

21

我想通过程序克隆git存储库。我的ASP.NET MVC应用程序正在创建和启动进程。处理进程的代码运行正确,但是在使用TFS on premise PAT(个人访问令牌)克隆git存储库时身份验证失败。我无法使用NTLM或要求用户输入凭据。我可以确认我处理创建进程以通过Git bash shell进行编程的C#代码有效,因为在我的本地机器上没有问题,但在生产环境中(IIS)出现问题。我已尝试以下两种方法。

方法1: git clone http://任何用户名:PAT@tfs2017:8080/tfs/DefaultCollection/_git/Git%20Repository

PAT是我为我的用户生成的令牌。我还尝试将其进行base64编码。

方法2: 如MS社交论坛上的某人建议。

git -c http.extraheader="AUTHORIZATION:bearer {base64编码的PAT}" clone {url}

原始MS论坛问题供参考: https://social.msdn.microsoft.com/Forums/vstudio/en-US/0107cf1f-7fe4-4429-af74-ca7d2be7405e/using-personal-access-tokens-in-tfs-2017?forum=tfsversioncontrol

6个回答

24
如果您拥有一个PAT,您就不需要密码:PAT将作为您的用户名。
请查看以下内容是否有效:

git clone http://PAT@tfs2017:8080/tfs/DefaultCollection/_git/Git%20Repository

这将使用PAT作为用户名提示git凭据管理器。现在为了测试的目的,如果我将PAT移动到密码字段并提供一个空白的用户名,我可以进行身份验证并克隆存储库。 - cloutcomputer
1
@Marcus,您的意思是 http://:PAT@tfs2017:8080/tfs/DefaultCollection/_git/Git%20Repository?其中 :PAT 表示没有用户名,而是使用 PAT 作为密码? - VonC
我尝试了您上面提供的建议,使用我的存储库URL,但是从命令行中得到了身份验证失败的错误。 - cloutcomputer
1
我相当确定没有人真正阅读我的问题。我明确说明这一切都是在代码中完成的,因此访问git凭据管理器实际上是不可能的。 - cloutcomputer
1
我在一个全新的环境中尝试了答案中的命令,它可以正常工作。 - Ajeeb.K.P
显示剩余3条评论

11

读完微软文章后,我有点困惑。经过尝试,我终于能够使用我的PAT来对TFS和VSTS GIT存储库进行操作。

唯一的方法是在GIT命令行中设置http.extraheader标签。授权标签必须指向基本身份验证,协议必须是HTTPS,并且密钥必须是BASE64编码,包括一个(虚构的)用户名。

示例:

git -c http.extraheader="AUTHORIZATION: Basic TXlHaXRTeW5jVXNlcjo2bHFqNXJkcHEzdXBxZWVmd2o3bDduZXN5NTR3d3gxNHFobDVlanl5NTVkb2g0M3d4YzRh" clone https://tfs.address/tfs/Collection/Project/_git/RepoName

使用基础令牌 BASE64 编码:

TXlHaXRTeW5jVXNlcjo2bHFqNXJkcHEzdXBxZWVmd2o3bDduZXN5NTR3d3gxNHFobDVlanl5NTVkb2g0M3d4YzRh

基础令牌 BASE64 解码:

MyGitSyncUser:6lqj5rdpq3upqeefwj7l7nesy54wwx14qhl5ejyy55doh43wxc4a

令牌由 <虚构用户名>:<具有项目权限的用户的 PAT> 构成。

在这个例子中:

虚构用户名: MyGitSyncUser 使用的 PAT: 6lqj5rdpq3upqeefwj7l7nesy54wwx14qhl5ejyy55doh43wxc4a

PAT 范围: Code (Read)

TFS/VSTS 目前不接受 "AUTHORIZATION: Bearer" 标头 :(

也许这将对在 TFS/VSTS 中使用 PAT 的人有所帮助。

注:BASIC 认证需要 HTTPS!


1
我尝试了这个,仍然提示我输入用户名和密码。 - Ben A
1
这对我很有效...你是我的英雄!只是补充一些细节:我的经验(使用TFS服务器,而不是Azure DevOps)表明,当提供令牌时,用户名必须为空。我的解决方案是:TFS_AUTH = $(echo -n“:$ {TFS_TOKEN}”| base64),然后将TFS_AUTH与上面的HTTP基本身份验证标头一起使用。 - Jeff W

7

我想补充一下我的看法,因为我在这个问题上花费了几个小时。

我从DevOps生成了PAT并复制了克隆URL,但是我一直收到“未找到存储库”的错误提示。

GIT clone https://<PAT>@dev.azure.com/Organization/My%20Project/_git/MyRepo

注意项目名称中含有空格并且需要进行URL编码。
在DOS系统中无法正常工作,它会被解析为:
My0Project

您需要进行双重转义,如下所示:

GIT clone https://<PAT>@dev.azure.com/Organization/My%%20Project/_git/MyRepo

4

您可以通过编程方式将令牌添加到计算机中,就像CredentialManager一样,以便使用CredentialManager。
在Windows上,我使用cmdkey工具如下:

cmdkey /generic:"git:https://yourdomain.visualstudio.com" /user:"Personal Access Token" /pass:"yourtokenhere"

在MacOS上添加一条钥匙串记录:
security add-generic-password -a "Personal Access Token" -D "Credential" -s "gcm4ml:git:https://yourdomain.visualstudio.com" -w "yourtokenhere" -A

注意:避免使用-A选项,它允许任何应用程序访问它。

只要在Git上安装了CredentialManager,它就会正常工作。


我不知道cmdkey。+1 - VonC

2
感谢Clemens上面的出色答案,但我想更新他对TFS服务器的回答,分享一下我的经验。
TFS服务器(本地部署,非Azure DevOps)仅在用户名字段为空时才会接受令牌,这意味着(非base64编码的)基本授权格式为“:TFS_TOKEN”。
我尝试使用带有脚本的GIT_ASKPASS,该脚本返回空用户名和令牌,但它无法工作。当我开始使用wireshark查找时,发现我的git CLI选择使用NTLM而不是基本授权。可能有一种方法告诉git使用Basic而不是NTLM,但我找不到它。
这个问题(以及Clemens的答案)引导我采用了这种方法:
$ TFS_TOKEN="...."
$ TFS_AUTH=$(echo -n ":${TFS_TOKEN}" | base64)
$ git clone -c http.extraheader="Authorization: Basic ${TFS_AUTH}" https://...

0
对于GitHub,请使用以下格式(https://是必需的):
git clone https://[PAT]@github.com/[your repo link].git

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接