繁体   English   中英

TFS 2015 REST API身份验证

[英]TFS 2015 REST API Authentication

我们正在尝试使用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工作项。

在您编写此文件时,OAuth机制用于对抗VSO api,因为您似乎已经确定了这一点。 这里有VSO OAuth令牌的官方文档

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

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

由于在本地不能使用替代的信用证或基于令牌的auth来匹配当前的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从服务器返回以挑战auth,在这种情况下,设置请求凭据如下允许请求在收到预检挑战后对服务器进行身份验证。 为了迎接挑战,您可以这样做:

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

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

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

注意:在几周前我修改过的一些代码中; 需要支持VSO和on-prem,所以我使用上面的两种模式来处理特定的场景。

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

如果可能,我建议使用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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM