2015-06-02 15 views
5

Tôi đang cố gắng viết một trình khách JavaScript cho API REST của Dịch vụ Team Studio của Visual Studio gửi yêu cầu AJAX đến Team Foundation Server 2015 tự tổ chức của chúng tôi nhưng tôi đang đối mặt với một dấu thập vấn đề miền.Vấn đề miền chéo AJAX với dịch vụ Visual Studio Team REST API

API yêu cầu thông tin đăng nhập để xác thực nhưng vì lý do bảo mật, trình duyệt chặn yêu cầu của tôi vì thông số Access-Control-Allow-Origin được đặt bằng ký tự đại diện *.

Tôi đã cố gắng thêm tham số này vào tiêu đề phản hồi HTTP trong IIS Manager và cũng trong tệp web.config TFS (thực sự giống nhau) nhưng tôi gặp lỗi khi thông số này có hai giá trị khác nhau (ví dụ: *http://localhost:58785) và chỉ nên có một. Tôi đoán giá trị này đã được xác định trong mã của thư viện mà tôi không thể truy cập vì dịch vụ web TFS đã được biên dịch và chạy trên IIS.

Tôi cũng đã cố gắng sử dụng đánh dấu <location allowOverride="false"> trong web.config, để cấm ghi đè cấu hình nhưng trong trường hợp đó TFS sẽ không bắt đầu.

Ai đó đã hỏi về vấn đề này here và cũng gửi một vé vào uservoice nhưng như tên của API thực sự mơ hồ (Visual Studio online REST API), tôi không biết nếu anh chàng này nói về thực Visual Studio trực tuyến hoặc nếu trường hợp của ông là giống như tôi (tự lưu trữ TFS Server).

Chúng tôi đã triển khai một số tính năng trong C# đang hoạt động tốt nhưng bây giờ chúng tôi thực sự cần triển khai ứng dụng khách JavaScript. Viết một dịch vụ web và sử dụng nó như một proxy để truy vấn API là một mớ hỗn độn thực sự và chúng tôi không muốn làm điều này.

Điều này thật đáng buồn, chúng tôi không thể gửi yêu cầu AJAX tới API vì cấu hình chúng tôi không thể thay đổi.

+0

Tôi gặp vấn đề tương tự. Tôi hy vọng có thể tạo một ứng dụng JavaScript. –

Trả lời

3

Somebody tại Microsoft cuối cùng đã cho tôi giải pháp, vì vậy ở đây là:

Trong PowerShell, chạy các lệnh sau:

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

Vì vậy, bạn có thể chỉ định một số lĩnh vực và bạn cũng có thể hạn chế đến một định cảng và/hoặc chương trình như thế này:

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

Dưới đây là một bài viết trên blog cũ về Updating the TF Registry using Powershell

Sau đó, bạn cuối cùng có thể gửi yêu cầu AJAX đã xác thực đến API.

[EDIT]: Tại thời điểm này, nếu bạn đang chạy nó trong Windows nó có thể đang hoạt động, tuy nhiên nó không sử dụng Xác thực cơ bản.

Hai lựa chọn:

1. Nó sử dụng Generic Credentials tự động thêm vào trong Credential Manager (Xin lỗi nó bằng tiếng Pháp)

enter image description here

2. Hoặc nó cũng có thể sử dụng Windows session credentials của bạn.

Vì vậy, để làm cho nó hoạt động trong môi trường không phải Windows, bạn vẫn cần thêm vài bước nữa.

Trên máy chủ TFS của bạn, hãy chạy lệnh PowerShell này để thêm tính năng Basic Authentication:

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

Sau đó, trong IIS Manager click "Xác thực" trên nút trang web TFS của bạn. Bây giờ bạn sẽ thấy xác thực cơ bản, chỉ cần kích hoạt nó.

enter image description here

Cuối cùng trong mã JavaScript của bạn chuyển đổi các chuỗi

DOMAIN \ username: password

để Base64 và thêm nó vào header của request (giả sử bạn sử dụng XMLHttpRequest):

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

NOT E: Hãy cẩn thận với trình chuyển đổi JavaScript Base64 thuần túy mà bạn có thể tìm thấy trên internet. Chuỗi được chuyển đổi có thể sai do mã hóa. So sánh chuỗi của bạn với một số trình chuyển đổi Base64 trực tuyến để chắc chắn.

Hy vọng điều này sẽ giúp người khác.

Các vấn đề liên quan