gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 15:21:12 25 4
gpt4 key购买 nike

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

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

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

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

已经有人问过这个问题 here并且还在uservoice上发了一张票但是由于 API 的名称确实含糊不清(Visual Studio Online REST API),我不知道这家伙是在谈论真正的 Visual Studio 在线还是他的情况和我的一样(自我托管的 TFS 服务器)。

我们已经在 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;")

这是一篇关于 Updating the TF Registry using Powershell 的旧博客文章

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

[编辑]:此时,如果您在 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 站点节点上的“身份验证”。您现在应该看到基本身份验证,只需启用它。

enter image description here

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

DOMAIN\username:password



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

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

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

希望这会帮助其他人。

关于Visual Studio Team Services REST API 的 AJAX 跨域问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30599931/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com