Delen via


Aanbevolen procedures voor verificatie met de Azure Identity-bibliotheek voor .NET

Dit artikel bevat richtlijnen voor het maximaliseren van de prestaties en betrouwbaarheid van uw .NET-apps bij het verifiëren van Azure-services. Om optimaal gebruik te maken van de Azure Identity-bibliotheek voor .NET, is het belangrijk om potentiële problemen en beperkingstechnieken te begrijpen.

Deterministische referenties gebruiken in productieomgevingen

DefaultAzureCredential is de meest benaderbare manier om aan de slag te gaan met de Azure Identity-bibliotheek, maar dat gemak introduceert ook bepaalde compromissen. Met name kan niet vooraf worden gegarandeerd welke specifieke referentie in de keten zal slagen en voor aanvraagverificatie zal worden gebruikt. In een productieomgeving kan deze onvoorspelbaarheid aanzienlijke en soms subtiele problemen veroorzaken.

Denk bijvoorbeeld aan de volgende hypothetische reeks gebeurtenissen:

  1. Het beveiligingsteam van een organisatie verplicht alle apps om beheerde identiteit te gebruiken om te verifiëren bij Azure-resources.
  2. Maandenlang gebruikt een .NET-app, gehost op een Azure-virtuele machine (VM), met succes DefaultAzureCredential om te authenticeren via een beheerde identiteit.
  3. Zonder het ondersteuningsteam te vertellen, installeert een ontwikkelaar de Azure CLI op die VM en voert de az login opdracht uit om te verifiëren bij Azure.
  4. Vanwege een afzonderlijke configuratiewijziging in de Azure-omgeving begint verificatie via de oorspronkelijke beheerde identiteit onverwacht te mislukken.
  5. DefaultAzureCredential slaat de mislukte ManagedIdentityCredential over en zoekt naar de volgende beschikbare referentie, die AzureCliCredentialis.
  6. De toepassing gaat de Azure CLI-referenties gebruiken in plaats van de beheerde identiteit, wat kan mislukken of leiden tot onverwachte uitbreiding of vermindering van bevoegdheden.

Als u dit soort subtiele problemen of stille fouten in productie-apps wilt voorkomen, vervangt u DefaultAzureCredential door een specifieke TokenCredential-implementatie, zoals ManagedIdentityCredential. Bekijk de afgeleide lijst voor opties.

Denk bijvoorbeeld aan de volgende DefaultAzureCredential configuratie in een ASP.NET Core-project:

builder.Services.AddAzureClients(clientBuilder =>
{
    clientBuilder.AddSecretClient(
        new Uri($"https://{keyVaultName}.vault.azure.net"));
    clientBuilder.AddBlobServiceClient(
        new Uri($"https://{storageAccountName}.blob.core.windows.net"));

    DefaultAzureCredential credential = new();
    clientBuilder.UseCredential(credential);
});

Wijzig de voorgaande code om een referentie te selecteren op basis van de omgeving waarin de app wordt uitgevoerd:

builder.Services.AddAzureClients(clientBuilder =>
{
    clientBuilder.AddSecretClient(
        new Uri($"https://{keyVaultName}.vault.azure.net"));
    clientBuilder.AddBlobServiceClient(
        new Uri($"https://{storageAccountName}.blob.core.windows.net"));

    TokenCredential credential;

    if (builder.Environment.IsProduction() || builder.Environment.IsStaging())
    {
        string? clientId = builder.Configuration["UserAssignedClientId"];
        credential = new ManagedIdentityCredential(
            ManagedIdentityId.FromUserAssignedClientId(clientId));
    }
    else
    {
        // local development environment
        credential = new ChainedTokenCredential(
            new VisualStudioCredential(),
            new AzureCliCredential(),
            new AzurePowerShellCredential());
    }

    clientBuilder.UseCredential(credential);
});

In dit voorbeeld wordt alleen ManagedIdentityCredential gebruikt in productie. De authenticatiebehoeften van de lokale ontwikkelomgeving worden vervolgens verwerkt door de reeks referenties die zijn gedefinieerd in de else-clausule.

Referenties opnieuw gebruiken

Gebruik waar mogelijk referenties opnieuw om de veerkracht van de app te verbeteren en het aantal aanvragen voor toegangstokens dat wordt uitgegeven aan Microsoft Entra ID te verminderen. Wanneer een referentie opnieuw wordt gebruikt, wordt geprobeerd een token op te halen uit de app-tokencache die wordt beheerd door de onderliggende MSAL-afhankelijkheid. Zie tokencaching in de Azure Identity-clientbibliotheekvoor meer informatie.

Belangrijk

Een druk gebruikte app die geen referenties hergebruikt, kan HTTP 429-throttlingreacties van Microsoft Entra ID tegenkomen, wat kan leiden tot app-storingen.

De aanbevolen strategie voor het hergebruik van referenties verschilt per .NET-toepassingstype.

Als u referenties opnieuw wilt gebruiken, gebruikt u de UseCredential methode van Microsoft.Extensions.Azure. Overweeg een ASP.NET Core-app die wordt gehost in Azure App Service in zowel productie- als faseringsomgevingen. Omgevingsvariabele ASPNETCORE_ENVIRONMENT is ingesteld op Production of Staging om onderscheid te maken tussen deze twee niet-ontwikkelomgevingen. In zowel productie- als fasering wordt de door de gebruiker toegewezen variant van ManagedIdentityCredential gebruikt om de Key Vault-geheimen en Blob Storage-clients te verifiëren.

Wanneer de app wordt uitgevoerd op een lokale ontwikkelcomputer, waarbij ASPNETCORE_ENVIRONMENT is ingesteld op Development, wordt in plaats daarvan een gekoppelde reeks referenties voor hulpprogramma's voor ontwikkelaars gebruikt. Deze aanpak zorgt ervoor dat omgevingsspecifieke referenties worden gebruikt, waardoor de beveiliging wordt verbeterd en het referentiebeheer wordt vereenvoudigd.

builder.Services.AddAzureClients(clientBuilder =>
{
    clientBuilder.AddSecretClient(
        new Uri($"https://{keyVaultName}.vault.azure.net"));
    clientBuilder.AddBlobServiceClient(
        new Uri($"https://{storageAccountName}.blob.core.windows.net"));

    TokenCredential credential;

    if (builder.Environment.IsProduction() || builder.Environment.IsStaging())
    {
        string? clientId = builder.Configuration["UserAssignedClientId"];
        credential = new ManagedIdentityCredential(
            ManagedIdentityId.FromUserAssignedClientId(clientId));
    }
    else
    {
        // local development environment
        credential = new ChainedTokenCredential(
            new VisualStudioCredential(),
            new AzureCliCredential(),
            new AzurePowerShellCredential());
    }

    clientBuilder.UseCredential(credential);
});

Zie Verifiëren met behulp van Microsoft Entra IDvoor informatie over deze aanpak in een ASP.NET Core-app.

Begrijpen wanneer tokenlevensduur en cachelogica nodig zijn

Als u een Azure Identity Library-referentie gebruikt buiten de context van een Azure SDK-clientbibliotheek die afhankelijk is van Azure Core, wordt het uw verantwoordelijkheid om levensduur van tokens te beheren en het cachegedrag in uw app te beheren.

De eigenschap RefreshOn op AccessToken, die een hint biedt aan consumenten wanneer tokenvernieuwing kan worden uitgevoerd, wordt automatisch gebruikt door Azure SDK-clientbibliotheken die afhankelijk zijn van de Azure Core-bibliotheek om het token te vernieuwen. Voor direct gebruik van de Azure Identity-bibliotheek referenties die tokencachingondersteunen, wordt de onderliggende MSAL-cache automatisch proactief vernieuwd wanneer de RefreshOn tijd aanvangt. Met dit ontwerp kan de clientcode GetToken aanroepen telkens wanneer een token nodig is en de vernieuwing naar de bibliotheek delegeren.

Als u alleen GetToken wilt aanroepen wanneer dat nodig is, bekijkt u de RefreshOn datum en probeert u het token na die tijd proactief te vernieuwen. De specifieke implementatie is aan de klant.

Inzicht in de strategie voor opnieuw proberen van beheerde identiteit

Met de Azure Identity-bibliotheek voor .NET kunt u zich verifiëren via een beheerde identiteit met ManagedIdentityCredential. De manier waarop u ManagedIdentityCredential gebruikt, heeft invloed op de toegepaste strategie voor opnieuw proberen. Wanneer gebruikt via:

  • DefaultAzureCredential, worden er geen herhalingspogingen gedaan wanneer de eerste poging tot tokenverwerving mislukt of er een time-out optreedt na een korte tijd. Dit is de minst veerkrachtige optie omdat deze is geoptimaliseerd om snel te falen voor een efficiënte interne ontwikkelingscyclus.
  • Andere benaderingen, zoals direct ChainedTokenCredential of ManagedIdentityCredential gebruiken:
    • Het tijdsinterval tussen nieuwe pogingen begint bij 0,8 seconden en er worden standaard vijf nieuwe pogingen geprobeerd. Deze optie is geoptimaliseerd voor tolerantie, maar introduceert mogelijk ongewenste vertragingen in de interne ontwikkelingslus.

    • Als u een van de standaardinstellingen voor opnieuw proberen wilt wijzigen, gebruikt u de eigenschap Retry op ManagedIdentityCredentialOptions. Probeer het bijvoorbeeld maximaal drie keer opnieuw, met een begininterval van 0,5 seconden:

      ManagedIdentityCredentialOptions miCredentialOptions = new(
              ManagedIdentityId.FromUserAssignedClientId(clientId)
          )
          {
              Retry =
              {
                  MaxRetries = 3,
                  Delay = TimeSpan.FromSeconds(0.5),
              }
          };
      
      ManagedIdentityCredential miCredential = new(miCredentialOptions);
      

Zie Een aangepast beleid voor opnieuw proberen instellenvoor meer informatie over het aanpassen van beleid voor opnieuw proberen.