【问题标题】:TFS 2015 REST API AuthenticationTFS 2015 REST API 身份验证
【发布时间】:2017-09-29 00:25:45
【问题描述】:

我们正在尝试使用 Javascript 从网页调用 TFS 2015 REST API,但在与 TFS 服务器建立有效身份验证时遇到了挑战。

我们不知道如何生成个人访问令牌或 OAuth 访问令牌。下面的说明似乎更适用于 VSO,而不是本地 TFS。 https://www.visualstudio.com/en-us/integrate/get-started/rest/basics

如何生成身份验证密钥/令牌?

更新:截至 2017 年 3 月,最新版本的 On-Prem TFS 支持为所有用户创建个人访问令牌。使用@Elmar 提供的以下 javascript 代码,您可以从 REST API 发出更新、编辑 TFS 工作项的请求。

【问题讨论】:

    标签: javascript rest tfs tfs-2015


    【解决方案1】:

    在撰写本文时,OAuth 机制用于 VSO api,正如您似乎已经确定的那样。 official docs for VSO OAuth tokens here

    但是,对于本地部署,需要以下内容:

    通过 javascript 客户端(注意我在这里使用 jquery 来处理 ajax 请求)

    由于在本地无法使用替代凭据或基于令牌的身份验证来匹配当前的 vso 实施;您可以考虑以下方法:如果您对 TFS 应用层具有管理员权限,则可以在 IIS 中为 tfs 应用程序配置基本身份验证,并设置默认域

    然后调用如下:

    var self = this;
            self.tasksURI = 'https://<SERVER>/tfs/<COLLECTION>/<PROJECT>/_apis/build/builds?api-version=2.0';
            self.username = "<USERNAME>"; //basic username so no domain here.
            self.password = "<PASSWORD>";
    
            self.ajax = function (uri, method, data) {
                var request = {
                    url: uri,
                    type: method,
                    contentType: "application/json",
                    accepts: "application/json",
                    cache: false,
                    dataType: 'json',
                    data: JSON.stringify(data),
                    beforeSend: function (xhr) {
                        xhr.setRequestHeader("Authorization", "Basic " + btoa(self.username + ":" + self.password));
                    },
                    error: function (jqXHR) {
                        console.log("ajax error " + jqXHR.status);
                    }
                };
                return $.ajax(request);
            }
    
            self.ajax(self.tasksURI, 'GET').done(function (data) {
    
                alert(data);
    
            });
    

    重要提示! :如果您启用基本身份验证,您确实应该将您的网站也配置为使用 https,否则您的凭据将以明文形式发送(如上图右上方的警告所示)。


    通过 .NET 客户端

    在本地(当前为 rtm'd:2015 更新 1)中,api 通常被 NTLM 封闭/隔离,这意味着发出飞行前请求,从服务器返回 401 以挑战身份验证,在这种情况下,如下设置请求 Credential 允许请求在收到预检质询后针对服务器进行身份验证。 为了应对挑战,您可以这样做:

    request.Credentials = new NetworkCredential(this.UserName, this.Password);
    //you may want to specify a domain too
    

    如果您已为 tfs on prem 启用基本身份验证,则可以尝试如下进行身份验证,此模式与在 ui 中启用替代凭据后调用 vso 时使用的机制相匹配:

    request.Headers[HttpRequestHeader.Authorization] = "Basic " + Convert.ToBase64String(Encoding.UTF8.GetBytes(this.UserName + ":" + this.Password));
    

    注意:在我几周前修改的一些代码中;需要同时支持 VSO 和本地部署,因此我使用上述两种模式来处理特定场景。

    【讨论】:

    • 感谢@Elmar 在这里分享您的答案。我正在编写更多的 java 脚本,所以我试图找出如何在此处提到的请求标头“授权”中创建个人访问令牌来代替 myPatToken? headers: { 'Authorization': 'Basic ' + btoa("" + ":" + myPatToken) }
    • @vikkee 请查看修改后的答案。我提供了基本的身份验证信息和一个 javascript sn-p。就令牌而言,我本人希望在 prem 上使用它。
    • 非常感谢您提供详细的 javascript 语法,我对我所在的 TFS 管理员没有权限或影响力,所以我需要先找到解决方法。是否有可能找出管理员已经启用的所有类型的身份验证?
    • @vikkee 实际上,您需要管理员为您确认。您可以要求管理员在应用程序层上运行以下命令,然后为您提供命令的输出:%systemroot%\system32\inetsrv\appcmd.exe list config "Team Foundation Server/tfs" -section:windowsAuthentication。您还可以将basicAuthentication 提供给-section 参数并获取其输出。但是,这不会确切地告诉您基本身份验证是如何配置的。我的回答中的过程仍然是启用它的方法。
    • @vikkee 顺便说一句,如果您打算尝试 NTLM 路线,请也查看这个 SO 问题:link
    【解决方案2】:

    我的问题很老,但截至 2017 年 3 月,最新版本的 On-Prem TFS 支持为所有用户创建个人访问令牌。使用 @Elmar 的 javascript 代码,您可以从 REST API 发出更新、编辑 TFS 工作项的请求。

    【讨论】:

    • 太棒了!感谢@vikkee 的反馈
    • 执行者 PAT 与该 javascript 代码有什么关系?它使用用户名/密码,而不是 PAT。
    • @pabrams 感谢您的意见,感谢您的纠正。它没有使用任何 PAT,只是再次检查。我将进行编辑。
    • @vikkee 哦,好的,谢谢,不确定我是不是真的对某事感到困惑
    【解决方案3】:

    如果可能的话,我建议使用 Visual Studio Team Services(和 TFS)的 .NET 客户端库:

    https://www.visualstudio.com/en-us/docs/integrate/get-started/client-libraries/dotnet

    您可以使用 Windows 身份验证(这是我需要的)。在我的代码中包含以下 nuget 包后:

    Microsoft.TeamFoundationServer.Client
    Microsoft.VisualStudio.Services.Client
    Microsoft.VisualStudio.Services.InteractiveClient
    

    我能写出这段代码:

    // Create instance of VssConnection using Windows credentials (NTLM)
    var connection = new VssConnection(new Uri("http://mytfsserver:8080/tfs/CollectionName"), new VssClientCredentials());
    
    // Create instance of WorkItemTrackingHttpClient using VssConnection
    var gitClient = connection.GetClient<GitHttpClient>();
    var items = gitClient.GetRepositoriesAsync().Result;
    
    foreach (var item in items)
    {
        Console.WriteLine(item.Name);
    }
    

    另见:https://www.visualstudio.com/en-us/docs/integrate/get-started/client-libraries/samples

    【讨论】:

      猜你喜欢
      • 2017-12-15
      • 2019-03-31
      • 2018-07-26
      • 2019-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-07
      • 2016-03-24
      相关资源
      最近更新 更多