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

问题描述 投票:0回答:6

我正在尝试以编程方式克隆 git 存储库。我的 ASP.NET MVC 应用程序正在创建并启动一个进程。处理进程的代码工作正常,但是当尝试使用本地 TFS PAT 克隆 git 存储库时,身份验证失败。我无法使用 NTLM 或要求用户输入凭据。我可以确认我的 C# 代码处理创建进程以编程方式使用 git bash shell 可以正常工作,因为我在本地计算机上没有问题,但在 IIS 上的生产中出现了问题。我尝试过以下两种方法。

方法1:git克隆http://anyusername:PAT@tfs2017:8080/tfs/DefaultCollection/_git/Git%20Repository

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

方法 2:按照 MS 社交论坛上的一个人的建议。

git -c http.extraheader="AUTHORIZATION:bearer {base64encodedPAT}"克隆{url}

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

git tfs iis-7.5
6个回答
23
投票

如果您有 PAT,则不需要密码:PAT 将充当您的用户名。
看看以下是否有效:

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

11
投票

读完MS的文章后我有点困惑。在尝试了一些方法之后,我终于能够使用我的 PAT 来对抗 TFS 和 VSTS GIT Repos。

我能够使用 PAT 克隆 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解码:

MyGitSync用户:

6lqj5rdpq3upqeefwj7l7nesy54wwx14qhl5ejyy55doh43wxc4a

代币由

<fictional user name>:<PAT from a user with rights in the project>

构成

在此示例中:

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

6lqj5rdpq3upqeefwj7l7nesy54wwx14qhl5ejyy55doh43wxc4a

PAT范围:

Code (Read)

TFS/VSTS 目前不接受“

AUTHORIZATION: Bearer
”标头:(

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

注意:基本身份验证需要 HTTPS!


7
投票

只是添加我的 2c,因为我花了几个小时在这上面。

我从 DevOps 生成了 PAT 并复制了克隆 URL,但我一直收到“未找到存储库”的消息

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

注意项目中有一个空格,并且是 URLEncoded

这在 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,它就应该可以工作。


2
投票

感谢 Clemens 上面的出色回答,但我想用我在 TFS 服务器上的经验更新他的回答。

TFS 服务器(本地,而不是 Azure DevOps)仅在用户名字段为空时才会获取令牌,这意味着(非 Base64 编码)基本授权的格式为“:TFS_TOKEN”。

我尝试将 GIT_ASKPASS 与返回空用户名和令牌的脚本一起使用,但它不起作用。当我开始使用wireshark查看时,我发现我的git CLI选择使用NTLM而不是基本身份验证。可能有一种方法可以告诉 git 使用 Basic 而不是 NTLM,但我找不到它。

这个问题(以及克莱门斯的回答)让我采取了这种方法:

$ TFS_TOKEN="...."
$ TFS_AUTH=$(echo -n ":${TFS_TOKEN}" | base64)
$ git clone -c http.extraheader="Authorization: Basic ${TFS_AUTH}" https://...

0
投票

对于 github,请使用以下格式(必须使用 https://)

git 克隆 https://[PAT]@github.com/[你的仓库链接].git

© www.soinside.com 2019 - 2024. All rights reserved.