AJAX Visual Studio Team Services REST API 的跨域问题
AJAX cross domain issue with Visual Studio Team Services REST API
我正在尝试为 Visual Studio Team Services REST API 编写一个 JavaScript 客户端,它向我们自托管的 Team Foundation Server 2015 发送 AJAX 请求,但我'面临跨域问题。
API 需要凭据进行身份验证,但出于安全原因,浏览器阻止了我的请求,因为参数 Access-Control-Allow-Origin
设置了通配符 *
。
我试图在 IIS 管理器的 HTTP 响应头和 TFS web.config 文件中添加这个参数(实际上是一样的)但是我得到一个错误告诉我这个参数有两个不同的值(例如:*
和 http://localhost:58785
)并且应该只有一个。
我想这个值已经在我无法访问的库代码中定义了,因为 TFS Web 服务已经编译并且在 IIS 上 运行。
我还尝试使用 web.config 中的标记 <location allowOverride="false">
来禁止配置覆盖,但在这种情况下 TFS 将无法启动。
已经有人问过这个问题了here and also posted a ticket on uservoice但是由于API的名字实在是模棱两可(Visual Studio在线RESTAPI), 不知道这个人在网上说的是真的Visual Studio还是他的case和我一样(self-hosted TFS Server)
我们已经在 C# 中实现了一些运行良好的功能,但现在我们确实需要实现一个 JavaScript 客户端。
编写 Web 服务并将其用作代理来查询 API 对我们来说真是一团糟,我们不想这样做。
由于我们无法更改的配置,我们无法向 API 发送 AJAX 请求,这真是令人难过。
Microsoft 的某个人终于给了我解决方案,所以这里是:
在 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")
因此您可以指定多个域,也可以限制给定端口 and/or 方案,如下所示:
$configHive.SetValue("/Configuration/WebSecurity/AllowedOrigins", "localhost,port=58785,scheme=http;")
这是一篇关于 Updating the TF Registry using Powershell
的旧博客 post
然后您终于可以将经过身份验证的 AJAX 请求发送到 API。
[编辑]: 在这一点上,如果你在 运行 中使用它 Windows 它可能正在工作,但它不使用基本身份验证。
两个选项:
1. 它使用 Generic Credentials
在 Credential Manager
中自动添加(抱歉是法语)
2. 或者它也可以使用您的 Windows session credentials
。
所以要让它在 non-Windows 环境中工作,您还需要几个步骤。
在您的 TFS 服务器上,运行 此 PowerShell 命令用于添加基本身份验证功能:
dism /online /enable-feature /featurename:IIS-BasicAuthentication
然后在 IIS 管理器中单击您的 TFS 站点节点上的 "Authentication"。您现在应该看到基本身份验证,只需启用它。
最后在您的 JavaScript 代码中转换字符串
DOMAIN\username:password
到 Base64 并将其添加到请求的 header (假设您使用 XMLHttpRequest):
client.setRequestHeader('Authorization', 'Basic ' + myBase64AuthString);
注意:小心使用您可能在互联网上找到的纯 JavaScript Base64 转换器。由于编码,转换后的字符串可能是错误的。将您的字符串与一些在线 Base64 转换器进行比较以确定。
希望这对其他人有帮助。
我正在尝试为 Visual Studio Team Services REST API 编写一个 JavaScript 客户端,它向我们自托管的 Team Foundation Server 2015 发送 AJAX 请求,但我'面临跨域问题。
API 需要凭据进行身份验证,但出于安全原因,浏览器阻止了我的请求,因为参数 Access-Control-Allow-Origin
设置了通配符 *
。
我试图在 IIS 管理器的 HTTP 响应头和 TFS web.config 文件中添加这个参数(实际上是一样的)但是我得到一个错误告诉我这个参数有两个不同的值(例如:*
和 http://localhost:58785
)并且应该只有一个。
我想这个值已经在我无法访问的库代码中定义了,因为 TFS Web 服务已经编译并且在 IIS 上 运行。
我还尝试使用 web.config 中的标记 <location allowOverride="false">
来禁止配置覆盖,但在这种情况下 TFS 将无法启动。
已经有人问过这个问题了here and also posted a ticket on uservoice但是由于API的名字实在是模棱两可(Visual Studio在线RESTAPI), 不知道这个人在网上说的是真的Visual Studio还是他的case和我一样(self-hosted TFS Server)
我们已经在 C# 中实现了一些运行良好的功能,但现在我们确实需要实现一个 JavaScript 客户端。 编写 Web 服务并将其用作代理来查询 API 对我们来说真是一团糟,我们不想这样做。
由于我们无法更改的配置,我们无法向 API 发送 AJAX 请求,这真是令人难过。
Microsoft 的某个人终于给了我解决方案,所以这里是:
在 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")
因此您可以指定多个域,也可以限制给定端口 and/or 方案,如下所示:
$configHive.SetValue("/Configuration/WebSecurity/AllowedOrigins", "localhost,port=58785,scheme=http;")
这是一篇关于 Updating the TF Registry using Powershell
的旧博客 post然后您终于可以将经过身份验证的 AJAX 请求发送到 API。
[编辑]: 在这一点上,如果你在 运行 中使用它 Windows 它可能正在工作,但它不使用基本身份验证。
两个选项:
1. 它使用 Generic Credentials
在 Credential Manager
中自动添加(抱歉是法语)
2. 或者它也可以使用您的 Windows session credentials
。
所以要让它在 non-Windows 环境中工作,您还需要几个步骤。
在您的 TFS 服务器上,运行 此 PowerShell 命令用于添加基本身份验证功能:
dism /online /enable-feature /featurename:IIS-BasicAuthentication
然后在 IIS 管理器中单击您的 TFS 站点节点上的 "Authentication"。您现在应该看到基本身份验证,只需启用它。
最后在您的 JavaScript 代码中转换字符串
DOMAIN\username:password
到 Base64 并将其添加到请求的 header (假设您使用 XMLHttpRequest):
client.setRequestHeader('Authorization', 'Basic ' + myBase64AuthString);
注意:小心使用您可能在互联网上找到的纯 JavaScript Base64 转换器。由于编码,转换后的字符串可能是错误的。将您的字符串与一些在线 Base64 转换器进行比较以确定。
希望这对其他人有帮助。