Аутентификация API REST TFS 2015

Мы пытаемся вызывать API REST TFS 2015 с веб-страницы с использованием Javascript и пытаемся установить правильную аутентификацию с сервером TFS.

Мы не знаем, как создавать токены доступа или токены доступа OAuth. Приведенная ниже инструкция, похоже, применима в большей степени к VSO, чем к локальному TFS. https://www.visualstudio.com/en-us/integrate/get-started/rest/basics

Как я могу сгенерировать ключ/токен аутентификации?

ОБНОВЛЕНИЕ: по состоянию на март 2017 года последняя версия On-Prem TFS поддерживает создание токенов доступа для всех пользователей. Используя приведенный ниже код javascript от @Elmar, вы можете делать запросы на обновление, редактировать рабочие элементы TFS из REST API.

Ответ 1

Механизм OAuth используется против VSO api во время написания этого, как вы, казалось бы, идентифицировали. официальные документы для токенов VSO OAuth здесь.

Однако для on-prem требуется следующее:

Через javascript-клиент (обратите внимание, что я использую jquery для запроса ajax здесь)

Так как альтернативные creds или токены на основе auth недоступны на предварительном уровне для соответствия текущей реализации vso; Вы можете рассмотреть следующий подход: если у вас есть права администратора на уровне приложений TFS, вы можете настроить базовую аутентификацию для приложения tfs в IIS и установить домен по умолчанию.

включение базового auth и настройка домена

И затем вызывается следующим образом:

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);

        });

ВАЖНОЕ ЗАМЕЧАНИЕ!: Если вы включите базовый auth, вы действительно должны настроить свой сайт на использование https тоже, или ваши учетные данные будут отправляться в виде открытого текста (как указано в предупреждении - вверху справа вверху).


Через клиент .NET

В on-prem (в настоящее время обновление rtm'd: 2015 1) api обычно закрывается/отключается с помощью NTLM, что означает запрос перед полетом, 401 возвращается с сервера на вызов для auth, в этом случае, установка запроса Учетные данные, как показано ниже, позволяет запросить авторизацию на сервере после получения запроса о предполетной проверке. Для решения этой задачи вы можете:

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

Если вы включили базовый auth для tfs, вы можете попытаться выполнить аутентификацию следующим образом, этот шаблон соответствует механизму, используемому при вызове vso после включения альтернативных учетных данных в файле ui:

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

Примечание. В некотором коде, который я модифицировал несколько недель назад; необходима поддержка как VSO, так и on-prem, поэтому я использовал два шаблона выше, чтобы разобраться с конкретным сценарием.

Ответ 2

Мой вопрос старый, но, как и в марте 2017 года, последняя версия On-Prem TFS поддерживает создание токенов доступа для всех пользователей. Используя javascript-код от @Elmar, вы можете делать запросы на обновление, редактировать рабочие элементы TFS из REST API.

Ответ 3

Если возможно, я бы рекомендовал использовать клиентские библиотеки .NET для Visual Studio Team Services (и TFS):

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