Я работаю 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# активно развивается и обновляется, с появлением новых версий и функциональности.
Изначально я зарегистрировал одно приложение 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 | Майкрософт