2015-06-02 1 views
5

Ich versuche, einen JavaScript-Client für Visual Studio Team Services-REST-API zu schreiben, die AJAX-Anfragen an unseren selbst gehosteten Team Foundation Server 2015 senden, aber ich stehe vor einer Kreuzung Domänenproblem.AJAX Cross-Domain-Problem mit Visual Studio Team Services-REST-API

Die API erfordert Anmeldeinformationen für die Authentifizierung, aber aus Sicherheitsgründen blockiert der Browser meine Anforderungen, weil der Parameter Access-Control-Allow-Origin mit dem Platzhalter * festgelegt ist.

Ich habe versucht, diesen Parameter in HTTP-Antwortheadern im IIS-Manager und auch in der TFS web.config-Datei (die eigentlich gleich ist) hinzuzufügen, aber ich habe einen Fehler erhalten, der mir sagt, dass dieser Parameter zwei verschiedene Werte hat (zB: * und http://localhost:58785) und sollte nur eins haben. Ich denke, dieser Wert ist bereits im Code der Bibliothek definiert, auf den ich nicht zugreifen kann, weil der TFS-Webdienst bereits kompiliert wurde und auf IIS ausgeführt wird.

Ich habe auch versucht, das Markup <location allowOverride="false"> in web.config zu verwenden, um die Konfiguration zu überschreiben, aber in diesem Fall wird TFS nicht gestartet.

Jemand fragte bereits über dieses Thema here und erzielte auch ein Ticket auf uservoice aber wie der Name des API wirklich mehrdeutig (Visual Studio Online REST API) ist, ich weiß nicht, ob dieser Mann spricht über die realen Visual Studio online oder wenn sein Fall derselbe ist wie meiner (selbst gehosteter TFS Server).

Wir haben bereits einige Funktionen in C# implementiert, die gut funktionieren, aber jetzt müssen wir wirklich einen JavaScript-Client implementieren. Einen Webservice zu schreiben und ihn als Proxy zu benutzen, um die API abzufragen, ist für uns ein echtes Chaos und wir wollen das nicht tun.

Das ist so traurig, dass wir aufgrund einer Konfiguration, die wir nicht ändern können, keine AJAX-Anfragen an die API senden können.

+0

Ich habe genau die gleichen Probleme. Ich hoffte, einen JavaScript-Client erstellen zu können. –

Antwort

3

Jemand bei Microsoft gab mir endlich die Lösung, so ist es hier:

In Powershell Sie folgende Befehle ein:

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

So können Sie mehrere Domänen angeben und Sie können auch auf eine bestimmte beschränken Port und/oder Schema wie folgt aus:

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

Hier ist ein altes Blog-Post über Updating the TF Registry using Powershell

Anschließend können Sie authentifizierte AJAX-Anfragen an die API senden.

[BEARBEITEN]: An diesem Punkt, wenn Sie es in Windows ausführen, funktioniert es möglicherweise, aber es verwendet keine Standardauthentifizierung.

zwei Optionen:

1. Es verwendet Generic Credentials automatisch im Credential Manager hinzugefügt (Leider es in Französisch ist)

enter image description here

2. Oder es auch Ihre Windows session credentials nutzen könnten.

Damit Sie in einer Nicht-Windows-Umgebung arbeiten können, benötigen Sie noch einige weitere Schritte.

Auf dem TFS-Server, um diesen Powershell-Befehl ausführen Basic Authentication Feature hinzuzufügen:

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

dann in IIS-Manager "Authentifizierung" auf dem TFS-Website-Knoten. Sie sollten jetzt die Standardauthentifizierung sehen, aktivieren Sie sie einfach.

enter image description here

schließlich in Ihren JavaScript-Code konvertiert die Zeichenfolge

DOMAIN \ Benutzername: Passwort

zu Base64 und fügen Sie ihn in der Kopfzeile der Anfrage (Sie XMLHttpRequest verwenden vorausgesetzt):

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

NICHT E: Seien Sie vorsichtig mit dem reinen JavaScript Base64-Konverter, den Sie im Internet finden können. Die konvertierte Zeichenfolge könnte aufgrund der Codierung falsch sein. Vergleichen Sie Ihre Zeichenfolge mit einigen Online-Base64-Konvertern, um sicher zu sein.

Ich hoffe, dies wird anderen Menschen helfen.

Verwandte Themen