2018年1月1日。我正在使用自定义上下文菜单命令构建扩展定义的扩展。我希望其中一些条件不可见(根据当前用户的权利)。有什么方法可以隐藏它们吗?
故意不致电VSS.register()
没有帮助;自定义命令仍在那里,什么都不做。
这不是安全措施,它是一种可用性(菜单越来越拥挤)。
编辑:在Contribution data structure中有一个名为constraints
的媒体资源。它没有记录,也不知道它来自哪里。显然可能是显而易见的。我能找到的限制的唯一提及是TFX tool sources。显然,constraints
是清单JSON中的有效值(可能在贡献对象下),并且它应该是一个数组。一个假定,ContributionConstraint
个对象之一。后者有点记载。
A constraint object具有name
属性,根据文档,该属性包含对IContributionFilter
类的引用。我无法在文档和TypeScript资源中找到该类的任何提及。但是,程序集Microsoft.VisualStudio.Services.ExtensionManagement.Sdk.Server.IContributionFilter
中有一个接口Microsoft.VisualStudio.Services.ExtensionManagement.Sdk.Server.dll
,并且它具有Name
属性。 bin\Plugins\Microsoft.VisualStudio.Services.ExtensionManagement.Sdk.Plugins.dll
中有派生类:
专注于后者。名称是"安全"。看起来它支持以下属性:
如果在贡献对象下的清单JSON中指定约束,它至少会通过TFS数据结构传播,并显示在扩展程序脚本中的VSS.getContribution()
下。现在,关于安全检查的细节......
答案 0 :(得分:0)
贡献限制就是答案。具体而言,"安全"约束。它对TFS中的安全对象执行权限检查,如果当前用户没有保留所需的权限,则隐藏命令。
在我的情况下,我使用某个代理池作为&#34的代理;该用户是管理员"条件。在内部,池和队列上的角色分配被视为ACL。池操作的命名空间GUID是101EAE8C-1709-47F9-B228-0E476C35B3BA(" DistributedTask"),令牌格式是" AgentPools / {PoolID} /"。对应于Use+Administer Permissions+Manage+View
的访问掩码27是对应于池管理员角色的访问掩码。
约束在清单中的贡献对象下指定:
{
"contributions": [
{
"id": "mycommand",
"type": "ms.vss-web.action",
"constraints": [
{
"name": "Security",
"properties": {
"namespaceId":"101EAE8C-1709-47F9-B228-0E476C35B3BA",
"namespaceToken":"AgentPools/17/",
"permission": 27
}
}],
// More contribution stuff...
}],
// More extension stuff...
}
这种方法的缺点是我必须在扩展中硬编码池的ID。 扩展程序特定于我们特定的TFS实例。它对我有用,但它是内部扩展,我不打算发布或分发它,它已经有了大量依赖于我们TFS设置的具体细节。
当然,所有这些都是完全无证的,可能随时都会破裂。但话说回来,很少有TFS' API表面已记录。
清单中还有restrictedTo
参数,这是最近添加的,在主要贡献清单doc中没有提到。这似乎是为了限制对未授权用户的访问,这与我的情况有所不同。
编辑:I wrote a blog post with some more info。除了安全性之外,还有5个约束类。