2015-06-02 6 views
5

Я пытаюсь написать клиент JavaScript для Visual Studio Team Services REST API, который отправляет запросы AJAX на наш собственный сервер Team Foundation Server 2015, но я сталкиваюсь с крестом проблема с доменом.Проблема с перекрестным доменом AJAX с Visual Studio Team Services REST API

API требует учетных данных для аутентификации, но из-за соображений безопасности браузер блокирует мои запросы, поскольку параметр Access-Control-Allow-Origin задан с помощью подстановочного знака *.

Я попытался добавить этот параметр в заголовки ответов HTTP в диспетчере IIS, а также в файл TFS web.config (который на самом деле тот же), но я получил сообщение об ошибке, указывающее, что этот параметр имеет два разных значения (например: * и http://localhost:58785) и должен иметь только один. Я предполагаю, что это значение уже определено в коде библиотеки, к которому я не могу получить доступ, поскольку веб-служба TFS уже скомпилирована и запущена в IIS.

Я также попытался использовать разметку <location allowOverride="false"> в web.config, чтобы запретить переопределение конфигурации, но в этом случае TFS не запустится.

Кто-то уже спрашивал об этой проблеме here, а также отправил билет на uservoice но название API действительно неоднозначна (Visual Studio Интернет REST API), я не знаю, если этот парень говорит о реальной Visual Studio онлайн или если его случай такой же, как у меня (сам размещенный сервер TFS).

Мы уже реализовали некоторые функции на C#, которые работают хорошо, но теперь нам действительно нужно реализовать клиент JavaScript. Написание веб-сервиса и использование его в качестве прокси для запроса API - это для нас настоящий беспорядок, и мы не хотим этого делать.

Это настолько печально, что мы не можем отправлять запросы AJAX API из-за конфигурации, которую мы не можем изменить.

+0

У меня такие же проблемы. Я надеялся, что смогу создать клиент JavaScript. –

ответ

3

Кто-то в Microsoft, наконец, дал мне решение, так вот она:

В PowerShell, запустите следующие команды:

[Reflection.Assembly]::LoadFrom("C:\Program Files\Microsoft Team Foundation Server 14.0\Tools\Microsoft.TeamFoundation.Client.dll") 

$configServer = new-object Microsoft.TeamFoundation.Client.TfsConfigurationServer "http://localhost:8080/tfs/" 

$configHive = $configServer.GetService([Microsoft.TeamFoundation.Framework.Client.ITeamFoundationRegistry]) 

$configHive.SetValue("/Configuration/WebSecurity/AllowedOrigins", "domain1;domain2") 

Таким образом, вы можете указать несколько доменов, и вы можете также ограничить до указанного порт и/или схемы, как это:

$configHive.SetValue("/Configuration/WebSecurity/AllowedOrigins", "localhost,port=58785,scheme=http;") 

Вот старый блог о Updating the TF Registry using Powershell

Затем вы можете, наконец, отправить аутентифицированные запросы AJAX в API.

[EDIT]: На данный момент, если вы используете его в Windows, он может работать, однако он не использует базовую аутентификацию.

два варианта:

1. Он использует Generic Credentials автоматически добавляется в Credential Manager (К сожалению, это по-французски)

enter image description here

2. Или это может также использовать Windows session credentials.

Чтобы заставить его работать в среде, отличной от Windows, вам еще нужно сделать несколько шагов.

На сервере TFS, запустите следующую команду PowerShell, чтобы добавить функцию базовой аутентификации:

dism /online /enable-feature /featurename:IIS-BasicAuthentication 

Затем в диспетчере IIS выберите «Аутентификация» на вашем узле сайта TFS. Теперь вы должны увидеть Basic Authentication, просто включите его.

enter image description here

Наконец, в коде JavaScript преобразовать строку

ДОМЕН \ имя пользователя: пароль

в Base64 и добавить его в заголовке запрос (при условии, вы используете XMLHttpRequest):

client.setRequestHeader('Authorization', 'Basic ' + myBase64AuthString); 

НЕТ E: Будьте осторожны с чистым конвертером JavaScript Base64, который вы можете найти в Интернете. Преобразованная строка может быть неправильной из-за кодирования. Сравните свою строку с некоторыми онлайн-конвертерами Base64, чтобы быть уверенными.

Надеюсь, это поможет другим людям.