Во-первых, distributedTaskContext
не подключается к TFS с NTLM, как предполагает ответ Патрика Лу. Соединяется с Authorization:Bearer
и токеном. Я использовал тот же токен для вызова конечной точки /_api/_common/GetUserProfile
, которая возвращает текущего пользователя и вернула следующую идентификационную запись:
{
"IdentityType": "user",
"FriendlyDisplayName": "Project Collection Build Service (TEAM FOUNDATION)",
"DisplayName": "Project Collection Build Service (TEAM FOUNDATION)",
"SubHeader": "Build\\233e4ccc-d129-4ba4-9c5b-ea82c7ae1d15",
"TeamFoundationId": "7a3195ee-870e-4151-ba58-1e522732086c",
"EntityId": "vss.ds.v1.ims.user.7a3195ee870e4151ba581e522732086c",
"Errors": [],
"Warnings": [],
"Domain": "Build",
"AccountName": "233e4ccc-d129-4ba4-9c5b-ea82c7ae1d15",
"IsWindowsUser": false,
"MailAddress": ""
}
Похоже, это некая искусственная идентификация, которую TFS создает именно для этой цели. Если заглянуть в базу данных TFS в таблице tbl_Identity
, можно найти множество пользовательских записей с такими именами - по одной на коллекцию, а также некоторые, относящиеся к конкретному проекту.
Этот пользователь принадлежит к группе уровня сервера, называемой «Группа служб безопасности» (а также к группе уровня коллекции с тем же именем). Эти группы принадлежат, соответственно, Действительным пользователям Team Foundation и Действительным пользователям коллекции проектов и ничему другому.
По крайней мере на уровне сбора «Группа служб безопасности» видна и содержит много учетных записей.
Все эти пользователи «Службы сборки» принадлежат домену «Сборка». Домен не является субъектом безопасности, однако вы не можете предоставлять права на домен.
Говоря об объемах OAuth. Я использовал тот же токен для вызова доморощенной страницы "каковы области действия этого токена" , и оказалось, что у токена distributedTaskContext
есть ровно один - app_token
. Это действительная область, которая открывает все конечные точки и все методы (см. список динамических областей ). Параметр scopes
в манифесте расширения не имеет к этому никакого отношения; это влияет только на вклады на стороне клиента.
Однако, когда дело доходит до видимости пула, история хитрая. Похоже, что все учетные записи «Служба сборки коллекций проектов» принадлежат действительным пользователям, но предоставление роли «Чтение» во всех пулах действительным пользователям не открывает их для API REST в задачах. Предоставление Reader явным образом «Службе сборки коллекций проектов» делает. Однако существует множество подобных учетных записей (кажется, по одной на коллекцию) - и предоставление Reader открывает пулы только для выпуска определений в коллекции, в которой они находятся. Чтобы задачи в выпусках во всех коллекциях могли читать пулы, вам нужно пройти через все коллекции и предоставить Reader для каждой из них «Службе сборки коллекций проектов».