使发布定义上下文菜单项有条件地不可见



TFS 2018u1.我正在使用用于发布定义的自定义上下文菜单命令构建扩展。我希望其中一些是有条件的不可见的(根据当前用户的权限)。有什么方法可以隐藏它们吗?

故意不调用VSS.register()无济于事;自定义命令仍然存在,只是什么都不做。

这不是安全措施,而是可用性问题(菜单越来越拥挤)。

编辑:在贡献数据结构中,有一个名为constraints的属性。它没有记录在案,不知道它来自哪里。可能是清单。我能找到的唯一提到的约束是在 TFX 工具源中。显然,constraints是清单 JSON 中的有效值(可能在贡献对象下),它应该是一个数组。一个假设,一个ContributionConstraint对象。后者是有据可查的。

根据文档,约束对象具有一个name属性,该属性包含对IContributionFilter类的引用。我在文档和 TypeScript 源代码中都找不到该类的任何提及。但是,在汇编Microsoft.VisualStudio.Services.ExtensionManagement.Sdk.Server.dll中有一个接口Microsoft.VisualStudio.Services.ExtensionManagement.Sdk.Server.IContributionFilter,它具有Name属性。binPluginsMicrosoft.VisualStudio.Services.ExtensionManagement.Sdk.Plugins.dll中有派生类:

  • 扩展许可筛选器
  • 功能标志过滤器
  • 旧版功能已启用筛选器
  • 活动扩展过滤器
  • 功能过滤器
  • 安全过滤器

专注于后者。名称是"安全"。看起来它支持以下属性:

  • 命名空间 ID (GUID) - 又名安全命名空间
  • 命名空间令牌(字符串) - 安全对象令牌
  • 权限 (int) - 位掩码,类似于 ACL 中的掩码
  • allowSystemContext (可选布尔值) - ???
  • serviceInstanceType(可选 GUID) - 仅对 VSTS 很重要

如果在清单 JSON 中的贡献对象下指定约束,则至少它会通过 TFS 数据结构传播,并在扩展脚本的VSS.getContribution()下显示。现在,进入安全检查的细节...

贡献约束就是答案。具体来说,"安全性"约束。它对 TFS 中的安全对象执行权限检查,并在当前用户不持有所需权限时隐藏命令。

就我而言,我会使用某个代理池作为"此用户是管理员"条件的代理。在内部,池和队列上的角色分配被视为 ACL。池操作的命名空间 GUID 为 101EAE8C-1709-47F9-B228-0E476C35B3BA("分布式任务"),令牌格式为"代理池/{池 ID}/"。访问掩码 27 对应于Use+Administer Permissions+Manage+View,是对应于池管理员角色的掩码。

约束在清单中的贡献对象下指定:

{
"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参数,这是最近添加的,在主贡献清单文档中未提及。这似乎是为了限制对未经授权的用户的访问,与我的情况有些不同。


编辑:我写了一篇博客文章,其中包含更多信息。除了安全性之外,还有 5 个约束类。

最新更新