Konfigurera certifikatfri autentisering med Microsoft. Identity.Web

Den här artikeln visar hur du konfigurerar certifikatfri autentisering så att ditt program autentiseras med Microsoft Entra ID utan att hantera certifikat eller klienthemligheter. Din app använder en FIC (Federated Identity Credential) som backas upp av en Azure hanterad identitet för att hämta token, vilket eliminerar rotation av autentiseringsuppgifter, minskar hemlighetsspridningen och förenklar Azure distributioner.

Microsoft. Identity.Web stöder certifikatfri autentisering via källtypen SignedAssertionFromManagedIdentity autentiseringsuppgifter, som finns i version 2.12.0 och senare.


Förstå certifikatfri autentisering

I det här avsnittet beskrivs hur certifikatfri autentisering fungerar och när den ska användas.

Traditionellt bevisar konfidentiella klientprogram sin identitet för att Microsoft Entra ID genom att presentera en klienthemlighet eller ett certifikat. Båda metoderna kräver att du hanterar livscykeln för autentiseringsuppgifter – rotera hemligheter innan de upphör att gälla, förnya certifikat och lagra dem på ett säkert sätt.

Federerade identitetsautentiseringsuppgifter (FIC) ändrar den här modellen. Med FIC konfigurerar du en förtroenderelation mellan din appregistrering och en hanterad identitet. När ditt program behöver autentisera:

  1. Microsoft.Identity.Web begär en token från slutpunkten för hanterad identitet på Azure-värd.
  2. Biblioteket använder token för hanterad identitet som ett signerat intyg för att autentisera med Microsoft Entra ID.
  3. Microsoft Entra ID verifierar den signerade försäkran mot konfigurationen av federerade autentiseringsuppgifter i appregistreringen.
  4. Microsoft Entra ID utfärdar en åtkomsttoken för den begärda resursen.

Resultatet är en helt autentiseringsfri distribution där det inte finns några hemligheter eller certifikat i dina konfigurations-, kod- eller miljövariabler.

Välj rätt autentiseringsmetod

Följande tabell hjälper dig att avgöra när certifikatfri autentisering är rätt val.

Scenario Rekommenderat tillvägagångssätt
Appen körs på Azure och du vill ha noll hantering av autentiseringsuppgifter Certifikatlös med FIC
Appen körs på Azure men behöver stöd för lokal återställning Certifikatbaserade autentiseringsuppgifter med FIC som primär
Appen körs utanför Azure (lokalt, andra moln) Certifikat eller klienthemligheter
Utveckling och testning på lokala datorer Klienthemligheter eller certifikat från ett lokalt arkiv

Förutsättningar

Kontrollera att du har följande resurser och verktyg innan du börjar:

  • En Azure-prenumeration. Om du inte har ett, skapa ett gratis konto.
  • En appregistrering i Microsoft Entra ID med nödvändiga API-behörigheter för ditt scenario.
  • En Hanterad identitet i Azure – antingen systemtilldelad på beräkningsresursen eller en fristående användartilldelad hanterad identitet.
  • Microsoft. Identity.Web version 2.12.0 eller senare installerad i projektet.
  • En Azure beräkningsresurs som stöder hanterad identitet, till exempel Azure App Service, Azure Kubernetes Service (AKS), Azure Container Apps eller Azure Virtual Machines.

Steg 1: Skapa eller identifiera en hanterad identitet

Du kan använda antingen en systemtilldelad eller användartilldelad hanterad identitet. Om du inte har skapat någon ännu följer du anvisningarna för ditt scenario.

Alternativ A: Använd en systemtilldelad hanterad identitet

Systemtilldelade hanterade identiteter är knutna till livscykeln för en Azure resurs. När du aktiverar en systemtilldelad identitet på en resurs som en App Service skapar Azure en identitet automatiskt.

  1. I Azure-portalen går du till beräkningsresursen (till exempel din App Service).
  2. Välj Identitet på den vänstra navigeringsmenyn.
  3. På fliken Systemtilldelat ställer du in Status till .
  4. Välj Spara och bekräfta åtgärden.
  5. När identiteten har skapats kopierar du objekt-ID:t (huvudnamn). Du behöver det här värdet när du konfigurerar federerade autentiseringsuppgifter.

Alternativ B: Skapa en användartilldelad hanterad identitet

Användartilldelade hanterade identiteter är fristående Azure resurser som du kan tilldela till en eller flera beräkningsresurser.

  1. I portalen Azure söker du efter Hanterade identiteter och väljer den.
  2. Välj Skapa.
  3. Välj din prenumeration, resursgrupp, region och ange ett namn för identiteten.
  4. Välj Granska + skapa och sedan Skapa.
  5. När distributionen är klar öppnar du den nya resursen för hanterad identitet.
  6. Kopiera klient-ID :t från sidan Översikt . Du behöver det här värdet för programkonfigurationen.

Steg 2: Konfigurera en federerad identitetsautentiseringsuppgift i Azure-portalen

En federerad identitetsautentiseringsuppgift upprättar en förtroenderelation mellan din appregistrering och den hanterade identiteten. Följ dessa steg för att skapa en:

  1. I portalen Azure går du till Microsoft Entra ID>App registrations.

  2. Välj den appregistrering som programmet använder.

  3. I den vänstra navigeringsmenyn väljer du Certifikat och hemligheter.

  4. Välj fliken Federerade autentiseringsuppgifter.

  5. Välj Lägg till autentiseringsuppgift.

  6. Under Scenario med federerade autentiseringsuppgifter väljer du Kundhanterade nycklar eller Annan utfärdare (de tillgängliga alternativen beror på din portalversion).

  7. Konfigurera följande fält:

    Fält Värde
    Utfärdare https://login.microsoftonline.com/{tenant-id}/v2.0 – Ersätt {tenant-id} med ditt Microsoft Entra klient-ID.
    Ämnesidentifierare Objekt-ID:t (huvudnamn) för den hanterade identiteten. För systemtilldelade hittar du detta på resursens identitetssida. För användartilldelad hittar du detta på sidan Översikt för hanterad identitet under Principal-ID.
    Namn Ett beskrivande namn, till exempel fic-managed-identity-prod.
    målgrupp api://AzureADTokenExchange (standardvärdet).
  8. Välj Lägg till.

Viktigt!

Ämnesidentifieraren måste exakt matcha objekt-ID:t (huvudnamn) för den hanterade identiteten. Ett matchningsfel gör att autentiseringen misslyckas med ett AADSTS70021 fel.

Konfigurera en federerad identitetsautentiseringsuppgift med Azure CLI

Du kan också skapa federerade autentiseringsuppgifter med Azure CLI. Följande kommando skapar en autentiseringsuppgift för din appregistrering:

az ad app federated-credential create \
    --id <app-object-id> \
    --parameters '{
        "name": "fic-managed-identity-prod",
        "issuer": "https://login.microsoftonline.com/<tenant-id>/v2.0",
        "subject": "<managed-identity-principal-id>",
        "audiences": ["api://AzureADTokenExchange"],
        "description": "FIC for production managed identity"
    }'

Utfärdar-URL:er efter Azure-tjänst

Utfärdarens URL i de federerade autentiseringsuppgifterna beror på den Azure tjänst som är värd för ditt program:

Azure tjänst Utfärdar-URL
Azure App Service/Azure Functions https://login.microsoftonline.com/{tenant-id}/v2.0
Azure Container Apps https://login.microsoftonline.com/{tenant-id}/v2.0
Azure Kubernetes Service (AKS) OIDC-utfärdarens URL för klustret (hämta med az aks show --query oidcIssuerProfile.issuerUrl)
Azure Virtual Machines https://login.microsoftonline.com/{tenant-id}/v2.0

Format för ämnesidentifierare

Formatet för ämnesidentifieraren beror på typen hanterad identitet:

Systemtilldelad hanterad identitet – Använd objekt-ID:t (huvudnamn) från resursens identitetssida . Det här är ett GUID-värde, till exempel a1b2c3d4-e5f6-7890-abcd-ef1234567890.

Användartilldelad hanterad identitet – Använd huvudnamns-ID :t (kallas även objekt-ID) från sidan Översikt för den hanterade identitetsresursen. Det här är också ett GUID-värde.

Anmärkning

För AKS med arbetsbelastningsidentitet använder ämnesidentifieraren ett annat format: system:serviceaccount:{namespace}:{service-account-name}. Det här värdet måste matcha kubernetes-tjänstkontot som podden använder.


Steg 3: Konfigurera ditt program

Uppdatera appsettings.json

Lägg till ClientCredentials-avsnittet i din AzureAd-konfiguration. Ange SourceType till SignedAssertionFromManagedIdentity:

För användartilldelad hanterad identitet

{
  "AzureAd": {
    "Instance": "https://login.microsoftonline.com/",
    "TenantId": "YOUR_TENANT_ID",
    "ClientId": "YOUR_CLIENT_ID",
    "ClientCredentials": [
      {
        "SourceType": "SignedAssertionFromManagedIdentity",
        "ManagedIdentityClientId": "USER_ASSIGNED_MSI_CLIENT_ID"
      }
    ]
  }
}

Ersätt följande platshållare:

Platshållare Beskrivning
YOUR_TENANT_ID Ditt Microsoft Entra klient-ID.
YOUR_CLIENT_ID Program-ID:t (klient) för din appregistrering.
USER_ASSIGNED_MSI_CLIENT_ID Klient-ID för den användartilldelade hanterade identiteten (från identitetens översiktssida).

För systemtilldelad hanterad identitet

När du använder en systemtilldelad hanterad identitet utelämnar ManagedIdentityClientId du egenskapen. Microsoft. Identity.Web använder automatiskt värdens systemtilldelade identitet:

{
  "AzureAd": {
    "Instance": "https://login.microsoftonline.com/",
    "TenantId": "YOUR_TENANT_ID",
    "ClientId": "YOUR_CLIENT_ID",
    "ClientCredentials": [
      {
        "SourceType": "SignedAssertionFromManagedIdentity"
      }
    ]
  }
}

Registrera tjänster i Program.cs

Inga särskilda kodändringar krävs i startkonfigurationen. Standard Microsoft. Identity.Web-registreringsmetoder läser avsnittet ClientCredentials automatiskt.

I följande exempel registreras autentisering för en webbapp som loggar in användare och anropar underordnade API:er:

// For a web app that signs in users and calls downstream APIs
builder.Services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
    .AddMicrosoftIdentityWebApp(builder.Configuration.GetSection("AzureAd"))
    .EnableTokenAcquisitionToCallDownstreamApi()
    .AddInMemoryTokenCaches();

I följande exempel registreras autentisering för ett webb-API som anropar underordnade API:er:

// For a web API that calls downstream APIs
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddMicrosoftIdentityWebApi(builder.Configuration.GetSection("AzureAd"))
    .EnableTokenAcquisitionToCallDownstreamApi()
    .AddInMemoryTokenCaches();

I följande exempel registreras autentisering för ett daemonprogram utan användarinteraktion:

// For a daemon application (no user interaction)
builder.Services.AddAuthentication()
    .AddMicrosoftIdentityWebApi(builder.Configuration.GetSection("AzureAd"));

builder.Services.AddTokenAcquisition()
    .AddInMemoryTokenCaches();

Microsoft. Identity.Web identifierar SignedAssertionFromManagedIdentity källtyp och hanterar tokenutbytet transparent.


Jämföra systemtilldelad och användartilldelad hanterad identitet

Välj den typ av hanterad identitet som passar din arkitektur bäst. I följande avsnitt beskrivs kompromisserna.

Systemtilldelad hanterad identitet

En systemtilldelad identitet skapas och tas bort automatiskt med den Azure resurs som den tillhör.

fördelar:

  • Ingen separat resurs att hantera – identitetens livscykel matchar beräkningsresursen.
  • Enklare installation för distributioner med enskild resurs.
  • Ingen ManagedIdentityClientId krävs i konfigurationen.

Considerations:

  • Du kan inte dela identiteten mellan flera resurser.
  • Om du tar bort och återskapar resursen ändras identiteten – du måste uppdatera den federerade identitetsautentiseringsuppgiften.

Bäst för: Distributioner med en enda instans där en beräkningsresurs mappas till en appregistrering.

Användartilldelad hanterad identitet

En användartilldelad identitet är en fristående Azure resurs med en egen livscykel.

fördelar:

  • Dela en enda identitet mellan flera beräkningsresurser (till exempel flera App Service-instanser i olika regioner).
  • Identiteten bevaras oberoende av beräkningsresursens livscykel.
  • Förskapa och förkonfigurera innan du distribuerar beräkningsresursen.

Considerations:

  • Ytterligare en Azure resurs att hantera.
  • Du måste ange ManagedIdentityClientId i konfigurationen.

Bäst för: Distributioner med flera instanser eller flera regioner, blågröna distributionsmönster och scenarier där beräkningsresurser ofta återskapas.


Distribuera till Azure beräkningstjänster

När du har konfigurerat programmet distribuerar du det till en Azure beräkningstjänst som stöder hanterad identitet.

Azure App Service

  1. Aktivera hanterad identitet i din App Service (se steg 1).

  2. Distribuera ditt program till App Service med den metod du föredrar (Visual Studio, Azure CLI GitHub Actions).

  3. AzureAd Se till att avsnittet i den distribuerade konfigurationen matchar inställningarna i steg 3.

  4. Om du använder en användartilldelad hanterad identitet tilldelar du den till App Service:

    az webapp identity assign \
      --resource-group <resource-group> \
      --name <app-service-name> \
      --identities <managed-identity-resource-id>
    
  5. Starta om App Service för att hämta identitetstilldelningen.

Azure Kubernetes-tjänsten (AKS)

För AKS använder du arbetsbelastningsidentitet för att associera ett Kubernetes-tjänstkonto med den hanterade identiteten. Slutför följande steg:

  1. Aktivera funktionen för arbetsbelastningsidentitet i ditt AKS-kluster:

    az aks update \
      --resource-group <resource-group> \
      --name <aks-cluster-name> \
      --enable-oidc-issuer \
      --enable-workload-identity
    
  2. Skapa ett Kubernetes-tjänstkonto som har kommenterats med klient-ID:t för hanterad identitet:

    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: my-app-sa
      namespace: default
      annotations:
        azure.workload.identity/client-id: "<USER_ASSIGNED_MSI_CLIENT_ID>"
    
  3. Skapa en federerad autentiseringsuppgift som länkar AKS OIDC-utfärdaren till den hanterade identiteten.

  4. Konfigurera podden så att den använder tjänstkontot:

    apiVersion: v1
    kind: Pod
    metadata:
      name: my-app
      namespace: default
      labels:
        azure.workload.identity/use: "true"
    spec:
      serviceAccountName: my-app-sa
      containers:
        - name: my-app
          image: <your-container-image>
    
  5. Distribuera podden. Webhooken för arbetslastidentiteten injicerar de nödvändiga miljövariablerna för slutpunkten för token för hanterad identitet.

Azure Container Apps

  1. Skapa eller uppdatera containerappen med en hanterad identitet:

    az containerapp identity assign \
      --resource-group <resource-group> \
      --name <container-app-name> \
      --user-assigned <managed-identity-resource-id>
    
  2. Distribuera din containeravbildning med rätt AzureAd konfiguration.

  3. Slutpunkten för hanterad identitetstoken är automatiskt tillgänglig i containern.


Migrera från certifikat till certifikatfri autentisering

Om ditt program för närvarande använder certifikatbaserad autentisering kan du migrera till certifikatfri autentisering med minimala konfigurationsändringar.

Slutför migreringsstegen

  1. Skapa en hanterad identitet för din Azure beräkningsresurs (se Steg 1).

  2. Lägg till en federerad identitetsautentiseringsuppgift i din appregistrering (se steg 2).

  3. Uppdatera konfigurationen för att lägga till autentiseringsuppgifterna SignedAssertionFromManagedIdentity . Du kan behålla befintliga certifikatautentiseringsuppgifter som reserv under migreringen:

    {
      "AzureAd": {
        "Instance": "https://login.microsoftonline.com/",
        "TenantId": "YOUR_TENANT_ID",
        "ClientId": "YOUR_CLIENT_ID",
        "ClientCredentials": [
          {
            "SourceType": "SignedAssertionFromManagedIdentity",
            "ManagedIdentityClientId": "USER_ASSIGNED_MSI_CLIENT_ID"
          },
          {
            "SourceType": "KeyVault",
            "KeyVaultUrl": "https://your-keyvault.vault.azure.net",
            "KeyVaultCertificateName": "your-cert-name"
          }
        ]
      }
    }
    

    Microsoft. Identity.Web försöker med autentiseringskällor i ordning. När den körs på Azure lyckas den första autentiseringsuppgiften (SignedAssertionFromManagedIdentity). Om det misslyckas (till exempel under lokal utveckling) återgår biblioteket till certifikatet.

  4. Distribuera och verifiera i en mellanlagringsmiljö innan du tillämpar på produktion.

  5. Ta bort certifikatautentiseringsuppgifterna från konfigurationen när du har bekräftat att certifikatfri autentisering fungerar i produktion.

  6. Ta bort certifikatet från Azure Key Vault och appregistreringen när det inte längre behövs.

Jämför före och efter konfiguration

I följande exempel visas konfigurationsändringen från certifikatbaserad till certifikatfri autentisering.

Före (baserat på certifikat):

{
  "AzureAd": {
    "ClientCredentials": [
      {
        "SourceType": "KeyVault",
        "KeyVaultUrl": "https://your-keyvault.vault.azure.net",
        "KeyVaultCertificateName": "your-cert-name"
      }
    ]
  }
}

Efter (certifikatlös):

{
  "AzureAd": {
    "ClientCredentials": [
      {
        "SourceType": "SignedAssertionFromManagedIdentity",
        "ManagedIdentityClientId": "USER_ASSIGNED_MSI_CLIENT_ID"
      }
    ]
  }
}

Felsök vanliga fel

Använd följande vägledning för att diagnostisera och lösa problem med certifikatfri autentisering.

AADSTS70021: Ingen matchande federerad identifieringspost hittades

Orsaka: Ämnesidentifieraren i autentiseringsuppgiften för federerad identitet matchar inte objekt-ID:t för den hanterade identiteten (huvudnamn).

Upplösning:

  1. I Azure-portalen går du till resursen Hanterad identitet och kopierar Principalt ID (även kallat objekt-ID) från sidan Overview.
  2. Gå till din appregistrering >Certifikat och hemligheter>Federerade autentiseringsuppgifter.
  3. Kontrollera att fältet Ämnesidentifierare matchar huvud-ID:t exakt.
  4. Om värdena inte matchar, tar du bort autentiseringsuppgiften och återskapar den med rätt ämnesidentifierare.

AADSTS700024: Klientens påstående ligger inte inom dess giltiga tidsintervall

Orsaka: Den hanterade identitetstoken som används när den signerade försäkran har upphört att gälla eller så är systemklockan skev.

Upplösning:

  • Kontrollera att systemklockan på din Azure resurs är korrekt.
  • Starta om programmet för att framtvinga en ny begäran om hanterad identitetstoken.
  • Om du kör i en container kontrollerar du att containerns klocka är synkroniserad med värden.

ManagedIdentityException: Slutpunkten för hanterad identitet är inte tillgänglig

Cause: Programmet kan inte nå Azure Instansmetadatatjänst (IMDS) eller slutpunkten för hanterad identitetstoken.

Upplösning:

  • Bekräfta att programmet körs på en Azure beräkningsresurs som stöder hanterad identitet.
  • Kontrollera att den hanterade identiteten är aktiverad och tilldelad till beräkningsresursen.
  • För AKS kontrollerar du att webhooken för arbetsbelastningsidentiteten körs och att podden har rätt anteckning om tjänstkontot.
  • För lokal utveckling är detta fel förväntat. Använd en återställningskälla för autentiseringsuppgifter (se Migreringssteg).

AADSTS700016: Programmet hittades inte i katalogen

Orsak:ClientId i din konfiguration matchar inte en giltig appregistrering i den angivna hyresgästen.

Upplösning:

  • Kontrollera att ClientId matchar programidentifikator (klient-ID) för din appregistrering.
  • Kontrollera att TenantId matchar klientorganisationen där appen är registrerad.

Aktivera loggning för felsökning

Orsaka: Källordningen för autentiseringsuppgifter eller konfigurationsfelet kan leda till att biblioteket hoppar över FIC-autentiseringsuppgifterna.

Upplösning:

  1. Aktivera loggning i Microsoft. Identity.Web för att se detaljerade steg för tokenanskaffning. Följande kod konfigurerar loggning på felsökningsnivå för identitetsbiblioteken:

    builder.Services.AddLogging(logging =>
    {
        logging.AddConsole();
        logging.SetMinimumLevel(LogLevel.Debug);
        logging.AddFilter("Microsoft.Identity", LogLevel.Debug);
    });
    
  2. Granska loggarna efter meddelanden om vilken källa för autentiseringsuppgifter biblioteket försökte med och eventuella fel som returnerades.

Användartilldelad hanterad identitet har inte hämtats

Orsak: När flera användartilldelade hanterade identiteter tilldelas till en beräkningsresurs kan biblioteket använda fel identitet om ManagedIdentityClientId inte anges.

Upplösning:

  • Ange alltid egenskapen ManagedIdentityClientId när du använder en användartilldelad hanterad identitet.
  • Kontrollera att klient-ID:t matchar den identitet som du konfigurerade den federerade identitetsautentiseringsuppgiften för.

Granska säkerhetsfördelar

Certifikatfri autentisering med FIC ger betydande säkerhetsfördelar jämfört med traditionella autentiseringsbaserade metoder:

Inga hemligheter att läcka

Eftersom det inte finns några certifikatfiler, PFX-lösenord eller klienthemligheter i dina konfigurations- eller distributionsartefakter finns det inget för en angripare att extrahera. Även om en angripare får läsåtkomst till dina konfigurationsfiler kan de inte personifiera ditt program utifrån Azure.

Ingen rotation av autentiseringsuppgifter

Hanterade identitetstoken är kortlivade och uppdateras automatiskt av Azure-plattformen. Du behöver inte implementera rotationsscheman, övervaka förfallodatum eller samordna uppdateringar av autentiseringsuppgifter mellan distributioner.

Minskad angreppsyta

Slutpunkten för hanterad identitetstoken är endast tillgänglig från den specifika Azure resurs som identiteten tilldelas till. En angripare kan inte använda autentiseringsuppgifterna från en annan värd-, nätverks- eller molnmiljö.

Förenkling av efterlevnad

Utan långlivade autentiseringsuppgifter eliminerar du flera kategorier av efterlevnadsproblem:

  • Inga hemligheter som lagras i källkontroll, miljövariabler eller konfigurationsfiler.
  • Inget nyckelmaterial att granska, rotera eller återkalla.
  • Det finns ingen certifikatinfrastruktur (CA, förnyelseprocesser) att underhålla.

Skydd på djupet

Kombinera certifikatfri autentisering med andra Azure säkerhetsfunktioner för skiktskydd:

  • Azure RBAC: Kontrollera vilka identiteter som kan komma åt vilka resurser.
  • Villkorlig åtkomst: Tillämpa principer baserat på identitetsrisk, plats och enhetstillstånd.
  • Privata slutpunkter: begränsar nätverksåtkomsten till Azure-resurser.
  • Microsoft Defender för molnet: Övervaka misstänkta autentiseringsmönster.