Ověřování pomocí knihovny Microsoft Authentication Library (MSAL) v aplikacích

Platí pro: ✅Microsoft FabricAzure Data Explorer

Pokud chcete prostřednictvím kódu programu provést ověření v clusteru, musíte požádat o přístupový token z ID Microsoft Entra specifického pro Azure Data Explorer. Tento přístupový token funguje jako důkaz identity při vydávání požadavků na váš cluster. K vytvoření přístupového tokenu můžete použít jeden z toků knihovny MSAL (Microsoft Authentication Library).

Tento článek vysvětluje, jak používat MSAL k ověřování objektů zabezpečení ve vašem clusteru. Přímé použití knihovny MSAL k ověřování objektů zabezpečení je primárně relevantní ve webových aplikacích, které vyžadují ověřování on-behalf-of (OBO) nebo ověřování jednostránkové aplikace (SPA). V jiných případech doporučujeme používat klientské knihovny Kusto, protože zjednodušují proces ověřování.

V tomto článku se dozvíte o hlavních scénářích ověřování, informacích, které se mají poskytnout pro úspěšné ověření, a použití knihovny MSAL pro ověřování.

Scénáře ověřování

Hlavní scénáře ověřování jsou následující:

  • Ověřování uživatelů: Slouží k ověření identity lidských uživatelů.

  • Ověřování aplikací: Používá se k ověření identity aplikace, která potřebuje přístup k prostředkům bez zásahu člověka pomocí nakonfigurovaných přihlašovacích údajů.

  • Ověřování jménem uživatele (OBO): Umožňuje aplikaci vyměnit token pro danou aplikaci s tokenem pro přístup ke službě Kusto. Tento tok musí být implementován pomocí knihovny MSAL.

  • Ověřování jednostránkové aplikace (SPA): Umožňuje webovým aplikacím SPA na straně klienta přihlásit uživatele a získat tokeny pro přístup ke clusteru. Tento tok musí být implementován pomocí knihovny MSAL.

Pro ověřování uživatelů a aplikací doporučujeme používat klientské knihovny Kusto. Pro ověřování OBO a SPA není možné použít klientské knihovny Kusto.

Parametry ověřování

Během procesu získávání tokenů musí klient zadat následující parametry:

Název parametru Popis
ID zdroje ID prostředku, pro které se má vydat přístupový token Microsoft Entra. ID prostředku je identifikátor URI clusteru bez informací o portu a cesty.

Příklad: ID prostředku clusteru help je https://help.kusto.windows.net.
ID tenanta Microsoft Entra Microsoft Entra ID je víceklientová služba a každá organizace může vytvořit objekt s názvem adresář, který obsahuje objekty související se zabezpečením, jako jsou uživatelské účty a aplikace. ID Microsoft Entra často odkazuje na adresář jako tenanta. Každý tenant má ID tenanta ve formě identifikátoru GUID. V mnoha případech se k identitě tenanta Microsoft Entra může použít také název domény organizace.

Příklad: Organizace Contoso může mít ID aaaabbbb-0000-cccc-1111-dddd2222eeee tenanta a název contoso.comdomény.
Identifikátor URI autority Microsoft Entra Koncový bod používaný k ověřování. Adresář Microsoft Entra nebo tenant určuje identifikátor URI autority Microsoft Entra. Identifikátor URI je https://login.microsoftonline.com/{tenantId} místo, kde {tenantId} je BUĎ ID tenanta, nebo název domény.

Příklad: Příkladhttps://login.microsoftonline.com/aaaabbbb-0000-cccc-1111-dddd2222eeee: .

Poznámka:

Koncový bod služby Microsoft Entra se mění v národních cloudech. Při práci se službou Azure Data Explorer nasazenou v národním cloudu nastavte odpovídající koncový bod služby Microsoft Entra pro národní cloud.

Provádění ověřování uživatelů pomocí knihovny MSAL

Následující ukázka kódu ukazuje, jak pomocí MSAL získat autorizační token pro váš cluster. Autorizace se provádí způsobem, který spustí interaktivní přihlašovací uživatelské rozhraní. Jedná se appRedirectUri o adresu URL, na kterou microsoft Entra ID přesměruje po úspěšném dokončení ověřování. Nástroj MSAL extrahuje autorizační kód z tohoto přesměrování.

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

Poznámka:

  • Klientské knihovny Kusto doporučujeme používat, kdykoli je to možné. Tyto knihovny zjednodušují proces ověřování tím, že umožňují poskytovat vlastnosti ověřování v připojovací řetězec Kusto.
  • S klientskými knihovnami Kusto jsou tokeny Microsoft Entra uložené v místní mezipaměti tokenů na počítači uživatele, aby se snížil počet, kolikrát se zobrazí výzva k zadání přihlašovacích údajů. Soubor mezipaměti je %APPDATA%\Kusto\userTokenCache.data a je přístupný pouze přihlášeným uživatelem.

Provádění ověřování aplikací pomocí KNIHOVNY MSAL

Následující ukázka kódu ukazuje, jak pomocí MSAL získat autorizační token pro váš cluster. V tomto toku se nezobrazí žádná výzva. Aplikace musí být zaregistrovaná v Microsoft Entra ID a musí mít klíč aplikace nebo certifikát X509v2 vydaný id Microsoft Entra. Pokud chcete nastavit aplikaci, přečtěte si téma Zřízení aplikace 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));

Poznámka:

Klientské knihovny Kusto doporučujeme používat, kdykoli je to možné. Tyto knihovny zjednodušují proces ověřování tím, že umožňují poskytovat vlastnosti ověřování v připojovací řetězec Kusto.

Provedení ověřování jménem uživatele (OBO)

Ověřování jménem uživatele nebo aplikace je relevantní, pokud vaše webová aplikace nebo služba funguje jako mediátor mezi uživatelem nebo aplikací a vaším clusterem.

V tomto scénáři se aplikace odešle přístupový token Microsoft Entra pro libovolný prostředek. Aplikace pak tento token použije k získání nového přístupového tokenu Microsoft Entra pro prostředek Azure Data Exploreru. Aplikace pak může přistupovat k vašemu clusteru jménem objektu zabezpečení označeného původním přístupovým tokenem Microsoft Entra. Tento tok se nazývá tok ověřování OAuth 2.0 jménem. Obecně vyžaduje několik kroků konfigurace s ID Microsoft Entra a v některých případech může vyžadovat zvláštní souhlas správce tenanta Microsoft Entra.

Provedení ověřování jménem uživatele:

  1. Zřízení aplikace Microsoft Entra

  2. Vytvořte vztah důvěryhodnosti mezi aplikací a clusterem. Provedete to podle kroků v části Konfigurace delegovaných oprávnění.

  3. V kódu serveru použijte msAL k provedení výměny tokenů.

    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. Pomocí tokenu můžete spouštět dotazy. Příklad:

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

Provedení ověřování jednostránkové aplikace (SPA)

Pro ověřování webového klienta SPA použijte tok autorizačního kódu OAuth.

V tomto scénáři se aplikace přesměruje na přihlášení k MICROSOFT Entra ID. Pak se ID Microsoft Entra přesměruje zpět do aplikace s autorizačním kódem v identifikátoru URI. Potom aplikace odešle do koncového bodu tokenu žádost o získání přístupového tokenu. Token je platný po dobu 24 hodin, během kterého ho klient může znovu použít získáním tokenu bezobslužně.

Microsoft Identity Platform obsahuje podrobné kurzy pro různé případy použití, jako jsou React, Angular a JavaScript.

Nastavení ověřování pro webového klienta:

  1. Zřízení aplikace Microsoft Entra

  2. Nakonfigurujte aplikaci podle popisu v MSAL.js 2.0 s tokem ověřovacího kódu.

  3. Pomocí knihovny MSAL.js 2.0 se přihlaste uživatele a ověřte ho v clusteru. Microsoft Identity Platform obsahuje podrobné kurzy pro různé případy použití, jako jsou React, Angular a JavaScript.

    Následující příklad používá knihovnu MSAL.js pro přístup k Azure Data Exploreru.

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