Jér*_*VEL 6 ajax cross-domain cors tfs-2015 azure-devops-rest-api
我正在尝试为Visual Studio Team Services REST API编写一个JavaScript客户端,它将AJAX请求发送到我们自托管的Team Foundation Server 2015,但我面临跨域问题.
API需要凭据进行身份验证,但由于安全原因,浏览器会阻止我的请求,因为参数Access-Control-Allow-Origin是使用通配符设置的*.
我试图在IIS管理器中的HTTP响应标头中添加此参数,也在TFS web.config文件中添加(实际上是相同的),但是我收到一个错误,告诉我这个参数有两个不同的值(例如:*和http://localhost:58785),应该只有一个.我想这个值已经在库的代码中定义,我无法访问,因为TFS Web服务已经在IIS上编译和运行.
我还尝试<location allowOverride="false">在web.config中使用标记,禁止配置覆盖,但在这种情况下TFS将无法启动.
有人已经在这里询问了这个问题,并且还在uservoice上发布了一张票,但由于API的名称非常模糊(Visual Studio Online REST API),我不知道这个人是否在线谈论真正的Visual Studio或者他的case与我的相同(自托管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")
Run Code Online (Sandbox Code Playgroud)
因此,您可以指定多个域,也可以限制为给定的端口和/或方案,如下所示:
$configHive.SetValue("/Configuration/WebSecurity/AllowedOrigins", "localhost,port=58785,scheme=http;")
Run Code Online (Sandbox Code Playgroud)
这是一篇关于使用 Powershell 更新 TF 注册表的旧博客文章
然后您最终可以向 API 发送经过身份验证的 AJAX 请求。
[编辑]:此时,如果您在 Windows 中运行它,它可能会工作,但它不使用基本身份验证。
两种选择:
1.它使用Generic Credentials自动添加在Credential Manager(对不起,它是法语)
2.或者它也可以使用你的Windows session credentials.
因此,要使其在非 Windows 环境中工作,您还需要执行更多步骤。
在您的 TFS 服务器上,运行此 PowerShell 命令以添加基本身份验证功能:
dism /online /enable-feature /featurename:IIS-BasicAuthentication
Run Code Online (Sandbox Code Playgroud)
然后在 IIS 管理器中单击 TFS 站点节点上的“身份验证”。您现在应该看到基本身份验证,只需启用它。
最后在你的 JavaScript 代码中转换字符串
域\用户名:密码
到 Base64 并将其添加到请求的标头(假设您使用 XMLHttpRequest):
[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")
Run Code Online (Sandbox Code Playgroud)
注意:小心使用您可能在互联网上找到的纯 JavaScript Base64 转换器。由于编码,转换后的字符串可能是错误的。将您的字符串与一些在线 Base64 转换器进行比较以确保。
希望这会帮助其他人。
| 归档时间: |
|
| 查看次数: |
2166 次 |
| 最近记录: |