JavaScript-apps verifiëren bij Azure-services tijdens lokale ontwikkeling met behulp van service-principals

Wanneer u cloudtoepassingen maakt, moeten ontwikkelaars fouten opsporen en toepassingen testen op hun lokale werkstation. Wanneer een toepassing wordt uitgevoerd op het werkstation van een ontwikkelaar tijdens de lokale ontwikkeling, moet deze nog steeds worden geverifieerd bij alle Azure-services die door de app worden gebruikt. In dit artikel wordt beschreven hoe u service-principalobjecten voor toegewezen toepassingen instelt die moeten worden gebruikt tijdens lokale ontwikkeling.

Een diagram waarin wordt getoond hoe een JavaScript-app tijdens lokale ontwikkeling de referenties van de ontwikkelaar gebruikt om verbinding te maken met Azure door deze referenties lokaal geïnstalleerde ontwikkelhulpprogramma's te verkrijgen.

Met speciale toepassingsservice-principals voor lokale ontwikkeling kunt u het principe van minimale bevoegdheden tijdens het ontwikkelen van apps volgen. Omdat machtigingen zijn afgestemd op precies wat er nodig is voor de app tijdens de ontwikkeling, wordt voorkomen dat app-code per ongeluk toegang krijgt tot een Azure-resource die is bedoeld voor gebruik door een andere app. Met deze methode voorkomt u ook dat er fouten optreden wanneer de app naar productie wordt verplaatst omdat de app te veel is gemachtigd in de ontwikkelomgeving.

Een toepassingsservice-principal wordt ingesteld voor de app wanneer de app is geregistreerd in Azure. Bij het registreren van apps voor lokale ontwikkeling is het raadzaam het volgende te doen:

  • Maak afzonderlijke app-registraties voor elke ontwikkelaar die aan de app werkt. Met deze methode maakt u afzonderlijke toepassingsservice-principals voor elke ontwikkelaar die moet worden gebruikt tijdens lokale ontwikkeling en voorkomt u dat ontwikkelaars referenties voor één toepassingsservice-principal moeten delen.
  • Afzonderlijke app-registraties per app maken. Hiermee worden de machtigingen van de app alleen bereikt voor wat de app nodig heeft.

Tijdens lokale ontwikkeling worden omgevingsvariabelen ingesteld met de identiteit van de toepassingsservice-principal. De Azure SDK voor JavaScript leest deze omgevingsvariabelen en gebruikt deze informatie om de app te verifiëren bij de Azure-resources die nodig zijn.

1 - De toepassing registreren in Azure

Toepassingsservice-principalobjecten worden gemaakt met een app-registratie in Azure. U kunt service-principals maken met behulp van Azure Portal of Azure CLI.

Meld u aan bij Azure Portal en volg deze stappen.

Instructies Schermafbeelding
In Azure Portal:
  1. Voer app-registraties in in de zoekbalk bovenaan Azure Portal.
  2. Selecteer het item App-registraties onder de kop Services in het menu dat onder de zoekbalk wordt weergegeven.
Een schermopname die laat zien hoe u de bovenste zoekbalk in Azure Portal gebruikt om naar de pagina App-registraties te zoeken en te navigeren.
Selecteer + Nieuwe registratie op de pagina App-registraties. Een schermopname van de locatie van de knop Nieuwe registratie op de pagina App-registraties.
Vul op de pagina Een toepassing registreren het formulier als volgt in.
  1. Naam → Voer een naam in voor de app-registratie in Azure. Het wordt aanbevolen deze naam op te nemen, zoals de app-naam, de gebruiker waarvoor de app-registratie is bedoeld en een id zoals 'dev' om aan te geven dat deze app-registratie moet worden gebruikt in lokale ontwikkeling.
  2. Ondersteunde accounttypen → Accounts in deze organisatiemap.
Selecteer Registreren om uw app te registreren en de service-principal van de toepassing te maken.
Een schermopname die laat zien hoe u de pagina Een toepassing registreren kunt invullen door de app een naam te geven en ondersteunde accounttypen op te geven als alleen accounts in deze organisatiedirectory.
Op de pagina App-registratie voor uw app:
  1. Toepassings-id (client) → Dit is de app-id die de app gebruikt voor toegang tot Azure tijdens lokale ontwikkeling. Kopieer deze waarde naar een tijdelijke locatie in een teksteditor, omdat u deze in een toekomstige stap nodig hebt.
  2. Directory-id (tenant) → Deze waarde is ook nodig voor uw app wanneer deze wordt geverifieerd bij Azure. Kopieer deze waarde naar een tijdelijke locatie in een teksteditor. Deze is ook nodig in een toekomstige stap.
  3. Clientreferenties → U moet de clientreferenties voor de app instellen voordat uw app kan worden geverifieerd bij Azure en Azure-services kunt gebruiken. Selecteer Een certificaat of geheim toevoegen om referenties voor uw app toe te voegen.
Een schermopname nadat de app-registratie is voltooid met de locatie van de toepassings-id, tenant-id.
Selecteer + Nieuw clientgeheim op de pagina Certificaten en geheimen. Een schermopname van de locatie van de koppeling die moet worden gebruikt om een nieuw clientgeheim te maken op de pagina certificaten en geheimen.
Het dialoogvenster Een clientgeheim toevoegen wordt weergegeven aan de rechterkant van de pagina. In dit dialoogvenster:
  1. Beschrijving → Voer een waarde van Current in.
  2. Verloopt → Selecteer een waarde van 24 maanden.
Selecteer Toevoegen om het geheim toe te voegen.
Een schermopname van de pagina waar een nieuw clientgeheim wordt toegevoegd voor de toepassingsservice-principal die door het app-registratieproces wordt gemaakt.
Op de pagina Certificaten en geheimen wordt de waarde van het clientgeheim weergegeven.

Kopieer deze waarde naar een tijdelijke locatie in een teksteditor, omdat u deze in een toekomstige stap nodig hebt.

BELANGRIJK: Dit is de enige keer dat u deze waarde ziet. Wanneer u deze pagina verlaat of vernieuwt, kunt u deze waarde niet meer zien. U kunt meer clientgeheimen toevoegen zonder dit clientgeheim ongeldig te maken, maar u ziet deze waarde niet meer.
Een schermopname van de pagina met het gegenereerde clientgeheim.

2 - Een Microsoft Entra-beveiligingsgroep maken voor lokale ontwikkeling

Aangezien er doorgaans meerdere ontwikkelaars zijn die aan een toepassing werken, is het raadzaam om een Microsoft Entra-groep te maken om de rollen (machtigingen) die de app nodig heeft in lokale ontwikkeling in te kapselen in plaats van de rollen toe te wijzen aan afzonderlijke service-principal-objecten. Dit biedt de volgende voordelen.

  • Elke ontwikkelaar weet zeker dat dezelfde rollen zijn toegewezen omdat rollen op groepsniveau worden toegewezen.
  • Als er een nieuwe rol nodig is voor de app, hoeft deze alleen te worden toegevoegd aan de Microsoft Entra-groep voor de app.
  • Als een nieuwe ontwikkelaar lid wordt van het team, wordt er een nieuwe toepassingsservice-principal gemaakt voor de ontwikkelaar en toegevoegd aan de groep, zodat de ontwikkelaar over de juiste machtigingen beschikt om aan de app te werken.
Instructies Schermafbeelding
Navigeer naar de pagina Microsoft Entra-id in Azure Portal door Microsoft Entra-id in het zoekvak boven aan de pagina te typen en vervolgens Microsoft Entra-id te selecteren onder services. Een schermopname die laat zien hoe u de bovenste zoekbalk in Azure Portal gebruikt om naar de pagina Microsoft Entra-id te zoeken en te navigeren.
Selecteer Groepen in het linkermenu op de pagina Microsoft Entra-id. Een schermopname van de locatie van de menuopdracht Groepen in het linkermenu van de pagina Standaardmap van Microsoft Entra-id.
Selecteer Nieuwe groep op de pagina Alle groepen. Een schermopname van de locatie van de knop Nieuwe groep op de pagina Alle groepen.
Op de pagina Nieuwe groep :
  1. GroepstypeBeveiliging
  2. Groepsnaam → A-naam voor de beveiligingsgroep, meestal gemaakt op basis van de naam van de toepassing. Het is ook handig om een tekenreeks zoals local-dev op te nemen in de naam van de groep om het doel van de groep aan te geven.
  3. Groepsbeschrijving → Een beschrijving van het doel van de groep.
  4. Selecteer de koppeling Geen leden geselecteerd onder Leden om leden toe te voegen aan de groep.
Een schermopname van het maken van een nieuwe Microsoft Entra-groep voor de toepassing.
In het dialoogvenster Leden toevoegen:
  1. Gebruik het zoekvak om de lijst met principal-namen in de lijst te filteren.
  2. Selecteer de toepassingsservice-principals voor lokale ontwikkeling voor deze app. Wanneer objecten worden geselecteerd, worden ze grijs weergegeven en verplaatst u naar de lijst met geselecteerde items onder aan het dialoogvenster.
  3. Wanneer u klaar bent, selecteert u de knop Selecteren .
Een schermopname van het dialoogvenster Leden toevoegen waarin wordt getoond hoe u toepassingsservice-principals selecteert die in de groep moeten worden opgenomen.
Selecteer Op de pagina Nieuwe groep maken de optie Maken om de groep te maken.

De groep wordt gemaakt en u gaat terug naar de pagina Alle groepen . Het kan tot 30 seconden duren voordat de groep wordt weergegeven en mogelijk moet u de pagina vernieuwen vanwege caching in Azure Portal.
Een schermopname van de pagina Nieuwe groep waarin wordt getoond hoe u het proces voltooit door de knop Maken te selecteren.

3 - Rollen toewijzen aan de toepassing

Vervolgens moet u bepalen welke rollen (machtigingen) uw app nodig heeft voor welke resources en welke rollen aan uw app worden toegewezen. In dit voorbeeld worden de rollen toegewezen aan de Microsoft Entra-groep die in stap 2 is gemaakt. Rollen kunnen aan een resource, resourcegroep of abonnementsbereik worden toegewezen. In dit voorbeeld ziet u hoe u rollen toewijst aan het bereik van de resourcegroep, omdat de meeste toepassingen al hun Azure-resources groeperen in één resourcegroep.

Instructies Schermafbeelding
Zoek de resourcegroep voor uw toepassing door te zoeken naar de naam van de resourcegroep met behulp van het zoekvak boven aan Azure Portal.

Navigeer naar uw resourcegroep door de naam van de resourcegroep te selecteren onder de kop Resourcegroepen in het dialoogvenster.
Een schermopname die laat zien hoe u het bovenste zoekvak in Azure Portal kunt gebruiken om naar de resourcegroep te gaan waaraan u rollen (machtigingen) wilt toewijzen.
Selecteer op de pagina voor de resourcegroep toegangsbeheer (IAM) in het menu aan de linkerkant. Een schermopname van de pagina resourcegroep met de locatie van het menu-item Toegangsbeheer (IAM).
Op de pagina Toegangsbeheer (IAM):
  1. Selecteer het tabblad Roltoewijzingen.
  2. Selecteer + Toevoegen in het bovenste menu en voeg vervolgens roltoewijzing toe in de resulterende vervolgkeuzelijst.
Een schermopname van het navigeren naar het tabblad Roltoewijzingen en de locatie van de knop die wordt gebruikt om roltoewijzingen toe te voegen aan een resourcegroep.
De pagina Roltoewijzing toevoegen bevat alle rollen die kunnen worden toegewezen voor de resourcegroep.
  1. Gebruik het zoekvak om de lijst te filteren op een beter beheerbare grootte. In dit voorbeeld ziet u hoe u filtert op Storage Blob-rollen.
  2. Selecteer de rol die u wilt toewijzen.
    Selecteer Volgende om naar het volgende scherm te gaan.
Een schermopname van het filteren en selecteren van roltoewijzingen die moeten worden toegevoegd aan de resourcegroep.
Op de volgende pagina Roltoewijzing toevoegen kunt u opgeven aan welke gebruiker de rol moet toewijzen.
  1. Selecteer Gebruiker, groep of service-principal onder Toegang toewijzen aan.
  2. Selecteer + Leden selecteren onder Leden
Aan de rechterkant van Azure Portal wordt een dialoogvenster geopend.
Een schermopname van het keuzerondje om een rol toe te wijzen aan een Microsoft Entra-groep en de koppeling die wordt gebruikt om de groep te selecteren waaraan de rol moet worden toegewezen.
In het dialoogvenster Leden selecteren :
  1. Het tekstvak Selecteren kan worden gebruikt om de lijst met gebruikers en groepen in uw abonnement te filteren. Typ indien nodig de eerste paar tekens van de Microsoft Entra-groep voor lokale ontwikkeling die u voor de app hebt gemaakt.
  2. Selecteer de microsoft Entra-groep voor lokale ontwikkeling die is gekoppeld aan uw toepassing.
Selecteer Selecteren onderaan het dialoogvenster om door te gaan.
Een schermopname van het filteren op en selecteren van de Microsoft Entra-groep voor de toepassing in het dialoogvenster Leden selecteren.
De Microsoft Entra-groep wordt weergegeven als geselecteerd in het scherm Roltoewijzing toevoegen.

Selecteer Beoordelen + toewijzen om naar de laatste pagina te gaan en vervolgens opnieuw beoordelen en toewijzen om het proces te voltooien.
Een schermopname van de voltooide pagina Roltoewijzing toevoegen en de locatie van de knop Beoordelen en toewijzen die wordt gebruikt om het proces te voltooien.

4 - Omgevingsvariabelen voor lokale ontwikkeling instellen

Het DefaultAzureCredential object zoekt tijdens runtime naar de informatie van de service-principal in een set omgevingsvariabelen. Omdat de meeste ontwikkelaars aan meerdere toepassingen werken, is het raadzaam om een pakket zoals dotenv te gebruiken voor toegang tot de omgeving vanuit een .env bestand dat tijdens de ontwikkeling in de map van de toepassing is opgeslagen. Dit is het bereik van de omgevingsvariabelen die worden gebruikt voor het verifiëren van de toepassing bij Azure, zodat ze alleen door deze toepassing kunnen worden gebruikt.

Het .env bestand wordt nooit ingecheckt bij broncodebeheer omdat het de geheime sleutel van de toepassing voor Azure bevat. Het standaard .gitignore-bestand voor JavaScript sluit het .env bestand automatisch uit van het inchecken.

Als u het dotenv pakket wilt gebruiken, installeert u eerst het pakket in uw toepassing.

npm install dotenv

Maak vervolgens een .env bestand in de hoofdmap van uw toepassing. Stel de omgevingsvariabelewaarden als volgt in met waarden die zijn verkregen uit het app-registratieproces:

  • AZURE_CLIENT_ID → de waarde van de app-id.
  • AZURE_TENANT_ID → de waarde van de tenant-id.
  • AZURE_CLIENT_SECRET → het wachtwoord/de referentie die voor de app is gegenereerd.
AZURE_CLIENT_ID=00000000-0000-0000-0000-000000000000
AZURE_TENANT_ID=11111111-1111-1111-1111-111111111111
AZURE_CLIENT_SECRET=abcdefghijklmnopqrstuvwxyz

Gebruik ten slotte in de opstartcode voor uw toepassing de dotenv bibliotheek om de omgevingsvariabelen uit het bestand bij het .env opstarten te lezen.

import 'dotenv/config'

5 - DefaultAzureCredential implementeren in uw toepassing

Als u Azure SDK-clientobjecten wilt verifiëren bij Azure, moet uw toepassing de DefaultAzureCredential klasse van het @azure/identity pakket gebruiken. In dit scenario DefaultAzureCredential detecteert u de omgevingsvariabelen AZURE_CLIENT_IDen AZURE_CLIENT_SECRETAZURE_TENANT_IDworden deze variabelen ingesteld en gelezen om de service-principalgegevens van de toepassing op te halen om verbinding te maken met Azure.

Begin met het toevoegen van het @azure/identiteitspakket aan uw toepassing.

npm install @azure/identity

Voor elke JavaScript-code waarmee een Azure SDK-clientobject in uw app wordt gemaakt, wilt u het volgende doen:

  1. Importeer de DefaultAzureCredential klasse uit de @azure/identity module.
  2. Maak een DefaultAzureCredential object.
  3. Geef het DefaultAzureCredential object door aan de objectconstructor van de Azure SDK-client.

Een voorbeeld hiervan wordt weergegeven in het volgende codesegment.

// Azure authentication dependency
import { DefaultAzureCredential } from '@azure/identity';

// Azure resource management dependency
import { SubscriptionClient } from "@azure/arm-subscriptions";

// Acquire credential
const tokenCredential = new DefaultAzureCredential();

async function listSubscriptions() {
  try {

    // use credential to authenticate with Azure SDKs
    const client = new SubscriptionClient(tokenCredential);

    // get details of each subscription
    for await (const item of client.subscriptions.list()) {
      const subscriptionDetails = await client.subscriptions.get(
        item.subscriptionId
      );
      /* 
        Each item looks like:
      
        {
          id: '/subscriptions/123456',
          subscriptionId: '123456',
          displayName: 'YOUR-SUBSCRIPTION-NAME',
          state: 'Enabled',
          subscriptionPolicies: {
            locationPlacementId: 'Internal_2014-09-01',
            quotaId: 'Internal_2014-09-01',
            spendingLimit: 'Off'
          },
          authorizationSource: 'RoleBased'
        },
    */
      console.log(subscriptionDetails);
    }
  } catch (err) {
    console.error(JSON.stringify(err));
  }
}

listSubscriptions()
  .then(() => {
    console.log("done");
  })
  .catch((ex) => {
    console.log(ex);
  });

DefaultAzureCredential detecteert automatisch het verificatiemechanisme dat is geconfigureerd voor de app en haalt de benodigde tokens op om de app bij Azure te verifiëren. Als een toepassing gebruikmaakt van meer dan één SDK-client, kan hetzelfde referentieobject worden gebruikt voor elk SDK-clientobject.