【问题标题】:Which scope lets a TFS extension manipulate ACLs?哪个范围允许 TFS 扩展操作 ACL?
【发布时间】:2017-06-26 18:09:42
【问题描述】:

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 参数驱动。我在那儿放什么才能使它起作用? The scopes list 没有列出任何类型。

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

【问题讨论】:

    标签: tfs azure-devops-extensions


    【解决方案1】:

    在 TFS 2017 u2 中,终于有了 vso.security_manage


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

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


    我发现了一种非常骇人听闻的方法,可以在旧版本的 TFS 中为 OAuth 启用这些端点。它仅适用于本地 TFS。 OAuth 范围和服务端点 URL/方法之间的关系存储在一个全局的、公共的、可变单例数据结构中,一段用户代码可能只是能够改变它。如果您在 Microsoft.VisualStudio.Services.DelegatedAuthorization.AuthorizationScopeDefinitions 内的 Microsoft.VisualStudio.Services.DelegatedAuthorization.AuthorizationScopeDefinitions 类中查看方法 CreateDefault,您可以在您最喜欢的 MSIL 反汇编程序(ILDASM、ILSpy、Reflector)中看到它。

    以下 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 范围进行了猴子补丁,因为我的扩展程序已经声明了这一点,但请随意使用其他任何一个。

    介绍您自己的全新示波器可能行不通。

    【讨论】:

      【解决方案2】:

      很遗憾,没有任何 REST API 可以更改发布定义或发布环境的权限。

      有一个用户可以投票。 REST API for release defintion or release enviornmentTFS PM 将审核您的建议。

      【讨论】:

      • 肯定有一个 REST API - 你认为 .NET 客户端库是如何做到的?该 API 甚至还有一个 JavaScript 包装器。问题是,如何使用 OAuth 而不是 NTLM 来调用它。
      猜你喜欢
      • 2014-11-16
      • 2019-01-23
      • 2020-01-30
      • 1970-01-01
      • 1970-01-01
      • 2018-04-02
      • 2014-07-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多