Leistung in MSAL Node

Voraussetzungen

  • Weitere Informationen finden Sie unter Performance in MSAL Browser. Dort werden die Techniken beschrieben, mit denen Ihre Anwendung die Performance des Tokenabrufs mit MSAL verbessern kann.
  • Node.js

Messen der Leistung

Anwendungen, die die Leistung von Authentifizierungsflüssen in MSAL Node messen möchten, können dies manuell mithilfe der Leistungsmessungs-APIs von Node oder ähnlich tun. Nachfolgend finden Sie eine Liste mit einigen wichtigen Datenpunkten, die Sie sammeln können:

Data Bedeutung Vorschläge
authType acquireToken* API, die für die Tokenanforderung verwendet wird Wird zur Identifizierung der Verwendung verwendet.
correlationId Korrelations-ID, die für die Tokenanforderung verwendet wird. Sie können dies über die correlationId Eigenschaft in AuthenticationResult abrufen. Wird zur Identifizierung der Verwendung verwendet.
durationTotalInMs Gesamtaufwand für MSAL, einschließlich Netzwerkaufrufe und Cachezugriff Alarm bei gesamter hoher Latenz (> 1 Sekunde). Der Wert hängt von der Tokenquelle ab. Aus dem Cache: ein Cachezugriff. Aus dem Netzwerk: zwei Cachezugriffe sowie zwei HTTP-Aufrufe.
durationInCacheInMs Zeitaufwand für das Laden oder Speichern der Persistenz des Tokencaches (z. B. Redis). Alarm bei Spitzenwerten.
durationInHttpInMs Zeitaufwand für HTTP-Aufrufe an IdP (z. B. Microsoft Entra ID). Sie können einen benutzerdefinierten Netzwerkclient für eine präzisere Überwachung verwenden. Weitere Informationen finden Sie unter Konfigurations- und benutzerdefiniertes Netzwerkbeispiel Alarm bei Spitzenwerten.
tokenSource Quelle des Tokens (d. h. Cache vs Netzwerk). Sie können dies über die fromCache Eigenschaft in AuthenticationResult abrufen. Token werden wesentlich schneller aus dem Cache abgerufen (z. B. ~100 ms im Vergleich zu ~700 ms). Kann zur Überwachung der Cache-Trefferquote und zum Auslösen von Alarmen verwendet werden. Verwenden Sie zusammen mit durationTotalInMs.

Beispiel:

    const { PerformanceObserver, performance } = require('node:perf_hooks');

    const perfObserver = new PerformanceObserver((items) => {
        items.getEntries().forEach((entry) => {
            console.log(entry);
        })
    });

    perfObserver.observe({ entryTypes: ["measure"], buffered: true });

    // ...

    performance.mark("acquireTokenByClientCredential-start");

    const tokenResponse = await msalInstance.acquireTokenByClientCredential({
        scopes: ["User.Read.All"],
    });

    performance.mark("acquireTokenByClientCredential-end");

    performance.measure("acquireTokenByClientCredential", {
        start: "acquireTokenByClientCredential-start"
        end: "acquireTokenByClientCredential-end"
        detail: {
            tokenSource: tokenResponse.fromCache
            correlationId: tokenResponse.correlationId
        }
    });

Überlegungen zur Leistung für vertrauliche Clientanwendungen

Da vertrauliche Clientanwendungen in erster Linie mit serverseitigen Szenarien verwendet werden, die gleichzeitige Verarbeitung von Anforderungen umfassen, empfehlen wir, MSAL ConfidenticalClientApplication (CCA)-Instanzen auf jeden Benutzer, jede Anforderung oder Sitzung anzuwenden.

Eine neue CCA-Instanz für jede Anforderung bedeutet, dass der standardinterne Cache anfänglich keine Token oder Metadaten zum Abrufen von Token enthält. Daher sollte die von Ihnen erstellte CCA-Instanz vor der Tokenanforderung initialisiert werden, um Leistungseinbußen zu vermeiden.

import {
    ConfidentialClientApplication,
    AuthenticationResult,
    CryptoProvider,
    OnBehalfOfRequest
} from "@azure/msal-node";

function getMsalInstance(partitionKey: string): ConfidentialClientApplication {
    return new ConfidentialClientApplication({
        auth: {
            clientId: "ENTER_CLIENT_ID",
            authority: "http://login.microsoftonline.com/ENTER_TENANT_ID"
            cloudDiscoveryMetadata: "PROVIDE_STRINGIFIED_DISCOVERY_METADATA"
            authorityMetadata: "PROVIDE_STRINGIFIED_AUTHORITY_METADATA"
        },
        cache: {
            cachePlugin: new CustomCachePlugin(
                this.cacheClientWrapper,
                partitionKey
            )
        }
    });
};

async function getToken(tokenRequest: OnBehalfOfRequest): Promise<AuthenticationResult | null> {
    const partitionKey = await this.cryptoProvider.hashString(tokenRequest.oboAssertion);

    const cca = getMsalInstance(partitionKey);

    let tokenResponse = null;

    try {
        await cca.getTokenCache().getAllAccounts(); // required for cache read
        tokenResponse = await cca.acquireTokenOnBehalfOf(tokenRequest);
    } catch (error) {
        throw error;
    }

    return tokenResponse;
};

Weitere Informationen finden Sie unter (CCA) Web-API mit einem benutzerdefinierten verteilten Cache-Plug-In .

Siehe auch