2015-06-02 21 views
5

Próbuję napisać klienta JavaScript dla REST API Visual Studio Team Services, który wysyła żądania AJAX do naszego hostowanego Team Foundation Server 2015, ale mam do czynienia z krzyżem problem z domeną.Problem z krzyżową domeną AJAX z Visual Studio Team Services REST API

Interfejs API wymaga poświadczeń do uwierzytelnienia, ale ze względów bezpieczeństwa przeglądarka blokuje moje żądania, ponieważ parametr Access-Control-Allow-Origin jest ustawiany za pomocą symbolu wieloznacznego *.

Próbowałem dodać ten parametr w nagłówkach odpowiedzi HTTP w Menedżerze usług IIS, a także w pliku TFS web.config (który jest w rzeczywistości taki sam), ale wystąpił błąd informujący mnie, że ten parametr ma dwie różne wartości (np .: * i http://localhost:58785) i powinny mieć tylko jedną. Domyślam się, że ta wartość jest już zdefiniowana w kodzie biblioteki, do której nie mam dostępu, ponieważ usługa sieciowa TFS jest już skompilowana i uruchomiona na IIS.

Próbowałem również użyć znacznika <location allowOverride="false"> w web.config, aby zabronić nadpisywania konfiguracji, ale w takim przypadku TFS nie uruchomi się.

Ktoś już pytał o tym numerze here a także pisał bilet na uservoice ale jak sama nazwa API jest bardzo niejednoznaczne (Visual Studio Online REST API), ja nie wiem, czy ten facet mówi o prawdziwym Visual Studio online lub jeśli jego przypadek jest taki sam jak mój (hostowany serwer TFS).

Mamy już zaimplementowane niektóre funkcje w C#, które działają dobrze, ale teraz naprawdę musimy zaimplementować klienta JavaScript. Pisanie usługi internetowej i używanie jej jako proxy do wysyłania zapytań do API jest dla nas prawdziwym bałaganem i nie chcemy tego robić.

To jest takie smutne, że nie możemy wysyłać żądań AJAX do API ze względu na konfigurację, której nie możemy zmienić.

+0

Mam dokładnie takie same problemy. Miałem nadzieję, że będę mógł stworzyć klienta JavaScript. –

Odpowiedz

3

Ktoś w firmie Microsoft w końcu dał mi rozwiązanie, więc tutaj jest:

W PowerShell uruchomić te polecenia:

[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") 

Tak można określić kilka domen, można także ograniczyć do danego portu i/lub schemat tak:

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

Oto stary blogu o Updating the TF Registry using Powershell

Następnie można w końcu wysłać uwierzytelnione żądania AJAX do interfejsu API.

[edycja]: W tym momencie, jeśli używasz go w systemie Windows, może on działać, jednak nie korzysta z podstawowego uwierzytelniania.

dwie opcje:

1. Wykorzystuje Generic Credentials automatycznie dodany w Credential Manager (Niestety jest w języku francuskim)

enter image description here

2. Lub może również korzystać z Windows session credentials.

Aby móc pracować w środowisku innym niż Windows, potrzebujesz jeszcze kilku kroków.

Na serwerze TFS, uruchomienie tego polecenia PowerShell, aby dodać funkcję uwierzytelniania podstawowe:

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

Następnie w Menedżerze IIS kliknij „autoryzacja” na swojej stronie węzła TFS. Powinieneś teraz zobaczyć Basic Authentication, po prostu włącz to.

enter image description here

Wreszcie w kodzie JavaScript przekonwertować ciąg

domena \ nazwa_użytkownika: hasło

do base64 i dodać go do nagłówka żądanie użytkownika (zakładając użyć XMLHttpRequest):

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

NOT E: Uważaj na czysty konwerter JavaScript Base64, który możesz znaleźć w Internecie. Przekonwertowany ciąg może być błędny z powodu kodowania. Porównaj swój ciąg z niektórymi konwerterami Base64 online, aby mieć pewność.

Mam nadzieję, że pomoże to innym osobom.