Dela via


Autentiseringskedjor i Azure Identity-biblioteket för JavaScript

Azure Identity-biblioteket innehåller autentiseringsuppgifter– offentliga klasser som implementerar Azure Core-bibliotekets TokenCredential--gränssnitt. En autentiseringsuppgift representerar ett distinkt autentiseringsflöde för att hämta en åtkomsttoken från Microsoft Entra-ID. Dessa autentiseringsuppgifter kan kopplas samman för att bilda en ordnad sekvens med autentiseringsmekanismer som ska försökas.

Så här fungerar en länkad autentiseringsuppgift

Vid körning försöker en autentiseringskedja autentisera med sekvensens första autentiseringsuppgifter. Om det inte går att hämta en åtkomsttoken med den nuvarande autentiseringsuppgiften, försöks nästa autentiseringsuppgift i sekvensen tills en åtkomsttoken har hämtats. Följande sekvensdiagram illustrerar det här beteendet:

Diagram över en kedjesekvens för autentiseringsuppgifter som visar autentiseringsförsök som fortsätter genom flera autentiseringsuppgifter tills en åtkomsttoken hämtas.

Varför använda autentiseringskedjor

En länkad autentiseringsuppgift kan erbjuda följande fördelar:

  • Miljömedvetenhet: Väljer automatiskt de lämpligaste autentiseringsuppgifterna baserat på miljön där appen körs. Utan den skulle du behöva skriva kod så här:

    import { 
        ManagedIdentityCredential, 
        AzureCliCredential 
    } from "@azure/identity";
    
    let credential;
    if (process.env.NODE_ENV === "production") {
        credential = new ManagedIdentityCredential();
    } else {
        credential = new AzureCliCredential();
    }
    
  • Sömlösa övergångar: Din app kan gå från lokal utveckling till mellanlagrings- eller produktionsmiljön utan att ändra autentiseringskoden.

  • Förbättrad återhämtning: Innehåller en återställningsmekanism som flyttas till nästa autentiseringsuppgift när den föregående misslyckas med att hämta en åtkomsttoken.

Så här väljer du en länkad autentiseringsuppgift

Det finns två olika metoder för identifikationskedja:

  • "Riv ned" en kedja: Börja med en förkonfigurerad kedja och uteslut det du inte behöver. För denna metod, se avsnittet DefaultAzureCredential-översikt.
  • "Bygg upp" en kedja: Börja med en tom kedja och inkludera bara det du behöver. Den här metoden finns i översiktsavsnittet ChainedTokenCredential.

Översikt över DefaultAzureCredential

DefaultAzureCredential är en åsiktsbaserad, förkonfigurerad kedja av autentiseringsuppgifter. Den är utformad för att stödja många miljöer, tillsammans med de vanligaste autentiseringsflödena och utvecklarverktygen. I grafisk form ser den underliggande kedjan ut så här:

Diagram över en kedjesekvens för autentiseringsuppgifter som visar autentiseringsförsök som fortsätter genom flera autentiseringsuppgifter tills en åtkomsttoken hämtas.

I vilken ordning DefaultAzureCredential försök till autentiseringsuppgifter följer.

Beställning Behörighet Beskrivning Aktiverat som standard?
1 Miljö Läser en samling miljövariabler för att avgöra om ett programtjänsthuvudnamn (programanvändare) har konfigurerats för appen. I så fall använder DefaultAzureCredential dessa värden för att autentisera appen till Azure. Den här metoden används oftast i servermiljöer men kan också användas när du utvecklar lokalt. Yes
2 Arbetsbelastningsidentitet Om appen distribueras till en Azure-värd med aktiverad Workload Identity, autentiserar du det kontot. Yes
3 hanterad identitet Om appen distribueras till en Azure-värd med hanterad identitet aktiverad autentiserar du appen till Azure med hjälp av den hanterade identiteten. Yes
4 Visual Studio Code Om utvecklaren autentiserades via Azure Resources-tillägget i Visual Studio Code och paketet @azure/identity-vscode har installerats autentiserar du kontot. Yes
5 Azure CLI- Om utvecklaren autentiserades till Azure med hjälp av Azure CLI:s az login-kommando autentiserar du appen till Azure med samma konto. Yes
6 Azure PowerShell Om utvecklaren autentiserade till Azure med hjälp av Azure PowerShells Connect-AzAccount cmdlet autentiserar du appen till Azure med samma konto. Yes
7 Azure Developer CLI Om utvecklaren autentiserade till Azure med hjälp av Azure Developer CLI:s azd auth login-kommando autentiserar du med det kontot. Yes
8 Broker Autentiserar med standardkontot som är inloggat i operativsystemet via en mäklare. Kräver att paketet @azure/identity-broker är installerat. Yes

I den enklaste formen kan du använda den parameterlösa versionen av DefaultAzureCredential på följande sätt:

import { DefaultAzureCredential } from "@azure/identity";
import { BlobServiceClient } from "@azure/storage-blob";

// Acquire a credential object
const credential = new DefaultAzureCredential();

const blobServiceClient = new BlobServiceClient(
    `https://${storageAccountName}.blob.core.windows.net`,
    credential
);

Så här anpassar du DefaultAzureCredential

I följande avsnitt beskrivs strategier för att kontrollera vilka autentiseringsuppgifter som ingår i kedjan.

Exkludera en kategori för autentiseringsuppgifter

Om du vill exkludera alla Developer tool eller Deployed service autentiseringsuppgifter anger du miljövariabeln AZURE_TOKEN_CREDENTIALS till prod respektive dev. När ett värde prod för används ser den underliggande autentiseringskedjan ut så här:

Diagram över en kedjesekvens för autentiseringsuppgifter som visar autentiseringsförsök som fortsätter genom flera autentiseringsuppgifter tills en åtkomsttoken hämtas.

När ett värde dev för används ser kedjan ut så här:

Diagram över StandardAzureCredential-kedjan med AZURE_TOKEN_CREDENTIALS inställt på

För att säkerställa att miljövariabeln har definierats och angetts till en sträng som stöds anger du egenskapen requiredEnvVars till AZURE_TOKEN_CREDENTIALS:

const credential = new DefaultAzureCredential({ 
    requiredEnvVars: [ "AZURE_TOKEN_CREDENTIALS" ]
});

Använda en specifik autentiseringsuppgift

Om du vill exkludera alla autentiseringsuppgifter förutom en anger du miljövariabeln AZURE_TOKEN_CREDENTIALS till namnet på autentiseringsuppgifterna. Du kan till exempel minska DefaultAzureCredential kedjan till genom att AzureCliCredential ange AZURE_TOKEN_CREDENTIALS till AzureCliCredential. Strängjämförelsen utförs på ett skiftlägesokänsligt sätt. Giltiga strängvärden för miljövariabeln är:

  • AzureCliCredential
  • AzureDeveloperCliCredential
  • AzurePowerShellCredential
  • EnvironmentCredential
  • ManagedIdentityCredential
  • VisualStudioCodeCredential
  • WorkloadIdentityCredential

Viktigt!

Miljövariabeln AZURE_TOKEN_CREDENTIALS stöder enskilda autentiseringsuppgifter i @azure/identity paketversionerna 4.11.0 och senare.

För att säkerställa att miljövariabeln har definierats och angetts till en sträng som stöds anger du egenskapen requiredEnvVars till AZURE_TOKEN_CREDENTIALS:

const credential = new DefaultAzureCredential({ 
    requiredEnvVars: [ "AZURE_TOKEN_CREDENTIALS" ]
});

Översikt över ChainedTokenCredential

ChainedTokenCredential är en tom kedja där du lägger till autentiseringsuppgifter som passar appens behov. Till exempel:

import { 
    ChainedTokenCredential, 
    AzureCliCredential, 
    VisualStudioCodeCredential 
} from "@azure/identity";

const credential = new ChainedTokenCredential(
    new AzureCliCredential(),
    new VisualStudioCodeCredential()
);

const blobServiceClient = new BlobServiceClient(
    `https://${storageAccountName}.blob.core.windows.net`,
    credential
);

Föregående kodexempel skapar en anpassad autentiseringskedja som består av två autentiseringsuppgifter för utvecklingstid. AzureCliCredential försöks först, följt av VisualStudioCodeCredential, om det behövs. I grafisk form ser kedjan ut så här:

Diagram över en autentiseringskedja som visar AzureCliCredential som det första försöket och VisualStudioCodeCredential som reserv.

Tips

För bättre prestanda optimerar du ordning på autentiseringsuppgifter i ChainedTokenCredential från de flesta till minst använda autentiseringsuppgifterna.

Användningsvägledning för DefaultAzureCredential

DefaultAzureCredential är utan tvekan det enklaste sättet att komma igång med Azure Identity-biblioteket, men med den bekvämligheten kommer kompromisser. När du har distribuerat din app till Azure bör du förstå appens autentiseringskrav. Därför ersätter du DefaultAzureCredential med en specifik TokenCredential implementering, till exempel ManagedIdentityCredential.

Här är varför:

  • Felsökningsutmaningar: När autentiseringen misslyckas kan det vara svårt att felsöka och identifiera de felaktiga autentiseringsuppgifterna. Du måste aktivera loggning för att se övergången från ett autentiseringsuppgifter till nästa och se statusen för var och en, om det lyckas eller misslyckas. Mer information finns i Felsöka en autentiseringsuppgift.
  • Prestandakostnader: Processen med att sekventiellt prova flera autentiseringsuppgifter kan medföra prestandakostnader. När den till exempel körs på en lokal utvecklingsdator är den hanterade identiteten inte tillgänglig. Därför ManagedIdentityCredential misslyckas alltid i den lokala utvecklingsmiljön.
  • Oförutsägbart beteende: DefaultAzureCredential söker efter förekomsten av vissa miljövariabler. Det är möjligt att någon kan lägga till eller ändra dessa miljövariabler på systemnivå på värddatorn. Dessa ändringar gäller globalt och ändrar därför beteendet för DefaultAzureCredential vid körning i alla appar som körs på den datorn.

Felsöka en autentiseringsuppgift

Om du vill diagnostisera ett oväntat problem eller förstå vad en autentiseringsuppgift gör aktiverar du loggning i din app. Till exempel:

import { setLogLevel, AzureLogger } from "@azure/logger";
import { BlobServiceClient } from "@azure/storage-blob";
import { DefaultAzureCredential } from "@azure/identity";

// Constant for the Azure Identity log prefix
const AZURE_IDENTITY_LOG_PREFIX = "azure:identity";

// override logging to output to console.log (default location is stderr)
// only log messages that start with the Azure Identity log prefix
setLogLevel("verbose");
AzureLogger.log = (...args) => {
  const message = args[0];
  if (typeof message === 'string' && message.startsWith(AZURE_IDENTITY_LOG_PREFIX)) {
    console.log(...args);
  }
};

// Get storage account name from environment variable
const storageAccountName = process.env.AZURE_STORAGE_ACCOUNT_NAME;

if (!storageAccountName) {
    throw new Error("AZURE_STORAGE_ACCOUNT_NAME environment variable is required");
}

const credential = new DefaultAzureCredential({ 
    requiredEnvVars: [ "AZURE_TOKEN_CREDENTIALS" ]
});


const blobServiceClient = new BlobServiceClient(
    `https://${storageAccountName}.blob.core.windows.net`,
    credential
);
azure:identity:info EnvironmentCredential => Found the following environment variables: 
azure:identity:verbose EnvironmentCredential => AZURE_CLIENT_SEND_CERTIFICATE_CHAIN: undefined; sendCertificateChain: false
azure:identity:info WorkloadIdentityCredential => Found the following environment variables:
azure:identity:warning DefaultAzureCredential => Skipped createDefaultWorkloadIdentityCredential because of an error creating the credential: CredentialUnavailableError: WorkloadIdentityCredential: is unavailable. clientId is a required parameter. In DefaultAzureCredential and ManagedIdentityCredential, this can be provided as an environment variable - "AZURE_CLIENT_ID".
        See the troubleshooting guide for more information: https://aka.ms/azsdk/js/identity/workloadidentitycredential/troubleshoot
azure:identity:info ManagedIdentityCredential => Using DefaultToImds managed identity.
azure:identity:warning DefaultAzureCredential => Skipped createDefaultBrokerCredential because of an error creating the credential: Error: Broker for WAM was requested, but no plugin was configured or no authentication record was found. You must install the @azure/identity-broker plugin package (npm install --save @azure/identity-broker) and enable it by importing `useIdentityPlugin` from `@azure/identity` and calling useIdentityPlugin(nativeBrokerPlugin) before using enableBroker.
azure:identity:info DefaultAzureCredential => getToken() => Skipping createDefaultWorkloadIdentityCredential, reason: WorkloadIdentityCredential: is unavailable. clientId is a required parameter. In DefaultAzureCredential and ManagedIdentityCredential, this can be provided as an environment variable - "AZURE_CLIENT_ID".
        See the troubleshooting guide for more information: https://aka.ms/azsdk/js/identity/workloadidentitycredential/troubleshoot
azure:identity:info ManagedIdentityCredential => getToken() => Using the MSAL provider for Managed Identity.
azure:identity:info ManagedIdentityCredential - Token Exchange => ManagedIdentityCredential - Token Exchange: Unavailable. The environment variables needed are: AZURE_CLIENT_ID (or the client ID sent through the parameters), AZURE_TENANT_ID and AZURE_FEDERATED_TOKEN_FILE
azure:identity:info ManagedIdentityCredential => getToken() => MSAL Identity source: DefaultToImds
azure:identity:info ManagedIdentityCredential => getToken() => Using the IMDS endpoint to probe for availability.
azure:identity:info ManagedIdentityCredential - IMDS => ManagedIdentityCredential - IMDS: Pinging the Azure IMDS endpoint
azure:identity:verbose ManagedIdentityCredential - IMDS => ManagedIdentityCredential - IMDS: Caught error RestError: connect ENETUNREACH 169.254.169.254:80
azure:identity:info ManagedIdentityCredential - IMDS => ManagedIdentityCredential - IMDS: The Azure IMDS endpoint is unavailable
azure:identity:error ManagedIdentityCredential => getToken() => ERROR. Scopes: https://storage.azure.com/.default. Error message: Attempted to use the IMDS endpoint, but it is not available..
azure:identity:info AzureCliCredential => getToken() => Using the scope https://storage.azure.com/.default
azure:identity:info AzureCliCredential => getToken() => expires_on is available and is valid, using it
azure:identity:info AzureCliCredential => getToken() => SUCCESS. Scopes: https://storage.azure.com/.default.

Observera i föregående utdata att DefaultAzureCredential framgångsrikt har hämtat en token med hjälp av AzureCliCredential.