【问题标题】:Getting the Branch ID for Accesscontrol获取访问控制的分支 ID
【发布时间】:2020-02-20 02:19:54
【问题描述】:

我正在尝试在分支级别限制特定 AD 组的权限。之前我曾询问 Microsoft Azure DevOps 团队是否有任何端点 URI REST API 用于此请求,但我得到的响应是它当前不可用。但是,我已经设法使用 chrome 开发人员工具获取 API,该工具是

https://dev.azure.com/{organization}/_apis/accesscontrolentries/{namespacetoken}?api-version=5.1

然后,我正在使用下面的这个主体发出 POST 请求,

branchPermissionbody = {
                "token": "{}".format(permissionToken),
                "merge": True,
                "accessControlEntries": [
                    {
                        "descriptor": "Microsoft.TeamFoundation.Identity;{}".format(descriptorIdentifier),
                        "deny": 4,
                        "extendedinfo": {}
                    }
                ]
            }

Permission Token,格式为,

 repoV2/{projectID}/{repositoryID}/refs/heads/{branchID}/

描述符标识符是我们可以得到的。

在这里,我一直在获取 branchID。例如,如果我们要限制的分支是mastersupport%5E,我们如何使用开发者工具获取这些分支ID?

【问题讨论】:

    标签: git azure-devops azure-devops-rest-api azure-repos


    【解决方案1】:

    This blog post explains it all.

    我的一位读者刚刚发现了您遇到的问题并将解决方案发布为评论:

    Pickle Rick Guest • 2 days ago

    对不起,这是我之前弄错的两个相同的东西,但我目前的理解是:

    使用 az 更新特定分支的权限需要每个 分支名称的一部分以 unicode 进行十六进制编码。部分,我的意思是 如果您使用功能/分支名称作为约定,它的十六进制/十六进制而不是 比被编码的斜线。这有点疯狂。

    使用 powershell 我最终得到了:

     function hexify($string) { return ($string | Format-Hex -Encoding
          Unicode | Select-Object -Expand Bytes | ForEach-Object { '{0:x2}' -f
          $_ }) -join '' }
    
     $branch = "feature/*" $split = $branch.Split("/") $hexBranch = ($split
          | ForEach-Object { hexify -string $_ }) -join "/"
    

    然后您可以使用该字符串生成令牌,例如:

     repoV2/daec401a-49b6-4758-adb5-3f65fd3264e3/f59f38e0-e8c4-45d5-8dee-0d20e7ada1b7/refs/heads/6600650061007400750072006500/2a00
    

    真是一团糟!我不知道为什么 refs/heads/ 和 其他 / 不编码。也许我错过了一些东西,但嘿它 似乎有效。

    感谢您的示例为我指明了正确的方向。

    令牌有点像噩梦。例如,没有一致的 API 可以获取分支的令牌。我还看到了以下格式:

    因为/ 是标记分隔符,所以通过将/ 替换为^ 来转义分支引用。因此refs/heads/master 变为:refs^heads^master


    不确定为什么代码对您不起作用,可能与您的控制台的代码页或输入数据的 unicode king 有关。

    这是我运行代码示例时得到的结果:

    function hexify($string) {
         return ($string | Format-Hex -Encoding Unicode | Select-Object -Expand Bytes | ForEach-Object { '{0:x2}' -f $_ }) -join ''
    }
    
    $branch = "feature/mine"
    $split = $branch.Split("/")
    $hexBranch = ($split | ForEach-Object { hexify -string $_ }) -join "/"
    
    write-host "refs/heads/$hexBranch"
    refs/heads/6600650061007400750072006500/6d0069006e006500
    

    【讨论】:

    • 嗨,杰西,非常感谢您的评论,但有一件事,您能告诉我如何从字符串(例如“master”)到十六进制数,似乎是当我使用十六进制文本,我得到了 m(weridsymbol)a(weridsymbol)s(weridsymbol)t(weridsymbol) 的值......你明白了。
    • 不知道为什么,可能是编码。添加了我运行该 sn-p 时得到的内容。
    【解决方案2】:

    您可以使用此工具将您的分支名称自动转换为分支 ID。 https://onlineunicodetools.com/convert-unicode-to-hex

    为了测试,我从 Developer tool 中获取了我的主分支 ID,它是 6d0061007300740065007200,如下所示。

    然后使用此工具将master 转换为十六进制。

    这些值是相同的。那么support%5E呢?

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-12
      • 1970-01-01
      • 1970-01-01
      • 2015-07-02
      • 1970-01-01
      • 2016-09-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多