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

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

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

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

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

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

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

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

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

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

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

Пример. Организация "Contoso" может иметь идентификатор 12345678-a123-4567-b890-123a456b789c клиента и доменное имя contoso.com.
URI центра Microsoft Entra Конечная точка, используемая для проверки подлинности. Каталог Microsoft Entra или клиент определяет универсальный код ресурса (URI) центра Microsoft Entra. URI — это https://login.microsoftonline.com/{tenantId}{tenantId} идентификатор клиента или доменное имя.

Пример: например, https://login.microsoftonline.com/12345678-a123-4567-b890-123a456b789c.

Примечание

Изменения конечной точки службы 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.

Выполнение проверки подлинности on-behalf-of (OBO)

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

В этом сценарии приложению отправляется маркер доступа Microsoft Entra для произвольного ресурса. Затем приложение использует этот маркер для получения нового маркера доступа Microsoft Entra для ресурса azure Data Explorer. Затем приложение сможет получить доступ к кластеру от имени субъекта, указанного в исходном маркере доступа Microsoft Entra. Этот поток называется потоком проверки подлинности OAuth 2.0 on-behalf-of. Обычно требуется несколько действий по настройке с идентификатором 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 id. Затем 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 для доступа к Data Explorer Azure.

    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];