1

TFS 2015 u2。尝试编写一个 TFS 扩展,该扩展将使用 JavaScript API 来操纵发布定义的安全性。与安全相关的 API 因错误 401 而失败。代码如下:

VSS.require(["VSS/Service", "VSS/Security/RestClient"],
        function (Srv, SecAPI)
        {
            var SecClient = Srv.getCollectionClient(SecAPI.SecurityHttpClient);
            SecClient.queryAccessControlLists("aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee").then(function(a)
            {
                //...
            });
        }

401 Unauthorized 错误。据我了解,扩展可能使用的 REST API 列表由清单中的scopes参数驱动。我在那儿放什么才能使它起作用?范围列表没有列出任何类型。

同时,使用 Windows 身份验证从常规 REST 客户端调用相同的端点按预期工作。

4

2 回答 2

2

最后,在 TFS 2017 u2 中,有vso.security_manage


在 TFS 2017 u1 中,有一个vso.base涵盖此 API 端点的范围,但仅限于 GET。更改描述符所需的 POST 仍然不在范围内。

在 TFS 2015 u2 中,大概在下面,没有涵盖 ACL 相关端点的范围。


我发现了一种在旧版本的 TFS 中启用 OAuth 端点的非常骇人听闻的方法。它仅适用于本地 TFS。OAuth 范围和服务端点 URL/方法之间的关系存储在一个全局的、公共的、可变的单例数据结构中,一段用户代码可能只是能够改变。如果您CreateDefaultMicrosoft.VisualStudio.Services.DelegatedAuthorization.AuthorizationScopeDefinitions.Microsoft.TeamFoundation.Framework.Server.dll

以下 Global.asax 可以解决问题。您必须将其复制到C:\Program Files\Microsoft Team Foundation Server 14.0\Application Tier\Web Services(对于 TFS 2015)。

<%@ Application Inherits="Microsoft.TeamFoundation.Server.Core.TeamFoundationApplication" %>
<%@ Import namespace="Microsoft.VisualStudio.Services.DelegatedAuthorization" %>
<%@ Import namespace="System.Collections.Generic" %>
<%@ Import namespace="System.Linq" %>
<script runat="server">
void Session_Start(object o, EventArgs a)
{
    AuthorizationScopeDefinition Def = AuthorizationScopeDefinitions.Default.scopes
        .FirstOrDefault(d => d.scope == "vso.identity");
    if(Array.IndexOf(Def.patterns, "/_apis/SecurityNamespaces#GET") < 0)
    {
        List<string> l = Def.patterns.ToList();
        l.Add("/_apis/SecurityNamespaces#GET");
        l.Add("/_apis/AccessControlLists#GET+POST");
        l.Add("/DefaultCollection/_apis/SecurityNamespaces#GET");
        l.Add("/DefaultCollection/_apis/AccessControlLists#GET+POST");
        Def.patterns = l.ToArray();
    }
}
</script>

挂钩 Application_Start 会更有意义,但代码隐藏 DLL 已经挂钩它。Global.asax 中的另一个处理程序不会覆盖。我对范围进行了猴子补丁vso.identity,因为我的扩展已经声明了这一点,但可以随意使用任何其他的。

介绍您自己的全新范围​​可能行不通。

于 2017-08-03T16:15:58.803 回答
0

不幸的是,没有任何 REST API 可以更改发布定义或发布环境的权限。

有一个您可以投票的用户声音。用于发布定义或发布环境的 REST API TFS PM 将审核您的建议。

于 2017-06-27T14:30:23.660 回答