Как добавить пользователей в тот или иной репозиторий с помощью API

Я изо всех сил пытаюсь изучить документацию по API для Azure, посвященную тому, как добавить пользователя в определенное репо с помощью Rest API с доступом для чтения и записи к репозиторию git. Пожалуйста, помогите мне в этом.

Например: есть 3 репозитория. Я хочу ограничить доступ к двум другим репозиториям через API. Я получил namespaceId и использовал API-интерфейсы управления доступом, ничего не помогло.

Привет, добро пожаловать в SO. Могу ли я узнать, что вы ожидаете добавить пользователя в группу безопасности проекта, например [ProjectA]\Contributors, или в специальную группу с доступом к репозиторию?

Alvin Zhao - MSFT 16.08.2024 16:22

Привет, я новичок в DevOps. У меня есть список адресов электронной почты пользователей. Я создал проект, репозитории и ветки, используя вызовы API. Теперь я просто хочу добавить пользователей в определенный репозиторий с разрешением на чтение и запись. У меня есть namespaceId для их контроля доступа.

Jai 16.08.2024 16:40

Никаких действий по добавлению пользователей в тот или иной репозиторий нет. Доступ пользователей к репозиторию можно организовать по уровням доступа и группам безопасности. Все ли они находятся на базовом уровне доступа или выше? Они уже добавлены в организацию DevOps?

Alvin Zhao - MSFT 16.08.2024 17:00

Привет, Элвин! Да, они добавлены в организацию с доступом к команде проекта/участнику по умолчанию, но у них не должно быть доступа ко всем репозиториям, кроме одного.

Jai 16.08.2024 22:11

По умолчанию члены группы [Project]\Contributors имеют доступ ко всем репозиториям в этом проекте. Чего вы на самом деле ожидаете от этого поста? Запретить пользователям доступ ко всем репозиториям, кроме одного конкретного репо? Пожалуйста, внесите ясность в исходное сообщение.

Alvin Zhao - MSFT 17.08.2024 22:17

Да, Элвин, я хочу, чтобы пользователь имел доступ только к определенному репозиторию, но не к другим репозиториям.

Jai 18.08.2024 12:38

@Привет, Джай! Есть ли у вас возможность протестировать мой приведенный ниже сценарий для вызова API и ограничения доступа к репозиторию для группы пользователей? Надеюсь, это поможет решить ваш вопрос в этом посте. Спасибо.

Alvin Zhao - MSFT 20.08.2024 08:45
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
7
60
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Судя по дальнейшим обсуждениям, фактическое требование состоит в том, чтобы разрешить пользователям доступ к одному репозиторию в проекте и запретить доступ к другим репозиториям в этом проекте. Для этого вы можете попробовать приведенный ниже пример сценария PowerShell, который запретит всем репозиториям разрешение на участие для группы [PrjectA]\Contributors и разрешит разрешение Repo1 Contribute для группы [PrjectA]\Contributors.

$organization = "YourADOOrgName"
$project = "ProjectA"
$groupName = "Contributors"
$allowRepo = "Repo1"

$MyPat = 'xxxxx'
$B64Pat = [Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes(":$MyPat"))
$headers = @{
    'Authorization' = 'Basic ' + $B64Pat
    'Content-Type' = 'application/json'
}

# Get projects GET https://dev.azure.com/{organization}/_apis/projects?api-version=7.1-preview.4
$projectsURL = "https://dev.azure.com/$organization/_apis/projects?api-version=7.1-preview.4"
$projects = Invoke-RestMethod -Uri $projectsURL -Method Get -Headers $headers
$projectA = $projects.value | Where-Object { $_.name -eq "$project" }
$projectAId = $projectA.id
Write-Host "The id of $project is $projectAId"

# Get repos GET https://dev.azure.com/{organization}/{project}/_apis/git/repositories?api-version=7.1-preview.1
$reposURL = "https://dev.azure.com/$organization/$project/_apis/git/repositories?api-version=7.1-preview.1"
$repos = Invoke-RestMethod -Uri $reposURL -Method Get -Headers $headers
$repo = $repos.value | Where-Object { $_.name -eq "$allowRepo" }
$repoId = $repo.id
Write-Host "The id of $allowRepo is $repoId"

# Get group identity GET https://vssps.dev.azure.com/{organization}/_apis/identities?searchFilter=General&filterValue=Project Collection Valid Users&queryMembership=None&api-version=7.2-preview.1
$groupIdsURL = "https://vssps.dev.azure.com/$organization/_apis/identities?searchFilter=General&filterValue=[$project]\$groupName&queryMembership=None&api-version=7.2-preview.1"
$groupIds = Invoke-RestMethod -Uri $groupIdsURL -Method Get -Headers $headers
$groupId = $groupIds.value | Where-Object { $_.providerDisplayName -eq "[$project]\$groupName" }
$groupDescriptor = $groupId.descriptor
Write-Host "The descriptor for group [$project]\$groupName is $groupDescriptor"

# All security namespaces GET https://dev.azure.com/{organization}/_apis/securitynamespaces?api-version=7.2-preview.1
$namespacesURL = "https://dev.azure.com/$organization/_apis/securitynamespaces?api-version=7.2-preview.1"
$namespaces = Invoke-RestMethod -Uri $namespacesURL -Method Get -Headers $headers
$namespaces |  ConvertTo-Json -Depth 100 | Out-File "C:\Users\Alvin\Desktop\namespaces.json"
$namespaceGitRepos = $namespaces.value | Where-Object { $_.displayName -eq "Git Repositories" }
$namespaceIdGitReposContribute = $namespaceGitRepos.actions | Where-Object { $_.displayName -eq "Contribute" }
$namespaceIdGitReposContributeBit = $namespaceIdGitReposContribute.bit
$namespaceIdGitRepos = $namespaceGitRepos.namespaceId
Write-Host "The id for namespace Git Repositories is $namespaceIdGitRepos"
Write-Host "The bit for permission Contribute in namespace Git Repositories is $namespaceIdGitReposContributeBit"

# Access Control Entries - Set Access Control Entries POST https://dev.azure.com/{organization}/_apis/accesscontrolentries/{securityNamespaceId}?api-version=7.2-preview.1
$contributeACEURL = "https://dev.azure.com/$organization/_apis/accesscontrolentries/${namespaceIdGitRepos}?api-version=7.2-preview.1"

# Deny All repositories Contribute permission for [PrjectA]\Contributors group
$contributeDenyACEBody = @{
    "token" = "repoV2/$projectAId"
    "merge" = $true
    "accessControlEntries" = @(
        @{
            "descriptor" = "$groupDescriptor"
            "allow" = 0
            "deny" = $namespaceIdGitReposContributeBit
            "extendedInfo"= @{
                "effectiveAllow" = 0
                "effectiveDeny" = $namespaceIdGitReposContributeBit
                "inheritedAllow" = 0
                "inheritedDeny" = $namespaceIdGitReposContributeBit
            }
        }
    )
} | ConvertTo-Json -Depth 100
Invoke-RestMethod -Uri $contributeACEURL -Method Post -Headers $headers -Body $contributeDenyACEBody 

# Allow Repo1 Contribute permission for [PrjectA]\Contributors group
$contributeAllowACEBody = @{
    "token" = "repoV2/$projectAId/$repoId"
    "merge" = $true
    "accessControlEntries" = @(
        @{
            "descriptor" = "$groupDescriptor"
            "allow" = $namespaceIdGitReposContributeBit
            "deny" = 0
            "extendedInfo"= @{
                "effectiveAllow" = $namespaceIdGitReposContributeBit
                "effectiveDeny" = 0
                "inheritedAllow" = $namespaceIdGitReposContributeBit
                "inheritedDeny" = 0
            }
        }
    )
} | ConvertTo-Json -Depth 100
Invoke-RestMethod -Uri $contributeACEURL -Method Post -Headers $headers -Body $contributeAllowACEBody

После проверки работоспособности вы можете распространить другие разрешения, например «Чтение», и установить разрешения для другой группы пользователей, например «Читатели».

Это потрясающе, спасибо! Элвин

Jai 22.08.2024 04:08

Другие вопросы по теме

Похожие вопросы

Аутентификация необходима при запуске сценариев Powershell из конвейера Azure, но не при запуске Azure CLI
Пул агентов Azure DevOps: как мне запросить определенную возможность Net Framework SDK?
Загрузите универсальный пакет без az cli, используя REST API
Служба приложений Azure для Django не работает с Azure Devops Pipeline
Могу ли я иметь собственный локальный сервер агента сборки в Azure Devops с возможностью перехода в облако?
Интеграция Microsoft Teams с AzureDevops Boards для создания рабочих элементов по требованию
Ошибка настройки агента DevOps TF400813: пользователь «пользователь» не имеет прав на доступ к этому ресурсу. Не удалось подключиться. Попробуйте еще раз или нажмите Ctrl-C, чтобы выйти
Azure DevOps Yaml – как установить глобальные переменные из параметров?
Azure Devops REST API — публикуйте артефакты сборки из локального хранилища
Способ запуска сценария bash перед перехватом перед развертыванием с помощью безагентного сервера в Azure Devops