哪个作用域允许TFS扩展操作ACL?

哪个作用域允许TFS扩展操作ACL?,tfs,azure-devops-extensions,Tfs,Azure Devops Extensions,TFS 2015 u2。正在尝试编写一个TFS扩展,该扩展将使用JavaScript API操纵发布定义上的安全性。安全相关API在我身上失败,错误为401。代码如下: VSS.require(["VSS/Service", "VSS/Security/RestClient"], function (Srv, SecAPI) { var SecClient = Srv.getCollectionClient(SecAPI.SecurityH

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)
            {
                //...
            });
        }
这是一个错误。据我所知,扩展可能使用的RESTAPI列表是由清单中的
scopes
参数驱动的。我应该在那里放些什么来让它工作?不列出任何一种


同时,使用Windows auth从常规REST客户端调用同一个端点也可以正常工作。

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


有一个用户的声音,你可以投票。TFS PM将仔细考虑您的建议。

在TFS 2017 u2中,最后还有vso.security\u manage


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

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


我发现了一种非常简陋的方法,可以在较旧版本的TFS中为OAuth启用这些端点。它仅适用于本地TFS。OAuth作用域和服务端点URL/方法之间的关系存储在一个全局的、公共的、可变的单例数据结构中,一段用户代码可能只是能够修改它。如果您在类
Microsoft.VisualStudio.Services.DelegatedAuthorization.AuthorizationScopeDefinitions
Microsoft.TeamFoundation.Framework.Server.dll
中浏览方法
CreateDefault
,则可以在您喜爱的MSIL反汇编程序(ILDASM、ILSpy、Reflector)中看到它

下面的Global.asax实现了这一点。您必须将其复制到<代码> C:\程序文件\微软Team Foundation Server 14 \应用层.Web Services < /C> >(TFS 2015)。

无效会话\u启动(对象o、事件参数a)
{
AuthorizationScopeDefinition Def=AuthorizationScopeDefinitions.Default.scopes
.FirstOrDefault(d=>d.scope==“vso.identity”);
if(Array.IndexOf(Def.patterns,“/_API/SecurityNamespaces#GET”)<0)
{
List l=Def.patterns.ToList();
l、 添加(“/_API/SecurityNamespaces#GET”);
l、 添加(“/_API/AccessControlLists#GET+POST”);
l、 添加(“/DefaultCollection/_API/SecurityNamespaces#GET”);
l、 添加(“/DefaultCollection/_api/AccessControlLists#GET+POST”);
Def.patterns=l.ToArray();
}
}
挂接应用程序启动会更有意义,但DLL背后的代码已经挂接了它。Global.asax中的另一个处理程序不重写。我对
vso.identity
范围进行了修补,因为我的扩展已经声明了这一点,但可以随意使用其他任何扩展


引入您自己的全新范围可能不起作用。

肯定有REST API—您认为.NET客户端库是如何实现的?该API甚至有一个JavaScript包装器。问题是,如何用OAuth而不是NTLM来称呼它。
<%@ 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>