Создание токена личного доступа (PAT) Azure DevOPS с помощью C#
Я пытаюсь создать PAT, используя новые возможности TokensHttpClient. Однако я продолжаю получать исключение авторизации. Я использую свою учетную запись Microsoft, которая является администратором организации.
VssCredentials creds = new VssClientCredentials();
creds.Storage = new VssClientCredentialStorage();
// Connect to Azure DevOps Services
VssConnection connection = new VssConnection(_uri, creds);
connection.ConnectAsync().SyncResult();
var t = connection.GetClient<TokenAdminHttpClient>();
//next line works as expected
var tokens = t.ListPersonalAccessTokensAsync(connection.AuthorizedIdentity.SubjectDescriptor).Result;
var tokenAdmin = connection.GetClient<TokensHttpClient>();
PatTokenCreateRequest createRequest = new PatTokenCreateRequest();
createRequest.DisplayName = "Niks_Api_Token";
createRequest.Scope = "vso.work_full";
createRequest.ValidTo = DateTime.Now.AddYears(1);
//this is where authorization exception occurs
var result = tokenAdmin.CreatePatAsync(createRequest).Result;
1 ответ
Чтобы управлять токенами личного доступа с помощью API , необходимо пройти аутентификацию с помощью токена Azure AD . Токены Azure AD - более безопасный механизм проверки подлинности, чем использование PAT. Учитывая способность этого API создавать и отзывать PAT, мы хотим гарантировать, что такие мощные функции предоставляются только разрешенным пользователям.
Пожалуйста, проверьте предварительные условия здесь.
Убедитесь, что ваша организация подключена к AAD, см. Здесь .
Зарегистрируйте приложение в Azure AD и убедитесь, что секрет клиента создан. Вы можете обратиться к этому документу . И добавьте разрешение Azure DevOps.
Пример кода для получения токена доступа Azure AD.
public static async Task<string> GetAccessTokenAsyncByClientCredential() { IConfidentialClientApplication cca = ConfidentialClientApplicationBuilder.Create(<appId/clientId>) .WithTenantId(<tenantId>) .WithClientSecret(<clientSecret>) .Build(); string[] scopes = new string[] { "499b84ac-1321-427f-aa17-267ca6975798/.default" }; var result = await cca.AcquireTokenForClient(scopes).ExecuteAsync(); return result.AccessToken; }