Поделиться через


Проверка подлинности с помощью библиотеки проверки подлинности Майкрософт (MSAL) в приложениях

Область применения: ✅Microsoft Fabric✅Azure Data Explorer

Для программной проверки подлинности в кластере необходимо запросить маркер доступа из идентификатора Microsoft Entra, относяющегося к Azure Data Explorer. Этот маркер доступа выступает в качестве подтверждения удостоверения при выдаче запросов в кластер. Для создания маркера доступа можно использовать один из потоков библиотеки проверки подлинности Майкрософт (MSAL).

В этой статье объясняется, как использовать MSAL для проверки подлинности субъектов в кластере. Прямое использование MSAL для проверки подлинности субъектов в основном относится к веб-приложениям, которым требуется проверка подлинности от имени (OBO) или проверка подлинности одностраничного приложения (SPA). В других случаях рекомендуется использовать клиентские библиотеки Kusto, так как они упрощают процесс проверки подлинности.

В этой статье описаны основные сценарии проверки подлинности, сведения об успешной проверке подлинности и использовании MSAL для проверки подлинности.

Сценарии проверки подлинности

Ниже приведены основные сценарии проверки подлинности.

Для проверки подлинности пользователей и приложений рекомендуется использовать клиентские библиотеки Kusto. Для проверки подлинности OBO и SPA клиентские библиотеки Kusto нельзя использовать.

Параметры проверки подлинности

Во время процесса приобретения маркера клиенту необходимо указать следующие параметры:

Наименование параметра Description
ИД ресурса Идентификатор ресурса, для которого будет выдаваться маркер доступа Microsoft Entra. Идентификатор ресурса — это универсальный код ресурса кластера без сведений о портах и пути.

Пример: идентификатор ресурса для help кластера https://help.kusto.windows.net.
Идентификатор клиента Microsoft Entra Идентификатор Microsoft Entra — это мультитенантная служба, и каждая организация может создавать объект, называемый каталогом, в котором хранятся объекты, связанные с безопасностью, такие как учетные записи пользователей и приложения. Идентификатор Microsoft Entra часто ссылается на каталог как клиент. Каждый клиент имеет идентификатор клиента в виде GUID. Во многих случаях доменное имя организации также может использоваться для идентификации клиента Microsoft Entra.

Пример. У организации "Contoso" может быть идентификатор aaaabbbb-0000-cccc-1111-dddd2222eeee клиента и доменное имя contoso.com.
URI центра записи Майкрософт Конечная точка, используемая для проверки подлинности. Каталог Microsoft Entra или клиент определяет универсальный код ресурса (URI) центра Microsoft Entra. Универсальный код ресурса (URI) — https://login.microsoftonline.com/{tenantId} {tenantId} это идентификатор клиента или доменное имя.

Пример: например, https://login.microsoftonline.com/aaaabbbb-0000-cccc-1111-dddd2222eeee.

Примечание.

Конечная точка службы Microsoft Entra изменяется в национальных облаках. При работе со службой Azure Data Explorer, развернутой в национальном облаке, задайте соответствующую конечную точку службы Microsoft Entra национального облака.

Выполнение проверки подлинности пользователей с помощью MSAL

В следующем примере кода показано, как использовать MSAL для получения маркера авторизации для кластера. Авторизация выполняется таким образом, чтобы запустить интерактивный пользовательский интерфейс входа. Это appRedirectUri URL-адрес, на который идентификатор Microsoft Entra перенаправляется после успешной проверки подлинности. MSAL извлекает код авторизации из этого перенаправления.

var kustoUri = "https://<clusterName>.<region>.kusto.windows.net";

var authClient = PublicClientApplicationBuilder.Create("<appId>")
    .WithAuthority($"https://login.microsoftonline.com/<appTenant>")
    .WithRedirectUri("<appRedirectUri>")
    .Build();

var result = authClient.AcquireTokenInteractive(
    new[] { $"{kustoUri}/.default" } // Define scopes for accessing Azure Data Explorer cluster
).ExecuteAsync().Result;

var bearerToken = result.AccessToken;

var request = WebRequest.Create(new Uri(kustoUri));
request.Headers.Set(HttpRequestHeader.Authorization, string.Format(CultureInfo.InvariantCulture, "{0} {1}", "Bearer", bearerToken));

Примечание.

  • По возможности рекомендуется использовать клиентские библиотеки Kusto. Эти библиотеки упрощают процесс проверки подлинности, позволяя предоставлять свойства проверки подлинности в строка подключения Kusto.
  • При использовании клиентских библиотек Kusto маркеры Microsoft Entra хранятся в локальном кэше маркеров на компьютере пользователя, чтобы уменьшить количество запросов учетных данных. Файл кэша — %APPDATA%\Kusto\userTokenCache.data , к которым может получить доступ только пользователь, выполнившего вход.

Выполнение проверки подлинности приложения с помощью MSAL

В следующем примере кода показано, как использовать MSAL для получения маркера авторизации для кластера. В этом потоке запрос не отображается. Приложение должно быть зарегистрировано в идентификаторе Microsoft Entra и иметь ключ приложения или сертификат X509v2, выданный идентификатором Microsoft Entra. Сведения о настройке приложения см. в статье "Подготовка приложения Microsoft Entra".

var kustoUri = "https://<clusterName>.<region>.kusto.windows.net";

var authClient = ConfidentialClientApplicationBuilder.Create("<appId>")
    .WithAuthority($"https://login.microsoftonline.com/<appTenant>")
    .WithClientSecret("<appKey>") // Can be replaced by .WithCertificate to authenticate with an X.509 certificate
    .Build();

var result = authClient.AcquireTokenForClient(
    new[] { $"{kustoUri}/.default" } // Define scopes for accessing Azure Data Explorer cluster
).ExecuteAsync().Result;
var bearerToken = result.AccessToken;

var request = WebRequest.Create(new Uri(kustoUri));
request.Headers.Set(HttpRequestHeader.Authorization, string.Format(CultureInfo.InvariantCulture, "{0} {1}", "Bearer", bearerToken));

Примечание.

По возможности рекомендуется использовать клиентские библиотеки Kusto. Эти библиотеки упрощают процесс проверки подлинности, позволяя предоставлять свойства проверки подлинности в строка подключения Kusto.

Выполнение проверки подлинности от имени (OBO)

Проверка подлинности от имени имеет значение, если веб-приложение или служба выступает в качестве посредника между пользователем или приложением и кластером.

В этом сценарии приложение отправляет маркер доступа Microsoft Entra для произвольного ресурса. Затем приложение использует этот маркер для получения нового маркера доступа Microsoft Entra для ресурса Azure Data Explorer. Затем приложение может получить доступ к кластеру от имени субъекта, указанного исходным маркером доступа Microsoft Entra. Этот поток называется потоком проверки подлинности OAuth 2.0 от имени. Обычно для него требуется несколько шагов настройки с идентификатором Microsoft Entra, и в некоторых случаях может потребоваться специальное согласие администратора клиента Microsoft Entra.

Чтобы выполнить проверку подлинности от имени:

  1. Подготовка приложения Microsoft Entra.

  2. Установите связь доверия между приложением и кластером. Для этого выполните действия, описанные в разделе "Настройка делегированных разрешений".

  3. В коде сервера используйте MSAL для обмена маркерами.

    var kustoUri = "https://<clusterName>.<region>.kusto.windows.net";
    
    var authClient = ConfidentialClientApplicationBuilder.Create("<appId>")
        .WithAuthority($"https://login.microsoftonline.com/<appTenant>")
        .WithClientSecret("<appKey>") // Can be replaced by .WithCertificate to authenticate with an X.509 certificate
        .Build();
    
    var result = authClient.AcquireTokenOnBehalfOf(
        new[] { $"{kustoUri}/.default" }, // Define scopes for accessing your cluster
        new UserAssertion("<userAccessToken>") // Encode the "original" token that will be used for exchange
    ).ExecuteAsync().Result;
    var accessTokenForAdx = result.AccessToken;
    
  4. Используйте маркер для выполнения запросов. Например:

    var request = WebRequest.Create(new Uri(kustoUri));
    request.Headers.Set(HttpRequestHeader.Authorization, string.Format(CultureInfo.InvariantCulture, "{0} {1}", "Bearer", accessTokenForAdx));
    

Выполнение проверки подлинности одностраничного приложения (SPA)

Для проверки подлинности для веб-клиента SPA используйте поток кода авторизации OAuth.

В этом сценарии приложение перенаправляется для входа в идентификатор Microsoft Entra. Затем идентификатор Microsoft Entra перенаправляется обратно в приложение с кодом авторизации в URI. Затем приложение отправляет запрос к конечной точке маркера, чтобы получить маркер доступа. Маркер действителен в течение 24 часов, в течение которого клиент может повторно использовать его, получив маркер автоматически.

платформа удостоверений Майкрософт содержит подробные руководства по различным вариантам использования, таким как React, Angular и JavaScript.

Чтобы настроить проверку подлинности для веб-клиента, выполните приведенные действия.

  1. Подготовка приложения Microsoft Entra.

  2. Настройте приложение, как описано в MSAL.js 2.0 с потоком кода проверки подлинности.

  3. Используйте библиотеку MSAL.js 2.0 для входа пользователя и проверки подлинности в кластере. платформа удостоверений Майкрософт содержит подробные руководства по различным вариантам использования, таким как React, Angular и JavaScript.

    В следующем примере используется библиотека MSAL.js для доступа к Azure Data Explorer.

    import * as msal from "@azure/msal-browser";
    
    const msalConfig = {
      auth: {
        clientId: "<AAD client application ID>",
        authority: "https://login.microsoftonline.com/<AAD tenant ID>",
      },
    };
    
    const msalInstance = new msal.PublicClientApplication(msalConfig);
    const myAccounts = msalInstance.getAllAccounts();
    
    // If no account is logged in, redirect the user to log in.
    if (myAccounts === undefined || myAccounts.length === 0) {
      try {
        await msalInstance.loginRedirect({
          scopes: ["https://help.kusto.windows.net/.default"],
        });
      } catch (err) {
        console.error(err);
      }
    }
    const account = myAccounts[0];
    const name = account.name;
    window.document.getElementById("main").innerHTML = `Hi ${name}!`;
    
    // Get the access token required to access the specified Azure Data Explorer cluster.
    const accessTokenRequest = {
      account,
      scopes: ["https://help.kusto.windows.net/.default"],
    };
    let acquireTokenResult = undefined;
    try {
      acquireTokenResult = await msalInstance.acquireTokenSilent(accessTokenRequest);
    } catch (error) {
      if (error instanceof InteractionRequiredAuthError) {
        await msalInstance.acquireTokenRedirect(accessTokenRequest);
      }
    }
    
    const accessToken = acquireTokenResult.accessToken;
    
    // Make requests to the specified cluster with the token in the Authorization header.
    const fetchResult = await fetch("https://help.kusto.windows.net/v2/rest/query", {
      headers: {
        Authorization: `Bearer ${accessToken}`,
        "Content-Type": "application/json",
      },
      method: "POST",
      body: JSON.stringify({
        db: "Samples",
        csl: "StormEvents | count",
      }),
    });
    const jsonResult = await fetchResult.json();
    
    // The following line extracts the first cell in the result data.
    const count = jsonResult.filter((x) => x.TableKind === "PrimaryResult")[0].Rows[0][0];