Создайте группу Azure Devops (безопасность), например «Авторы», с разрешениями через Rest API или клиентскую DLL. - PullRequest
0 голосов
/ 26 октября 2019

Мне нужно создать группы уровня проекта Azure Devops с конкретными разрешениями. Поскольку в командном проекте есть несколько команд, которые не должны влиять друг на друга, я хочу создавать отдельные группы и не хочу использовать, например, «Авторы». Мне удалось создать группу и получить эту группу (личность). Разрешения по умолчанию (или курс) «НЕ УСТАНОВЛЕНО».

Извлечение списка пространств имен безопасности, я мог бы использовать «QueryAccessControlList» или «HasPermissions», но мне нужен строковый токен и список IdentityDescriptors, чтобы получить разрешения длягруппа.
            var securityNamespaces = securityService.GetSecurityNamespaces();
            foreach (var secns in securityNamespaces)
            {
                secns.QueryAccessControlList(?? string-Token and IdentityDescriptors ?? );
            }

Где я могу найти эти параметры?

Идея состоит в том, чтобы вручную настроить группу на веб-портале, получить установленные разрешения и установить их для моих новых групп.
В качестве альтернативы я мог бы использовать tfssecurity.exe. Но для параметра / a + нужны параметры «идентификатор действия токена пространства имен», и я полагаю, что это тот же «токен», который мне не хватает :-(
Может кто-нибудь помочь?

Ответы [ 2 ]

2 голосов
/ 28 октября 2019

Вы можете создать группу безопасности на уровне проекта с помощью приведенного ниже API-интерфейса rest:

POST https://dev.azure.com/{org}/{proId}/_api/_identity/ManageGroup

Тело запроса:

{"name":"GroupNamehere","description":"Create a Test Group ","tfid":""}

Для аутентификации используется токен PAT.

enter image description here

Затем вы можете использовать нижеприведенный API остальных, чтобы установить разрешение, этот API-интерфейс вызывается из браузера нажатием f12.

Request URL: https://dev.azure.com/{org}/{proId}/_api/_security/ManagePermissions?__v=5

Пример запросатело:

{"updatePackage": "{"IsRemovingIdentity":false,"TeamFoundationId":"be207790-f8ea-4ce0-9bcf-d8b4920c2af7","DescriptorIdentityType":"Microsoft.TeamFoundation.Identity","DescriptorIdentifier":"S-1-9-1551374245-3902060889-2001379654-2338155045-4044170422-1-3881783123-407997253-3219626845-873774695","PermissionSetId":"52d39943-cb85-4d7f-8fa8-c6baac873819","PermissionSetToken":"vstfs:///Classification/TeamProject/59b994e8-4a77-46a1-8b5d-6a25f10d24b6","RefreshIdentities":false,"Updates":[{"PermissionId":1,"PermissionBit":1048576,"NamespaceId":"52d39943-cb85-4d7f-8fa8-c6baac873819","Token":"$PROJECT:vstfs:///Classification/TeamProject/59b994e8-4a77-46a1-8b5d-6a25f10d24b6:"}],"TokenDisplayName":null}"}

Примечание : "Updates\":[{\"PermissionId\":1, в теле запроса: 0 означает Not set, 1 означает Allow, 2 означает Deny

Вы также можете обратиться к ним: Установить права управления версиями с помощью REST API , case1 case2 . Надеюсь, это поможет.

1 голос
/ 01 ноября 2019

Ответ Хью Линса, вероятно, работает, но я не был полностью удовлетворен. Вот несколько полезных советов (с использованием библиотек MS DLL и .NET API).

IGroupSecurityService group_security_service;  // declared deprecated
group_security_service = team_project_collection.GetService<IGroupSecurityService>();
...
// create group
group_security_service.CreateApplicationGroup(prjinfo.Uri, sGroupName, sGroupDescription);
...

Извлечение необходимых прав доступа для группы (т.е. Contributores):

  • IdentityDescriptor группы
  • Маркер безопасности для каждого используемого пространства имен безопасности

1.IdentityDescriptor

TeamFoundationIdentity tfs_id = identity_management_service.ReadIdentity(IdentitySearchFactor.LocalGroupName,sGroup, MembershipQuery.Expanded, ReadIdentityOptions.IncludeReadFromSource);
var desc = tfs_id.Descriptor

2. Здесь приведены следующие примеры:
https://docs.microsoft.com/en-us/azure/devops/cli/security_tokens Мы должны создать строку, которая зависит от используемого пространства имен безопасности.

var securityNamespaces = securityService.GetSecurityNamespaces();

Для каждого пространства имен безопасности формат токена отличается небольшим битом. Например, для пространства имен «Project»:
$PROJECT:vstfs:///Classification/TeamProject/xxxxxxxx-a1de-4bc8-b751-188eea17c3ba'
Отсюда vstfs: ///...-Uri:

prjinfo = common_structure_service4.GetProjectFromName(sTeamProject);
--> prjinfo.Uri

Для вызова QueryAccessControlList нам нужен дескриптор какпараметр массива:

IdentityDescriptor[] tfidDescriptors = new IdentityDescriptor[] {desc};

Вызов QueryAccessControlList:

foreach (var secNS in securityNamespaces) 
{
  string sToken = CreateToken(secNS.Description.NamespaceId);
  AccessControlList acl = secNS.QueryAccessControlList(sToken, tfidDescriptors, false);
  foreach (var ace in acl.AccessControlEntries)
  {
     ace.Allow   vs.   ace.Deny  contain bit coded permissions
  }
}

Позже мы можем установить разрешения для другой группы.
(Мы должны разделить INHERIT и ALLOW / DENY).
Пример:

...
secNS.RemovePermissions(sToken, desc, inherits);
...
secNS.SetPermissions(sToken, desc, allows, denies, true);

Приветствия.

...