Создание токена для API Fabric Rest с использованием секрета клиента

Я работаю POC, где мне нужно подключиться к API Fabric Rest из С#, и я хочу создавать элементы. Я могу создавать элементы в соответствии с инструкциями, представленными на странице https://learn.microsoft.com/en-us/rest/api/fabric/articles/get-started/fabric-api-quickstart. Проблема, с которой я столкнулся, связана с созданием токенов. В соответствии с инструкциями, представленными на этой странице, я получаю страницу входа, и после успешной аутентификации генерируется токен. Я собираюсь использовать вызов создания токена внутри API, но у меня нет средств для аутентификации. Мне нужно руководство о том, как сгенерировать токен, используя секрет клиента, если это возможно. В настоящее время я использую код ниже:

using Microsoft.Identity.Client;
#region parameters section 
string ClientId = "clientID";
string Authority = "https://login.microsoftonline.com/organizations";
string RedirectURI = "http://localhost";
#endregion

#region Acquire a token for Fabric APIs 
// In this sample we acquire a token for Fabric service with the scopes  
// Workspace.ReadWrite.All and Item.ReadWrite.All 
string[] scopes = new string[] { "https://api.fabric.microsoft.com/Workspace.ReadWrite.All https://api.fabric.microsoft.com/Item.ReadWrite.All" };

PublicClientApplicationBuilder PublicClientAppBuilder =
        PublicClientApplicationBuilder.Create(ClientId)
        .WithAuthority(Authority)
        .WithRedirectUri(RedirectURI);

IPublicClientApplication PublicClientApplication = PublicClientAppBuilder.Build();

AuthenticationResult result = await PublicClientApplication.AcquireTokenInteractive(scopes)
        .ExecuteAsync()
        .ConfigureAwait(false);

Console.WriteLine(result.AccessToken);
#endregion

Я создал новую регистрацию приложения в активном каталоге Azure и добавил разрешение API для Power Bi и хранилища Azure. Я также предоставил согласие администратора на новое добавленное разрешение. Я создал секрет клиента и попытался создать токен в почтальоне. Токен создан, но при его использовании выдается неверный запрос. При использовании токена, сгенерированного из кода С#, он работает нормально.

🤔 А знаете ли вы, что...
C# активно развивается и обновляется, с появлением новых версий и функциональности.


3
1 486
1

Ответ:

Решено

Изначально я зарегистрировал одно приложение Entra ID и создал в нем один клиентский секрет:

Вам необходимо добавить вышеуказанного субъекта-службы в рабочие области Fabric, указав как минимум роль участника, например:

Прежде чем создавать токены, обязательно разрешите субъектам-службам доступ к использованию API-интерфейсов Fabric, включив следующую опцию на портале администрирования:

Теперь вы можете сгенерировать токен доступа, используя поток учетных данных клиента через Postman со следующими параметрами:

POST https://login.microsoftonline.com/tenantId/oauth2/v2.0/token
grant_type:client_credentials
client_id:appId
client_secret:secret
scope: https://api.fabric.microsoft.com/.default

Ответ:

Когда я использовал этот токен для вывода списка рабочих пространств путем вызова API Fabric, я получил такой ответ:

GET https://api.fabric.microsoft.com/v1/workspaces/

Ответ:

Чтобы получить тот же ответ в С# путем создания токена с потоком учетных данных клиента, вы можете использовать приведенный ниже пример кода:

#region
using Microsoft.Identity.Client;
using System.Net.Http.Headers;

string ClientId = "appId";
string ClientSecret = "secret"; 
string Authority = "https://login.microsoftonline.com/tenantId";
#endregion

#region 
string[] scopes = new string[] { "https://api.fabric.microsoft.com/.default" };

ConfidentialClientApplicationBuilder confidentialClientAppBuilder =
    ConfidentialClientApplicationBuilder.Create(ClientId)
    .WithClientSecret(ClientSecret)
    .WithAuthority(Authority);

IConfidentialClientApplication confidentialClientApplication = confidentialClientAppBuilder.Build();

AuthenticationResult result = await confidentialClientApplication.AcquireTokenForClient(scopes)
    .ExecuteAsync()
    .ConfigureAwait(false);

Console.WriteLine(result.AccessToken);
Console.WriteLine();
#endregion


// Create client 
HttpClient client = new HttpClient();
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", result.AccessToken);
string baseUrl = "https://api.fabric.microsoft.com/v1/";
client.BaseAddress = new Uri(baseUrl);

// Call list workspaces API 
HttpResponseMessage response = await client.GetAsync("workspaces");
string responseBody = await response.Content.ReadAsStringAsync();
Console.WriteLine(responseBody);

Ответ:

ОБНОВЛЯТЬ:

Когда я попытался получить элемент из рабочей области, где субъект-служба не имеет доступа хотя бы Contributor, я тоже получил ту же ошибку:

GET https://api.fabric.microsoft.com/v1/workspaces/{workspaceId}/items/{itemId}

Ответ:

Чтобы устранить ошибку, обязательно предоставьте как минимум Contributor доступ к субъекту-службе в рабочей области, в которой вы получаете ошибку:

Когда я выполнил вызов после предоставления доступа, я смог успешно получить элемент, вызвав этот API:

GET https://api.fabric.microsoft.com/v1/workspaces/{workspaceId}/items/{itemId}

Ответ:

Но для некоторых других операций, таких как создание элементов в рабочей области и т. д. аутентификация субъекта-службы (поток учетных данных клиента) не поддерживается.

Когда я попытался создать элемент в рабочей области с токеном субъекта-службы, я получил сообщение об ошибке «Операция не поддерживается для основного типа», например:

POST https://api.fabric.microsoft.com/v1/workspaces/{workspaceId}/items/
{
    "displayName": "Item 1",
    "type": "Lakehouse" 
}

Ответ:

Ссылка: REST API Microsoft Fabric | Майкрософт