使释放def上下文菜单项有条件地不可见

时间:2018-05-17 16:37:06

标签: tfs tfs2018 azure-devops-extensions

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中有派生类:

  • ExtensionLicensedFilter
  • FeatureFlagFilter
  • LegacyFeatureEnabledFilter
  • ActiveExtensionFilter
  • FeatureFilter
  • SecurityFilter类

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

  • namespaceId(GUID) - AKA安全名称空间
  • namespaceToken(string) - 安全对象标记
  • permission(int) - 位掩码,类似于ACL中的位掩码
  • allowSystemContext(可选bool) - ???
  • serviceInstanceType(可选GUID) - 仅对VSTS
  • 有用

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

1 个答案:

答案 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个约束类。