哪个范围允许 TFS 扩展操作 ACL?

Which scope lets a TFS extension manipulate ACLs?

TFS 2015 u2。尝试编写一个 TFS 扩展,该扩展将使用 JavaScript API 来操纵发布定义的安全性。与安全相关的 APIs 在我身上失败并出现错误 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 列出 none 类型。

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

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

有用户声音可以投票。 REST API for release defintion or release enviornment TFS PM 将认真审核您的建议。

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


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

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


我发现了一种非常 hackish 的方式来在旧版本的 TFS 中为 OAuth 启用这些端点。它仅适用于本地 TFS。 OAuth 范围和服务端点 URLs/methods 之间的关系存储在一个全局的、public、 可变的 单例数据结构中,一段用户代码可能恰好能够改变。你可以在你最喜欢的 MSIL 反汇编程序(ILDASM、ILSpy、Reflector)中看到它,如果你在 Microsoft.TeamFoundation.Framework.Server.dll.

中的 class Microsoft.VisualStudio.Services.DelegatedAuthorization.AuthorizationScopeDefinitions 中寻找方法 CreateDefault

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

引入您自己的全新瞄准镜可能行不通。