Dela via


Autentisera med Microsoft Authentication Library (MSAL) i appar

Om du vill autentisera programmässigt med klustret måste du begära en åtkomsttoken från Microsoft Entra-ID som är specifikt för Azure Data Explorer. Den här åtkomsttoken fungerar som identitetsbevis när du skickar begäranden till klustret. Du kan använda något av MSAL-flödena (Microsoft Authentication Library) för att skapa en åtkomsttoken.

Den här artikeln beskriver hur du använder MSAL för att autentisera huvudkonton till klustret. Direkt användning av MSAL för att autentisera huvudkonton är främst relevant i webbprogram som kräver OBO-autentisering (On-behalf-of) eller autentisering med ensidesprogram (SPA). I andra fall rekommenderar vi att du använder Kusto-klientbiblioteken eftersom de förenklar autentiseringsprocessen.

I den här artikeln får du lära dig mer om de viktigaste autentiseringsscenarierna, den information som ska tillhandahållas för lyckad autentisering och användningen av MSAL för autentisering.

Autentiseringsscenarier

De viktigaste autentiseringsscenarierna är följande:

  • Användarautentisering: Används för att verifiera identiteten för mänskliga användare.

  • Programautentisering: Används för att verifiera identiteten för ett program som behöver åtkomst till resurser utan mänsklig inblandning med hjälp av konfigurerade autentiseringsuppgifter.

  • OBO-autentisering (On-behalf-of): Tillåter att ett program utbyter en token för det programmet med en token för att få åtkomst till en Kusto-tjänst. Det här flödet måste implementeras med MSAL.

  • Spa-autentisering (Single Page Application): Tillåter att SPA-webbprogram på klientsidan loggar in användare och hämtar token för att få åtkomst till klustret. Det här flödet måste implementeras med MSAL.

För användar- och programautentisering rekommenderar vi att du använder Kusto-klientbiblioteken. Kusto-klientbiblioteken kan inte användas för OBO- och SPA-autentisering.

Autentiseringsparametrar

Under tokenhämtningsprocessen måste klienten ange följande parametrar:

Parameternamn Beskrivning
Resurs-ID Resurs-ID:t som Microsoft Entra åtkomsttoken ska utfärdas för. Resurs-ID:t är klustrets URI utan portinformation och sökväg.

Exempel: Resurs-ID:t help för klustret är https://help.kusto.windows.net.
Microsoft Entra klientorganisations-ID Microsoft Entra-ID är en tjänst för flera innehavare och varje organisation kan skapa ett objekt som kallas en katalog som innehåller säkerhetsrelaterade objekt som användarkonton och program. Microsoft Entra-ID refererar ofta till katalogen som en klientorganisation. Varje klientorganisation har ett klientorganisations-ID i form av ett GUID. I många fall kan organisationens domännamn också användas för att identifiera Microsoft Entra klientorganisationen.

Exempel: En organisation "Contoso" kan ha klientorganisations-ID 12345678-a123-4567-b890-123a456b789c :t och domännamnet contoso.com.
Microsoft Entra utfärdar-URI Slutpunkten som används för autentisering. Den Microsoft Entra katalogen, eller klientorganisationen, avgör Microsoft Entra utfärdarens URI. URI:n är https://login.microsoftonline.com/{tenantId} antingen klientorganisations-ID {tenantId} :t eller domännamnet.

Exempel: Till exempel https://login.microsoftonline.com/12345678-a123-4567-b890-123a456b789c.

Anteckning

Den Microsoft Entra tjänstslutpunkten ändras i nationella moln. När du arbetar med en Azure Data Explorer-tjänst som distribuerats i ett nationellt moln anger du motsvarande nationella moln Microsoft Entra tjänstslutpunkt.

Utföra användarautentisering med MSAL

Följande kodexempel visar hur du använder MSAL för att hämta en auktoriseringstoken för klustret. Auktoriseringen görs på ett sätt som startar det interaktiva inloggningsgränssnittet. appRedirectUri är den URL som Microsoft Entra ID omdirigeras till när autentiseringen har slutförts. MSAL extraherar auktoriseringskoden från den här omdirigeringen.

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

Anteckning

  • Vi rekommenderar att du använder Kusto-klientbiblioteken när det är möjligt. Dessa bibliotek förenklar autentiseringsprocessen genom att du kan ange autentiseringsegenskaper i Kusto-anslutningssträng.
  • Med Kusto-klientbiblioteken lagras Microsoft Entra token i en lokal tokencache på användarens dator för att minska antalet gånger som de uppmanas att ange autentiseringsuppgifter. Cachefilen är %APPDATA%\Kusto\userTokenCache.data och kan endast nås av den inloggade användaren.

Utföra programautentisering med MSAL

Följande kodexempel visar hur du använder MSAL för att hämta en auktoriseringstoken för klustret. I det här flödet visas ingen uppmaning. Programmet måste vara registrerat med Microsoft Entra-ID och ha en appnyckel eller ett X509v2-certifikat utfärdat av Microsoft Entra-ID. Information om hur du konfigurerar ett program finns i Etablera ett Microsoft Entra program.

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

Anteckning

Vi rekommenderar att du använder Kusto-klientbiblioteken när det är möjligt. Dessa bibliotek förenklar autentiseringsprocessen genom att du kan ange autentiseringsegenskaper i Kusto-anslutningssträng.

Utföra OBO-autentisering (On-behalf-of)

Autentisering för räkning är relevant när ditt webbprogram eller din tjänst fungerar som en medlare mellan användaren eller programmet och klustret.

I det här scenariot skickas ett program en Microsoft Entra åtkomsttoken för en godtycklig resurs. Sedan använder programmet denna token för att hämta en ny Microsoft Entra åtkomsttoken för Azure Data Explorer-resursen. Sedan kan programmet komma åt klustret för det huvudkonto som anges av den ursprungliga Microsoft Entra åtkomsttoken. Det här flödet kallas OAuth 2.0 för autentiseringsflödet. Det kräver vanligtvis flera konfigurationssteg med Microsoft Entra-ID och kan i vissa fall kräva särskilt medgivande från administratören för Microsoft Entra klientorganisationen.

Så här utför du autentisering för räkning:

  1. Etablera ett Microsoft Entra program.

  2. Upprätta en förtroenderelation mellan programmet och klustret. Det gör du genom att följa stegen i Konfigurera delegerade behörigheter.

  3. Använd MSAL i serverkoden för att utföra tokenutbytet.

    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. Använd token för att köra frågor. Exempel:

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

Utföra spa-autentisering (Single Page Application)

För autentisering för en SPA-webbklient använder du OAuth-auktoriseringskodflödet.

I det här scenariot omdirigeras appen för att logga in på Microsoft Entra-ID. Sedan omdirigeras Microsoft Entra-ID tillbaka till appen med en auktoriseringskod i URI:n. Sedan skickar appen en begäran till tokenslutpunkten för att hämta åtkomsttoken. Token är giltig i 24 timmar under vilken klienten kan återanvända den genom att hämta token tyst.

Microsofts identitetsplattform har detaljerade självstudier för olika användningsfall, till exempel React, Angular och JavaScript.

Så här konfigurerar du autentisering för en webbklient:

  1. Etablera ett Microsoft Entra program.

  2. Konfigurera appen enligt beskrivningen i MSAL.js 2.0 med autentiseringskodflöde.

  3. Använd MSAL.js 2.0-biblioteket för att logga in en användare och autentisera till klustret. Microsofts identitetsplattform har detaljerade självstudier för olika användningsfall, till exempel React, Angular och JavaScript.

    I följande exempel används MSAL.js-biblioteket för att få åtkomst till 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];