Teilen über


Lernprogramm: Authentifizierungsablauf ausgehend von App Service über Backend-API zu Microsoft Graph

Erfahren Sie, wie Sie einen Back-End-App-Dienst erstellen und konfigurieren, um die Benutzeranmeldeinformationen einer Front-End-App zu akzeptieren und diese Anmeldeinformationen für einen nachgeschalteten Azure-Dienst auszutauschen. Dadurch kann sich ein Benutzer bei einem Frontend-App-Dienst anmelden, seine Anmeldeinformationen an einen Back-End-App-Dienst übergeben und dann auf einen Azure-Dienst mit derselben Identität zugreifen.

In diesem Tutorial lernen Sie Folgendes:

  • Konfigurieren der Back-End-Authentifizierungs-App, um ein Token bereitzustellen, das für den nachgeschalteten Azure-Dienst vorgesehen ist
  • Verwenden Sie JavaScript-Code, um das Zugriffstoken des angemeldeten Benutzers für ein neues Token für den downstream-Dienst auszutauschen.
  • Verwenden Sie JavaScript-Code, um auf nachgeschalteten Dienst zuzugreifen.

Voraussetzungen

Schließen Sie das vorherige Lernprogramm ab, greifen Sie auf Microsoft Graph von einer gesicherten JavaScript-App als Benutzer zu, bevor Sie dieses Lernprogramm starten, die Ressourcen aber nicht am Ende des Lernprogramms entfernen. In diesem Lernprogramm wird davon ausgegangen, dass Sie über die beiden App-Dienste und die entsprechenden Authentifizierungs-Apps verfügen.

Im vorherigen Lernprogramm wurde die Azure Cloud Shell als Shell für die Azure CLI verwendet. Dieses Tutorial führt diese Nutzung fort.

Architektur

Das Lernprogramm zeigt, wie Sie die benutzeranmeldeinformationen, die von der Frontend-App bereitgestellt werden, an die Back-End-App übergeben und dann an einen Azure-Dienst weiter. In diesem Tutorial ist Microsoft Graph der Downstreamdienst. Die Anmeldeinformationen des Benutzers werden verwendet, um sein Profil aus Microsoft Graph abzurufen.

Architekturbild einer App Service-Instanz, die sich im Auftrag von angemeldeten Benutzenden mit einer weiteren App Service-Instanz verbindet, um eine Verbindung zu Microsoft Graph herzustellen.

Authentifizierungsfluss für einen Benutzer zum Abrufen von Microsoft Graph-Informationen in dieser Architektur:

Vorheriges Lernprogramm behandelt:

  1. Melden Sie sich bei einem Front-End-App-Dienst an, der für die Verwendung von Active Directory als Identitätsanbieter konfiguriert ist.
  2. Der Frontend-App-Dienst übergibt das Token des Benutzers an den Back-End-App-Dienst.
  3. Die Back-End-App ist gesichert, damit das Frontend eine API-Anforderung erstellen kann. Das Zugriffstoken des Benutzers verfügt über eine Zielgruppe für die Back-End-API und den Gültigkeitsbereich von user_impersonation.
  4. Die Back-End-App-Registrierung verfügt bereits über Microsoft Graph mit dem Bereich User.Read. Dies wird standardmäßig allen App-Registrierungen hinzugefügt.
  5. Am Ende des vorherigen Lernprogramms wurde ein gefälschtes Profil an die Frontend-App zurückgegeben, da Graph nicht verbunden war.

Dieses Lernprogramm erweitert die Architektur:

  1. Erteilen Sie der Administratorzustimmung, um den Benutzerzustimmungsbildschirm für die Back-End-App zu umgehen.
  2. Ändern Sie den Anwendungscode, um das von der Front-End-App gesendete Zugriffstoken in ein Zugriffstoken mit der erforderlichen Berechtigung für Microsoft Graph zu konvertieren.
  3. Stellen Sie Code bereit, damit die Back-End-App ein Token gegen ein neues Token mit dem Bereich des Azure-Downstreamdiensts, wie z. B. Microsoft Graph, austauscht.
  4. Stellen Sie Code bereit, damit eine Back-End-App ein neues Token verwendet, um als aktueller authentifizierter Benutzer auf den nachgeschalteten Dienst zuzugreifen.
  5. Stellen Sie die Back-End-App mit az webapp up.
  6. Am Ende dieses Lernprogramms wird ein echtes Profil an die Frontend-App zurückgegeben, da Graph verbunden ist.

Dieses Lernprogramm funktioniert nicht:

  • Ändern Sie die Frontend-App von dem vorherigen Tutorial.
  • Ändern Sie die Bereichsberechtigung der Backend-Authentifizierungs-App, da User.Read standardmäßig allen Authentifizierungs-Apps hinzugefügt wird.

Wenn sich der Benutzer im vorherigen Lernprogramm bei der Front-End-App angemeldet hat, wird ein Popup angezeigt, in dem nach Zustimmung des Benutzers gefragt wird.

In dieser Anleitung muss die Back-End-App, um Benutzerprofile aus Microsoft Graph zu lesen, das Zugriffstoken des angemeldeten Benutzers gegen ein neues Zugriffstoken mit den erforderlichen Berechtigungen für Microsoft Graph eintauschen. Da der Benutzer nicht direkt mit der Back-End-App verbunden ist, kann er nicht interaktiv auf den Zustimmungsbildschirm zugreifen. Sie müssen dies lösen, indem Sie die Registrierung der Back-End-App in Microsoft Entra ID konfigurieren, um Administratorzustimmung zu erteilen. Dies ist eine Einstellungsänderung, die normalerweise von einem Active Directory-Administrator vorgenommen wird.

  1. Öffnen Sie das Azure-Portal, und suchen Sie nach Ihrer Recherche für den Back-End App Service.

  2. Suchen Sie den Abschnitt "Einstellungen –> Authentifizierung" .

  3. Wählen Sie den Identitätsanbieter aus, um zur Authentifizierungs-App zu wechseln.

  4. Wählen Sie in der Authentifizierungs-App "Verwalten –> API-Berechtigungen" aus.

  5. Wählen Sie "Administratorzustimmung für Standardverzeichnis erteilen" aus.

    Screenshot der Azure-Portalauthentifizierungs-App mit hervorgehobener Schaltfläche

  6. Wählen Sie im Popupfenster "Ja " aus, um die Zustimmung zu bestätigen.

  7. Überprüfen Sie, ob in der Spalte Status der Eintrag Für Standardverzeichnis gewährt steht. Mit dieser Einstellung muss die Back-End-Anwendung dem angemeldeten Benutzer keinen Zustimmungsbildschirm mehr anzeigen und kann direkt ein Zugriffstoken anfordern. Der angemeldete Benutzer hat Zugriff auf die User.Read Bereichseinstellung, da dies der Standardbereich ist, mit dem die App-Registrierung erstellt wird.

    Screenshot der Azure-Portalauthentifizierungs-App mit Administratorzustimmung in der Statusspalte.

2. Installieren von npm-Paketen

Im vorherigen Lernprogramm hat die Back-End-App keine npm-Pakete für die Authentifizierung benötigt, da die einzige Authentifizierung durch Konfigurieren des Identitätsanbieters im Azure-Portal bereitgestellt wurde. In diesem Tutorial muss das Zugriffstoken des angemeldeten Benutzers für die Back-End-API gegen ein Zugriffstoken mit Microsoft Graph in seinem Geltungsbereich ausgetauscht werden. Dieser Austausch wird mit zwei Bibliotheken abgeschlossen, da er die App-Service-Authentifizierung nicht mehr verwendet, sondern direkt Microsoft Entra ID und MSAL.js nutzt.

  1. Öffnen Sie die Azure Cloud Shell, und wechseln Sie in die Back-End-App des Beispielverzeichnisses:

    cd js-e2e-web-app-easy-auth-app-to-app/backend
    
  2. Installieren Sie das Azure MSAL npm-Paket:

    npm install @azure/msal-node
    
  3. Installieren Sie das Npm-Paket von Microsoft Graph:

    npm install @microsoft/microsoft-graph-client
    

3. Hinzufügen von Code zum Austauschen des aktuellen Tokens für das Microsoft Graph-Token

Der Quellcode zum Ausführen dieses Schritts wird für Sie bereitgestellt. Führen Sie die folgenden Schritte aus, um sie einzuschließen.

  1. Öffnen Sie die Datei ./src/server.js.

  2. Heben Sie die Auskommentierung der folgenden Abhängigkeit am Anfang der Datei auf:

    import { getGraphProfile } from './with-graph/graph';
    
  3. Entkommentieren Sie in derselben Datei die Variable graphProfile.

    let graphProfile={};
    
  4. Heben Sie in derselben Datei die Auskommentierung der folgenden getGraphProfile-Zeilen in der get-profile-Route auf, um das Profil von Microsoft Graph zu erhalten:

    // where did the profile come from
    profileFromGraph=true;
    
    // get the profile from Microsoft Graph
    graphProfile = await getGraphProfile(accessToken);
    
    // log the profile for debugging
    console.log(`profile: ${JSON.stringify(graphProfile)}`);
    
  5. Speichern Sie die Änderungen: STRG + S.

  6. Erneutes Bereitstellen der Back-End-App:

    az webapp up --resource-group myAuthResourceGroup --name <back-end-app-name> 
    
    

4. Überprüfen von Back-End-Code zum Austauschen des Back-End-API-Tokens für das Microsoft Graph-Token

Um das Back-End-API-Zielgruppentoken gegen ein Microsoft Graph-Token auszutauschen, muss die Back-End-App die Mandanten-ID finden und diese als Teil des „MSAL.js“-Konfigurationsobjekts verwenden. Da die Backend-App mit Microsoft als Identitätsanbieter konfiguriert wurde, sind die Mandanten-ID und mehrere andere erforderliche Werte bereits in den App-Service-App-Einstellungen enthalten.

Der folgende Code wird bereits für Sie in der Beispiel-App bereitgestellt. Sie müssen verstehen, warum es da ist und wie es funktioniert, damit Sie diese Arbeit auf andere Apps anwenden können, die Sie erstellen, die dieselbe Funktionalität benötigen.

Untersuchen des Codes zum Abrufen der Mandanten-ID

  1. Öffnen Sie die Datei ./backend/src/with-graph/auth.js.

  2. Überprüfen Sie die getTenantId() Funktion.

    export function getTenantId() {
    
        const openIdIssuer = process.env.WEBSITE_AUTH_OPENID_ISSUER;
        const backendAppTenantId = openIdIssuer.replace(/https:\/\/sts\.windows\.net\/(.{1,36})\/v2\.0/gm, '$1');
    
        return backendAppTenantId;
    }
    
  3. Diese Funktion ruft die aktuelle Mandanten-ID aus der WEBSITE_AUTH_OPENID_ISSUER Umgebungsvariable ab. Die ID wird mit einem regulären Ausdruck aus der Variablen analysiert.

Code inspizieren, um Graph-Token mithilfe von MSAL.js abzurufen

  1. Überprüfen Sie in der weiterhin geöffneten ./backend/src/with-graph/auth.js-Datei die Funktion getGraphToken().

  2. Erstellen Sie das MSAL.js Konfigurationsobjekt, verwenden Sie die MSAL-Konfiguration, um die clientCredentialAuthority zu erstellen. Konfigurieren Sie die „Im Auftrag von“-Anforderung. Verwenden Sie dann das acquireTokenOnBehalfOf, um das Back-End-API-Zugriffstoken für ein Graph-Zugriffstoken auszutauschen.

    // ./backend/src/auth.js
    // Exchange current bearerToken for Graph API token
    // Env vars were set by App Service
    export async function getGraphToken(backEndAccessToken) {
    
        const config = {
            // MSAL configuration
            auth: {
                // the backend's authentication CLIENT ID 
                clientId: process.env.WEBSITE_AUTH_CLIENT_ID,
                // the backend's authentication CLIENT SECRET 
                clientSecret: process.env.MICROSOFT_PROVIDER_AUTHENTICATION_SECRET,
                // OAuth 2.0 authorization endpoint (v2)
                // should be: https://login.microsoftonline.com/BACKEND-TENANT-ID
                authority: `https://login.microsoftonline.com/${getTenantId()}`
            },
            // used for debugging
            system: {
                loggerOptions: {
                    loggerCallback(loglevel, message, containsPii) {
                        console.log(message);
                    },
                    piiLoggingEnabled: true,
                    logLevel: MSAL.LogLevel.Verbose,
                }
            }
        };
    
        const clientCredentialAuthority = new MSAL.ConfidentialClientApplication(config);
    
        const oboRequest = {
            oboAssertion: backEndAccessToken,
            // this scope must already exist on the backend authentication app registration 
            // and visible in resources.azure.com backend app auth config
            scopes: ["https://graph.microsoft.com/.default"]
        }
    
        // This example has App service validate token in runtime
        // from headers that can't be set externally
    
        // If you aren't using App service's authentication, 
        // you must validate your access token yourself
        // before calling this code
        try {
            const { accessToken } = await clientCredentialAuthority.acquireTokenOnBehalfOf(oboRequest);
            return accessToken;
        } catch (error) {
            console.log(`getGraphToken:error.type = ${error.type}  ${error.message}`);
        }
    }
    

5. Überprüfen des Back-End-Codes für den Zugriff auf Microsoft Graph mit dem neuen Token

Um auf Microsoft Graph als Benutzer zuzugreifen, der bei der Front-End-Anwendung angemeldet ist, umfassen die Änderungen:

  • Konfiguration der Active Directory-App-Registrierung mit einer API-Berechtigung für den Downstreamdienst, also Microsoft Graph, mit dem erforderlichen Bereich User.Read.
  • Erteilen Sie der Administratorzustimmung, um den Benutzerzustimmungsbildschirm für die Back-End-App zu umgehen.
  • Ändern Sie den Anwendungscode, um das von der Front-End-App gesendete Zugriffstoken in ein Zugriffstoken mit der erforderlichen Berechtigung für den downstream-Dienst, Microsoft Graph, zu konvertieren.

Nachdem der Code nun über das richtige Token für Microsoft Graph verfügt, verwenden Sie ihn, um einen Client für Microsoft Graph zu erstellen und dann das Profil des Benutzers abzurufen.

  1. Öffne ./backend/src/graph.js

  2. Rufen Sie zuerst in der getGraphProfile()-Funktion das Token, dann den authentifizierten Client aus dem Token, und schließlich das Profil ab.

    // 
    import graph from "@microsoft/microsoft-graph-client";
    import { getGraphToken } from "./auth.js";
    
    // Create client from token with Graph API scope
    export function getAuthenticatedClient(accessToken) {
        const client = graph.Client.init({
            authProvider: (done) => {
                done(null, accessToken);
            }
        });
    
        return client;
    }
    export async function getGraphProfile(accessToken) {
        // exchange current backend token for token with 
        // graph api scope
        const graphToken = await getGraphToken(accessToken);
    
        // use graph token to get Graph client
        const graphClient = getAuthenticatedClient(graphToken);
    
        // get profile of user
        const profile = await graphClient
            .api('/me')
            .get();
    
        return profile;
    }
    

6. Testen Sie Ihre Änderungen

  1. Verwenden Sie die Front-End-Website in einem Browser. Möglicherweise müssen Sie Ihr Token aktualisieren, wenn es abgelaufen ist.

  2. Wählen Sie Get user's profileaus. Dadurch wird Ihre Authentifizierung im Bearertoken an das Back-End übergeben.

  3. Das Back-End antwortet mit dem echten Microsoft Graph-Profil für Ihr Konto.

    Screenshot des Webbrowsers mit Front-End-Anwendung nach dem erfolgreichen Abrufen eines echten Profils aus der Back-End-App.

7. Bereinigen

In den vorherigen Schritten haben Sie Azure-Ressourcen in einer Ressourcengruppe erstellt.

  1. Löschen Sie die Ressourcengruppe, indem Sie den folgenden Befehl in Cloud Shell ausführen. Die Ausführung dieses Befehls kann eine Minute in Anspruch nehmen.

    az group delete --name myAuthResourceGroup
    
  2. Verwenden Sie die Client-ID der Authentifizierungs-Apps, die Sie zuvor in den Abschnitten Enable authentication and authorization für die Back-End- und Front-End-Apps gefunden und notiert haben.

  3. Löschen Sie App-Registrierungen für Front-End- und Back-End-Apps.

    # delete app - do this for both frontend and backend client ids
    az ad app delete <client-id>
    

Häufig gestellte Fragen

Ich habe einen Fehler 80049217, was bedeutet es?

Dieser Fehler bedeutet, dass der Back-End-App-Dienst nicht autorisiert ist, CompactToken parsing failed with error code: 80049217das Microsoft Graph-Token zurückzugeben. Dieser Fehler wird dadurch verursacht, dass in der App-Registrierung die Berechtigung User.Read fehlt.

Ich habe einen Fehler AADSTS65001, was bedeutet es?

Dieser Fehler bedeutet, AADSTS65001: The user or administrator has not consented to use the application with ID \<backend-authentication-id>. Send an interactive authorization request for this user and resourcedass die Back-End-Authentifizierungs-App nicht für die Administratorzustimmung konfiguriert wurde. Da der Fehler im Protokoll für die Back-End-App angezeigt wird, kann die Frontend-Anwendung dem Benutzer nicht mitteilen, warum das Profil nicht in der Frontend-App angezeigt wurde.

Wie kann ich eine Verbindung mit einem anderen nachgeschalteten Azure-Dienst als Benutzer herstellen?

In diesem Lernprogramm wird eine API-App veranschaulicht, die bei Microsoft Graph authentifiziert wurde. Die gleichen allgemeinen Schritte können jedoch angewendet werden, um im Auftrag des Benutzers auf einen beliebigen Azure-Dienst zuzugreifen.

  1. Keine Änderung an der Front-End-Anwendung. Nur Änderungen an der Authentifizierungs-App-Registrierung und des Back-End-App-Quellcodes.
  2. Tauschen Sie das auf die Backend-API beschränkte Benutzertoken gegen ein Token für den Downstream-Dienst, auf den Sie zugreifen möchten, aus.
  3. Verwenden Sie das Token im SDK des nachgeschalteten Diensts, um den Client zu erstellen.
  4. Verwenden Sie den nachgeschalteten Client, um auf Dienstfunktionen zuzugreifen.

Nächste Schritte