Condividi tramite


Come eseguire l'autenticazione con Microsoft Authentication Library (MSAL) nelle app

Si applica a: ✅Microsoft FabricAzure Esplora dati

Per eseguire l'autenticazione a livello di codice con il cluster, è necessario richiedere un token di accesso da Microsoft Entra ID specifico per Azure Esplora dati. Questo token di accesso funge da prova di identità quando si emettono richieste al cluster. È possibile usare uno dei flussi di Microsoft Authentication Library (MSAL) per creare un token di accesso.

Questo articolo illustra come usare MSAL per autenticare le entità nel cluster. L'uso diretto di MSAL per autenticare le entità è rilevante principalmente nelle applicazioni Web che richiedono l'autenticazione OBO (On-behalf-of) o l'autenticazione a pagina singola. Per altri casi, è consigliabile usare le librerie client Kusto in quanto semplificano il processo di autenticazione.

In questo articolo vengono illustrati gli scenari di autenticazione principali, le informazioni da fornire per l'autenticazione corretta e l'uso di MSAL per l'autenticazione.

Scenari di autenticazione

I principali scenari di autenticazione sono i seguenti:

  • Autenticazione utente: usata per verificare l'identità degli utenti umani.

  • Autenticazione dell'applicazione: usata per verificare l'identità di un'applicazione che deve accedere alle risorse senza intervento umano usando credenziali configurate.

  • Autenticazione OBO (On-behalf-of): consente a un'applicazione di scambiare un token per tale applicazione con un token per accedere a un servizio Kusto. Questo flusso deve essere implementato con MSAL.

  • Autenticazione a pagina singola dell'applicazione (SPA): consente alle applicazioni Web SPA lato client di accedere agli utenti e ottenere token per accedere al cluster. Questo flusso deve essere implementato con MSAL.

Per l'autenticazione dell'utente e dell'applicazione, è consigliabile usare le librerie client Kusto. Per l'autenticazione OBO e SPA, le librerie client Kusto non possono essere usate.

Parametri di autenticazione

Durante il processo di acquisizione del token, il client deve fornire i parametri seguenti:

Nome parametro Descrizione
ID risorsa ID risorsa per il quale rilasciare il token di accesso Microsoft Entra. L'ID risorsa è l'URI del cluster senza informazioni sulla porta e il percorso.

Esempio: l'ID risorsa per il help cluster è https://help.kusto.windows.net.
Microsoft Entra tenant ID Microsoft Entra ID è un servizio multi-tenant e ogni organizzazione può creare un oggetto denominato directory che contiene oggetti correlati alla sicurezza, ad esempio account utente e applicazioni. Microsoft Entra ID spesso fa riferimento alla directory come tenant. Ogni tenant ha un ID tenant sotto forma di GUID. In molti casi, il nome di dominio dell'organizzazione potrebbe anche essere usato per identificare il tenant di Microsoft Entra.

Esempio: un'organizzazione "Contoso" potrebbe avere l'ID aaaabbbb-0000-cccc-1111-dddd2222eeee tenant e il nome contoso.comdi dominio .
URI autorità Microsoft Entra Endpoint usato per l'autenticazione. La directory o il tenant di Microsoft Entra determina l'URI dell'autorità di Microsoft Entra. L'URI è https://login.microsoftonline.com/{tenantId} dove {tenantId} è l'ID tenant o il nome di dominio.

Esempio: ad esempio . https://login.microsoftonline.com/aaaabbbb-0000-cccc-1111-dddd2222eeee

Nota

L'endpoint del servizio Microsoft Entra cambia nei cloud nazionali. Quando si lavora con un servizio azure Esplora dati distribuito in un cloud nazionale, impostare l'endpoint del servizio Microsoft Entra del cloud nazionale corrispondente.

Eseguire l'autenticazione utente con MSAL

L'esempio di codice seguente illustra come usare MSAL per ottenere un token di autorizzazione per il cluster. L'autorizzazione viene eseguita in modo da avviare l'interfaccia utente di accesso interattiva. appRedirectUri è l'URL a cui l'ID Entra Microsoft reindirizza dopo il completamento dell'autenticazione. MSAL estrae il codice di autorizzazione da questo reindirizzamento.

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

Nota

  • È consigliabile usare le librerie client Kusto quando possibile. Queste librerie semplificano il processo di autenticazione consentendo di fornire proprietà di autenticazione nel stringa di connessione Kusto.
  • Con le librerie client Kusto, i token Microsoft Entra vengono archiviati in una cache di token locale nel computer dell'utente per ridurre il numero di volte in cui vengono richieste le credenziali. Il file della cache è %APPDATA%\Kusto\userTokenCache.data ed è accessibile solo dall'utente connesso.

Eseguire l'autenticazione dell'applicazione con MSAL

L'esempio di codice seguente illustra come usare MSAL per ottenere un token di autorizzazione per il cluster. In questo flusso non viene visualizzata alcuna richiesta. L'applicazione deve essere registrata con Microsoft Entra ID e avere una chiave dell'app o un certificato X509v2 rilasciato dall'ID Microsoft Entra. Per configurare un'applicazione, vedere Effettuare il provisioning di un'applicazione 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));

Nota

È consigliabile usare le librerie client Kusto quando possibile. Queste librerie semplificano il processo di autenticazione consentendo di fornire proprietà di autenticazione nel stringa di connessione Kusto.

Eseguire l'autenticazione on-behalf-of (OBO)

L'autenticazione per conto dell'utente è rilevante quando l'applicazione Web o il servizio funge da mediatore tra l'utente o l'applicazione e il cluster.

In questo scenario, un'applicazione viene inviata a un token di accesso Microsoft Entra per una risorsa arbitraria. L'applicazione usa quindi tale token per acquisire un nuovo token di accesso Microsoft Entra per la risorsa di Azure Esplora dati. L'applicazione può quindi accedere al cluster per conto dell'entità indicata dal token di accesso Microsoft Entra originale. Questo flusso viene chiamato flusso di autenticazione on-behalf-of di OAuth 2.0. In genere richiede più passaggi di configurazione con l'ID Microsoft Entra e in alcuni casi potrebbe richiedere un consenso speciale dall'amministratore del tenant di Microsoft Entra.

Per eseguire l'autenticazione on-behalf-of:

  1. Effettuare il provisioning di un'applicazione Microsoft Entra.

  2. Stabilire una relazione di trust tra l'applicazione e il cluster. A tale scopo, seguire la procedura descritta in Configurare le autorizzazioni delegate.

  3. Nel codice del server usare MSAL per eseguire lo scambio di 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. Usare il token per eseguire query. Ad esempio:

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

Eseguire l'autenticazione dell'applicazione a pagina singola

Per l'autenticazione per un client Web spa, usare il flusso del codice di autorizzazione OAuth.

In questo scenario, l'app viene reindirizzata per accedere a Microsoft Entra ID. Quindi, Microsoft Entra ID reindirizza all'app con un codice di autorizzazione nell'URI. L'app effettua quindi una richiesta all'endpoint del token per ottenere il token di accesso. Il token è valido per 24 ore durante il quale il client può riutilizzarlo acquisendo automaticamente il token.

Microsoft Identity Platform include esercitazioni dettagliate per diversi casi d'uso, ad esempio React, Angular e JavaScript.

Per configurare l'autenticazione per un client Web:

  1. Effettuare il provisioning di un'applicazione Microsoft Entra.

  2. Configurare l'app come descritto in MSAL.js 2.0 con il flusso del codice di autenticazione.

  3. Usare la libreria MSAL.js 2.0 per accedere a un utente ed eseguire l'autenticazione nel cluster. Microsoft Identity Platform include esercitazioni dettagliate per diversi casi d'uso, ad esempio React, Angular e JavaScript.

    L'esempio seguente usa la libreria di MSAL.js per accedere ad Azure Esplora dati.

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