Visual Studio Team Services REST API 的 AJAX 跨域问题

2024-04-05

我正在尝试为 Visual Studio Team Services REST API 编写一个 JavaScript 客户端,该客户端将 AJAX 请求发送到我们自托管的 Team Foundation Server 2015,但我面临跨域问题。

API 需要凭据进行身份验证,但由于安全原因,浏览器阻止我的请求,因为参数Access-Control-Allow-Origin使用通配符设置*.

我尝试在 IIS 管理器的 HTTP 响应标头以及 TFS web.config 文件中添加此参数(实际上是相同的),但我收到一条错误消息,告诉我此参数有两个不同的值(例如:* and http://localhost:58785)并且应该只有一个。 我猜想这个值已经在库的代码中定义了,但我无法访问它,因为 TFS Web 服务已经在 IIS 上编译并运行。

我也尝试使用标记<location allowOverride="false">在 web.config 中,禁止配置覆盖,但在这种情况下 TFS 将不会启动。

已经有人问过这个问题了here https://social.msdn.microsoft.com/Forums/vstudio/en-US/2f808d18-058c-447e-b6a3-6686ca49629e/do-the-visual-studio-online-api-support-cors?forum=TFService并在上面发布了一张票用户之声 https://visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/6589478-support-for-cors-in-the-visual-studio-online-rest但由于 API 的名称确实含糊不清(Visual StudioOnlineREST API),我不知道这家伙是否在网上谈论真正的Visual Studio,或者他的情况是否与我的相同(自托管TFS Server)。

我们已经在 C# 中实现了一些运行良好的功能,但现在我们确实需要实现一个 JavaScript 客户端。 编写一个 Web 服务并将其用作查询 API 的代理对我们来说真是一团糟,我们不想这样做。

令人遗憾的是,我们无法向 API 发送 AJAX 请求,因为我们无法更改配置。


微软的有人终于给了我解决方案,所以这里是:

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

这是一篇关于使用 Powershell 更新 TF 注册表 https://blogs.msdn.microsoft.com/chrisid/2010/05/24/updating-the-tf-registry-using-powershell/

然后您终于可以向 API 发送经过身份验证的 AJAX 请求。

[EDIT]:此时,如果您在 Windows 中运行它,它可能可以工作,但它不使用基本身份验证。

两种选择:

1.它用Generic Credentials自动添加到Credential Manager(抱歉,这是法语)

2.或者它也可以使用您的Windows session credentials.

因此,要使其在非 Windows 环境中运行,您还需要执行一些步骤。

在 TFS 服务器上,运行以下 PowerShell 命令以添加基本身份验证功能:

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

然后在 IIS 管理器中单击 TFS 站点节点上的“身份验证”。您现在应该看到基本身份验证,只需启用它即可。

最后在 JavaScript 代码中转换字符串

域名\用户名:密码

Base64 并将其添加到请求的标头(假设您使用 XMLHttpRequest):

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

注意:请小心您可以在互联网上找到的纯 JavaScript Base64 转换器。由于编码原因,转换后的字符串可能是错误的。将您的字符串与一些在线 Base64 转换器进行比较以确定。

希望这会帮助其他人。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Visual Studio Team Services REST API 的 AJAX 跨域问题 的相关文章