首页 > 解决方案 > 使 release def 上下文菜单项有条件地不可见

问题描述

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

故意不打电话VSS.register()没有帮助;自定义命令仍然存在,只是什么都不做。

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

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

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

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

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

标签: tfsazure-devops-extensions

解决方案


贡献约束就是答案。具体来说,“安全”约束。它对 TFS 中的安全对象执行权限检查,如果当前用户没有所需的权限,则隐藏命令。

就我而言,我会使用某个代理池作为“此用户是管理员”条件的代理。在内部,池和队列上的角色分配被视为 ACL。池操作的命名空间 GUID 为 101EAE8C-1709-47F9-B228-0E476C35B3BA(“DistributedTask”),令牌格式为“AgentPools/{PoolID}/”。对应于 的访问掩码 27Use+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参数,这是最近添加的,在主要贡献清单文档中未提及。这似乎是为了限制对未经授权的用户的访问,与我的情况有些不同。


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


推荐阅读