Klientbibliotek för appautentisering för .NET – version 1.6.0

Anteckning

Microsoft.Azure.Services.AppAuthentication har dragits tillbaka och stöds inte längre eller underhålls inte. Det ersätts av Azure Identity-klientbiblioteket som är tillgängligt för .NET, Java, TypeScript och Python. Information om hur du migrerar till Azure Identityfinns här: Vägledning för AppAuthentication till Azure.Identity Migration.

Om du vill autentisera till Azure-tjänster med tjänstens huvudnamn behöver du en autentiseringsuppgift för Azure Active Directory (Azure AD), antingen en delad hemlighet eller ett certifikat.

Det kan vara svårt att hantera sådana autentiseringsuppgifter. Det är frestande att paketera autentiseringsuppgifter i en app genom att inkludera dem i käll- eller konfigurationsfiler. För Microsoft.Azure.Services.AppAuthentication .NET-biblioteket förenklar det här problemet. Den använder utvecklarens autentiseringsuppgifter för att autentisera under lokal utveckling. När lösningen senare distribueras till Azure växlar biblioteket automatiskt till programautentiseringsuppgifter. Att använda autentiseringsuppgifter för utvecklare under lokal utveckling är säkrare eftersom du inte behöver skapa Azure AD autentiseringsuppgifter eller dela autentiseringsuppgifter mellan utvecklare.

Biblioteket Microsoft.Azure.Services.AppAuthentication hanterar autentisering automatiskt, vilket i sin tur gör att du kan fokusera på din lösning i stället för dina autentiseringsuppgifter. Den stöder lokal utveckling med Microsoft Visual Studio, Azure CLI eller Azure AD integrerad autentisering. När biblioteket distribueras till en Azure-resurs som stöder en hanterad identitet använder det automatiskt hanterade identiteter för Azure-resurser. Inga kod- eller konfigurationsändringar krävs. Biblioteket stöder också direkt användning av Azure AD klientautentiseringsuppgifter när en hanterad identitet inte är tillgänglig eller när utvecklarens säkerhetskontext inte kan fastställas under den lokala utvecklingen.

Källkod | Paket (nuget) | Dokumentation om Azure Active Directory

Förutsättningar

  • Visual Studio 2019 eller Visual Studio 2017 v15.5.

  • Appautentiseringstillägget för Visual Studio finns som ett separat tillägg för Visual Studio 2017 Update 5 och paketeras med produkten i uppdatering 6 och senare. Med uppdatering 6 eller senare kan du verifiera installationen av appautentiseringstillägget genom att välja Azure Development-verktyg inifrån Installationsprogrammet för Visual Studio.

Använda biblioteket

För .NET-program är det enklaste sättet att arbeta med en hanterad identitet via Microsoft.Azure.Services.AppAuthentication paketet. Så här kommer du igång:

  1. Välj Verktyg>NuGet Package Manager>Hantera NuGet-paket för lösning för att lägga till referenser till NuGet-paketen Microsoft.Azure.Services.AppAuthentication och Microsoft.Azure.KeyVault i projektet.

  2. Använd AzureServiceTokenProvider för att förenkla begäran om åtkomsttoken för dina Azure-klienter, som i exemplen nedan:

    using Microsoft.Azure.Services.AppAuthentication;
    using Microsoft.Azure.KeyVault;
    using System.Data.SqlClient
    
    // Use AzureServiceTokenProvider’s built-in callback for KeyVaultClient
    var azureServiceTokenProvider = new AzureServiceTokenProvider();
    var kv = new KeyVaultClient(new KeyVaultClient.AuthenticationCallback(azureServiceTokenProvider.KeyVaultTokenCallback));
    
    // Request an access token for SqlConnection
    sqlConnection = new SqlConnection(YourConnectionString)) 
    { 
        sqlConnection.AccessToken = await azureServiceTokenProvider.GetAccessTokenAsync("https://database.windows.net"); 
        sqlConnection.Open(); 
    } 
    

Den trådsäkra AzureServiceTokenProvider klassen cachelagrar token i minnet och hämtar den från Azure AD strax före förfallodatumet. Det innebär att du aldrig behöver kontrollera förfallodatumet för token innan du anropar GetAccessTokenAsync metoden.

Metoden GetAccessTokenAsync kräver en resursidentifierare. Mer information om Microsoft Azure-tjänster finns i Vad är hanterade identiteter för Azure-resurser.

Autentisering för lokal utveckling

För lokal utveckling finns det två primära autentiseringsscenarier: autentisera till Azure-tjänster och autentisera till anpassade tjänster.

Autentisera till Azure Services

Lokala datorer stöder inte hanterade identiteter för Azure-resurser. Microsoft.Azure.Services.AppAuthentication Därför använder biblioteket dina autentiseringsuppgifter för utvecklare för att köras i din lokala utvecklingsmiljö. När lösningen distribueras till Azure använder biblioteket en hanterad identitet för att växla till ett OAuth 2.0-flöde för tilldelning av klientautentiseringsuppgifter. Den här metoden innebär att du kan testa samma kod lokalt och via fjärranslutning utan att oroa dig.

För lokal utveckling AzureServiceTokenProvider hämtar token med visual studio, Azure-kommandoradsgränssnitt (CLI) eller Azure AD integrerad autentisering. Varje alternativ provas sekventiellt och biblioteket använder det första alternativet som lyckas. Om inget alternativ fungerar genereras ett AzureServiceTokenProviderException undantag med detaljerad information.

Autentisera med Visual Studio

Så här autentiserar du med hjälp av Visual Studio:

  1. Logga in i Visual Studio och använd Verktygsalternativ> för att öppna Alternativ.

  2. Välj Azure Service Authentication, välj ett konto för lokal utveckling och välj OK.

Om du stöter på problem med att använda Visual Studio, till exempel fel som involverar tokenproviderfilen, bör du noggrant granska föregående steg.

Du kan behöva autentisera din utvecklartoken igen. Det gör du genom att välja Verktygsalternativ> och sedan Azure Service Authentication. Leta efter en återautentiseringslänk under det valda kontot. Välj den för att autentisera.

Autentisera med Azure CLI

Om du vill använda Azure CLI för lokal utveckling måste du ha version Azure CLI v2.0.12 eller senare.

Med Azure CLI gör du så här:

  1. Sök efter Azure CLI i Aktivitetsfältet i Windows för att öppna Microsoft Azure-kommandotolken.

  2. Logga in på Azure Portal: az login för att logga in på Azure.

  3. Verifiera åtkomsten genom att ange az account get-access-token --resource https://vault.azure.net. Om du får ett fel kontrollerar du att rätt version av Azure CLI är korrekt installerad.

    Om Azure CLI inte är installerat i standardkatalogen kan du få en felrapportering som AzureServiceTokenProvider inte kan hitta sökvägen för Azure CLI. Använd miljövariabeln AzureCLIPath för att definiera Installationsmappen för Azure CLI. AzureServiceTokenProvider lägger till katalogen som anges i Miljövariabeln AzureCLIPath till variabeln Sökvägsmiljö vid behov.

  4. Om du är inloggad i Azure CLI med flera konton eller om ditt konto har åtkomst till flera prenumerationer måste du ange vilken prenumeration som ska användas. Ange kommandot az account set --subscription .

Det här kommandot genererar endast utdata vid fel. Om du vill verifiera de aktuella kontoinställningarna anger du kommandot az account list.

Autentisera med Azure AD-autentisering

Om du vill använda Azure AD autentisering kontrollerar du att:

Autentisera till anpassade tjänster

När en tjänst anropar Azure-tjänster fungerar de föregående stegen eftersom Azure-tjänster tillåter åtkomst till både användare och program.

När du skapar en tjänst som anropar en anpassad tjänst använder du Azure AD klientautentiseringsuppgifter för lokal utvecklingsautentisering. Det finns två alternativ:

  • Använd tjänstens huvudnamn för att logga in på Azure:

    1. Skapa ett huvudnamn för tjänsten. Mer information finns i Skapa ett Huvudnamn för Azure-tjänsten med Azure CLI.

    2. Använd Azure CLI för att logga in med följande kommando:

      az login --service-principal -u <principal-id> --password <password> --tenant <tenant-id> --allow-no-subscriptions
      

      Eftersom tjänstens huvudnamn kanske inte har åtkomst till en prenumeration använder du --allow-no-subscriptions argumentet .

  • Använd miljövariabler för att ange information om tjänstens huvudnamn. Mer information finns i Köra programmet med ett huvudnamn för tjänsten.

När du har loggat in på Azure AzureServiceTokenProvider använder du tjänstens huvudnamn för att hämta en token för lokal utveckling.

Den här metoden gäller endast för lokal utveckling. När din lösning distribueras till Azure växlar biblioteket till en hanterad identitet för autentisering.

Köra programmet med hanterad identitet eller användartilldelad identitet

När du kör koden på en Azure App Service eller en virtuell Azure-dator med en aktiverad hanterad identitet använder biblioteket automatiskt den hanterade identiteten. Inga kodändringar krävs, men den hanterade identiteten måste ha behörighet för de resurser som den försöker komma åt. Åtkomstprinciper krävs till exempel för att en hanterad identitet ska få åtkomst till hemligheter i ett nyckelvalv.

Du kan också autentisera med en användartilldelad identitet. Mer information om användartilldelade identiteter finns i Om hanterade identiteter för Azure-resurser. Om du vill autentisera med en användartilldelad identitet måste du ange klient-ID för den användartilldelade identiteten i anslutningssträngen. Anslutningssträngen anges i Stöd för anslutningssträng.

Köra programmet med hjälp av tjänstens huvudnamn

Det kan vara nödvändigt att skapa en Azure AD klientautentiseringsuppgifter för att autentisera. Den här situationen kan inträffa i följande exempel:

  • Koden körs i en lokal utvecklingsmiljö, men inte under utvecklarens identitet. Service Fabric använder till exempel NetworkService-kontot för lokal utveckling.

  • Koden körs i en lokal utvecklingsmiljö och du autentiserar till en anpassad tjänst, så att du inte kan använda utvecklaridentiteten.

  • Koden körs på en Azure-beräkningsresurs som ännu inte stöder hanterade identiteter för Azure-resurser, till exempel Azure Batch.

Det finns tre primära metoder för att använda tjänstens huvudnamn för att köra programmet. Om du vill använda någon av dem måste du först skapa ett huvudnamn för tjänsten. Mer information finns i Skapa ett huvudnamn för Azure-tjänsten med Azure CLI.

Använda ett certifikat i det lokala nyckelarkivet för att logga in på Azure AD

  1. Skapa ett certifikat för tjänstens huvudnamn med hjälp av kommandot Azure CLI az ad sp create-for-rbac .

    az ad sp create-for-rbac --create-cert
    

    Det här kommandot skapar en .pem-fil (privat nyckel) som lagras i din hemkatalog. Konvertera .pem-filen till ett PFX-certifikat med kommandot :

    openssl pkcs12 -export -in test.pem -out test.pfx
    
  2. Ange följande värde för en miljövariabel med namnet AzureServicesAuthConnectionString :

    RunAs=App;AppId={AppId};TenantId={TenantId};CertificateThumbprint={Thumbprint};
          CertificateStoreLocation={CertificateStore}
    

    Ersätt {AppId}, {TenantId} och {Thumbprint} med värden som genererades i steg 1. Ersätt {CertificateStore} med Antingen LocalMachine' eller CurrentUser, baserat på din distributionsplan.

  3. Kör appen.

Använd en delad hemlighetsautentiseringsuppgift för att logga in på Azure AD

  1. Skapa ett certifikat för tjänstens huvudnamn med ett lösenord med hjälp av kommandot Azure CLI az ad sp create-for-rbac med parametern --sdk-auth.

    az ad sp create-for-rbac --sdk-auth
    
  2. Ange följande värde för en miljövariabel med namnet AzureServicesAuthConnectionString :

    RunAs=App;AppId={AppId};TenantId={TenantId};AppKey={ClientSecret}
    

    Ersätt {AppId}, {TenantId} och {ClientSecret} med värden som genererades i steg 1.

  3. Kör appen.

När allt har konfigurerats korrekt behövs inga ytterligare kodändringar. AzureServiceTokenProvideranvänder miljövariabeln och certifikatet för att autentisera till Azure AD.

Använda ett certifikat i Key Vault för att logga in på Azure AD

Med det här alternativet kan du lagra klientcertifikatet för tjänstens huvudnamn i Key Vault och använda det för autentisering med tjänstens huvudnamn. Du kan använda det här alternativet för följande scenarier:

  • Lokal autentisering, där du vill autentisera med hjälp av ett explicit tjänsthuvudnamn och vill behålla autentiseringsuppgifterna för tjänstens huvudnamn på ett säkert sätt i ett nyckelvalv. Utvecklarkontot måste ha åtkomst till nyckelvalvet.

  • Autentisering från Azure där du vill använda explicita autentiseringsuppgifter och vill skydda autentiseringsuppgifterna för tjänstens huvudnamn i ett nyckelvalv. Du kan använda det här alternativet för ett scenario mellan klientorganisationer. Hanterad identitet måste ha åtkomst till nyckelvalvet.

Den hanterade identiteten eller utvecklaridentiteten måste ha behörighet att hämta klientcertifikatet från Key Vault. AppAuthentication-biblioteket använder det hämtade certifikatet som tjänstens huvudnamns klientautentiseringsuppgift.

Så här använder du ett klientcertifikat för autentisering av tjänstens huvudnamn:

  1. Skapa ett certifikat för tjänstens huvudnamn och lagra det automatiskt i Key Vault. Använd Azure CLI az ad sp create-for-rbac --keyvault <keyvaultname> --cert <certificatename> --create-cert --skip-assignment command:

    az ad sp create-for-rbac --keyvault <keyvaultname> --cert <certificatename> --create-cert --skip-assignment
    

    Certifikatidentifieraren är en URL i formatet https://<keyvaultname>.vault.azure.net/secrets/<certificatename>

  2. Ersätt {KeyVaultCertificateSecretIdentifier} i den här anslutningssträngen med certifikatidentifieraren:

    RunAs=App;AppId={TestAppId};KeyVaultCertificateSecretIdentifier={KeyVaultCertificateSecretIdentifier}
    

    Om ditt nyckelvalv till exempel kallades myKeyVault och du skapade ett certifikat med namnet myCert skulle certifikatidentifieraren vara:

    RunAs=App;AppId={TestAppId};KeyVaultCertificateSecretIdentifier=https://myKeyVault.vault.azure.net/secrets/myCert
    

Stöd för anslutningssträngar

Som standard AzureServiceTokenProvider provar du följande autentiseringsmetoder för att hämta en token:

Om du vill styra processen använder du en anslutningssträng som skickas till AzureServiceTokenProvider konstruktorn eller anges i miljövariabeln AzureServicesAuthConnectionString . Följande alternativ stöds:

Alternativ för anslutningssträng Scenario Kommentarer
RunAs=Developer;DeveloperTool=AzureCli Lokal utveckling AzureServiceTokenProvider använder AzureCli för att hämta token.
RunAs=Developer;DeveloperTool=VisualStudio Lokal utveckling AzureServiceTokenProvider använder Visual Studio för att hämta token.
RunAs=CurrentUser Lokal utveckling Stöds inte i .NET Core. AzureServiceTokenProvideranvänder Azure AD integrerad autentisering för att hämta token.
RunAs=App Hanterade identiteter för Azure-resurser AzureServiceTokenProvider använder en hanterad identitet för att hämta token.
RunAs=App;AppId={ClientId of user-assigned identity} Användartilldelad identitet för Azure-resurser AzureServiceTokenProvider använder en användartilldelad identitet för att hämta token.
RunAs=App;AppId={TestAppId};KeyVaultCertificateSecretIdentifier={KeyVaultCertificateSecretIdentifier} Autentisering med anpassade tjänster KeyVaultCertificateSecretIdentifier är certifikatets hemliga identifierare.
RunAs=App;AppId={AppId};TenantId={TenantId};CertificateThumbprint={Thumbprint};CertificateStoreLocation={LocalMachine or CurrentUser} Tjänstens huvudnamn AzureServiceTokenProvideranvänder certifikat för att hämta token från Azure AD.
RunAs=App;AppId={AppId};TenantId={TenantId};CertificateSubjectName={Subject};CertificateStoreLocation={LocalMachine or CurrentUser} Tjänstens huvudnamn AzureServiceTokenProvideranvänder certifikat för att hämta token från Azure AD
RunAs=App;AppId={AppId};TenantId={TenantId};AppKey={ClientSecret} Tjänstens huvudnamn AzureServiceTokenProvideranvänder hemlighet för att hämta token från Azure AD.

Exempel

Om du vill se biblioteket Microsoft.Azure.Services.AppAuthentication i praktiken läser du följande kodexempel.

Felsökning av appauthentication

Vanliga problem under lokal utveckling

Azure CLI är inte installerat, du är inte inloggad eller så har du inte den senaste versionen

Kör az account get-access-token för att se om Azure CLI visar en token åt dig. Om det står att inget sådant program hittades installerar du den senaste versionen av Azure CLI. Du kan bli uppmanad att logga in.

AzureServiceTokenProvider kan inte hitta sökvägen för Azure CLI

AzureServiceTokenProvider söker efter Azure CLI på standardinstallationsplatserna. Om det inte går att hitta Azure CLI anger du miljövariabeln AzureCLIPath till installationsmappen för Azure CLI. AzureServiceTokenProvider lägger till miljövariabeln i miljövariabeln Sökväg.

Du är inloggad i Azure CLI med flera konton, samma konto har åtkomst till prenumerationer i flera klientorganisationer eller så får du ett felmeddelande om nekad åtkomst när du försöker göra anrop under lokal utveckling

Använd Azure CLI och ställ in standardprenumerationen på en prenumeration som har det konto som du vill använda. Prenumerationen måste finnas i samma klientorganisation som den resurs som du vill komma åt: az account set --subscription [subscription-id]. Om inga utdata visas lyckades det. Kontrollera att rätt konto nu är standard med az account list.

Vanliga problem i miljöer

Obehörig åtkomst, åtkomst nekad, förbjudet eller liknande fel

Huvudkontot som används har inte åtkomst till resursen som det försöker få åtkomst till. Bevilja antingen ditt användarkonto eller App Service MSI-deltagare åtkomst till en resurs. Vilken beror på om du kör exemplet på din lokala dator eller distribueras i Azure till din App Service. Vissa resurser, till exempel nyckelvalv, har också egna åtkomstprinciper som du använder för att bevilja åtkomst till huvudkonton, till exempel användare, appar och grupper.

Vanliga problem vid distribution till Azure App Service

Hanterad identitet har inte konfigurerats på App Service

Kontrollera miljövariablerna MSI_ENDPOINT och MSI_SECRET finns med hjälp av Kudu-felsökningskonsolen. Om dessa miljövariabler inte finns aktiveras inte hanterad identitet på App Service.

Vanliga problem när de distribueras lokalt med IIS

Det går inte att hämta token vid felsökning av appen i IIS

Som standard körs AppAuth i en annan användarkontext i IIS. Det är därför den inte har åtkomst att använda din utvecklaridentitet för att hämta åtkomsttoken. Du kan konfigurera IIS att köras med användarkontexten med följande två steg:

  • Konfigurera programpoolen för webbappen så att den körs som ditt aktuella användarkonto. Se mer information här

  • Konfigurera "setProfileEnvironment" till "True". Se mer information här.

    • Gå till %windir%\System32\inetsrv\config\applicationHost.config
    • Sök efter "setProfileEnvironment". Om den är inställd på "False" ändrar du den till "True". Om det inte finns lägger du till det som ett attribut till processModel-elementet (/configuration/system.applicationHost/applicationPools/applicationPoolDefaults/processModel/@setProfileEnvironment) och ställer in det på "True".
  • Läs mer om hanterade identiteter för Azure-resurser.

  • Läs mer om Azure AD autentiseringsscenarier.