Dela via


Ett webb-API som anropar webb-API:er: Kodkonfiguration

Den här artikeln beskriver hur du konfigurerar kod för en webb-API-app med hjälp av OAuth 2.0-auktoriseringskodflödet.

Microsoft rekommenderar att du använder NuGet-paketet Microsoft.Identity.Web när du utvecklar ett ASP.NET Core-skyddat API som anropar underordnade webb-API:er. Se Skyddat webb-API: Kodkonfiguration | Microsoft.Identity.Web för en snabb presentation av biblioteket i kontexten för ett webb-API.

Förutsättningar

Konfigurera appen

Välj ett språk för webb-API:et.

Klienthemligheter eller klientcertifikat

Eftersom webbappen nu anropar ett underordnat webb-API anger du en klienthemlighet eller ett klientcertifikat i appsettings.json-filen. Du kan också lägga till ett avsnitt som anger:

  • URL:en för det underordnade webb-API:et
  • De omfång som krävs för att anropa API:et

I följande exempel anger avsnittet GraphBeta dessa inställningar.

{
  "AzureAd": {
    "Instance": "https://login.microsoftonline.com/",
    "ClientId": "[Enter_the_Application_Id_Here]",
    "TenantId": "common",

   // To call an API
   "ClientCredentials": [
    {
      "SourceType": "ClientSecret",
      "ClientSecret":"[Enter_the_Client_Secret_Here]"
    }
  ]
 },
 "GraphBeta": {
    "BaseUrl": "https://graph.microsoft.com/beta",
    "Scopes": ["user.read"]
    }
}

Kommentar

Du kan föreslå en samling klientautentiseringsuppgifter, inklusive en lösning utan autentiseringsuppgifter som arbetsbelastningsidentitetsfederation för Azure Kubernetes. Tidigare versioner av Microsoft.Identity.Web uttryckte klienthemligheten i en enda egenskap "ClientSecret" i stället för "ClientCredentials". Detta stöds fortfarande för bakåtkompatibilitet, men du kan inte använda både egenskapen "ClientSecret" och samlingen "ClientCredentials".

I stället för en klienthemlighet kan du ange ett klientcertifikat. Följande kodfragment visar hur du använder ett certifikat som lagras i Azure Key Vault.

{
  "AzureAd": {
    "Instance": "https://login.microsoftonline.com/",
    "ClientId": "[Enter_the_Application_Id_Here]",
    "TenantId": "common",

   // To call an API
   "ClientCredentials": [
      {
        "SourceType": "KeyVault",
        "KeyVaultUrl": "https://msidentitywebsamples.vault.azure.net",
        "KeyVaultCertificateName": "MicrosoftIdentitySamplesCert"
      }
   ]
  },
  "GraphBeta": {
    "BaseUrl": "https://graph.microsoft.com/beta",
    "Scopes": ["user.read"]
  }
}

Varning

Om du glömmer att ändra Scopes till en matris visas null när du försöker använda omfången IDownstreamApi och IDownstreamApi ett anonymt (oautentiserat) anrop till det underordnade API:et, vilket resulterar i ett 401/unauthenticated.

Microsoft.Identity.Web innehåller flera sätt att beskriva certifikat, både efter konfiguration eller kod. Mer information finns i Microsoft.Identity.Web – Använda certifikat på GitHub.

Program.cs

using Microsoft.Identity.Web;

// ...
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddMicrosoftIdentityWebApi(Configuration, Configuration.GetSection("AzureAd"))
    .EnableTokenAcquisitionToCallDownstreamApi()
    .AddInMemoryTokenCaches();
// ...

Ett webb-API måste hämta en token för det underordnade API:et. Ange den genom att lägga till .EnableTokenAcquisitionToCallDownstreamApi() raden efter .AddMicrosoftIdentityWebApi(Configuration). Den här raden exponerar tjänsten ITokenAcquisition som kan användas i åtgärder för kontrollant/sidor.

En alternativ metod är dock att implementera en tokencache. Om du till exempel lägger till .AddInMemoryTokenCaches(), i Program.cs kan token cachelagras i minnet.

using Microsoft.Identity.Web;

// ...
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddMicrosoftIdentityWebApi(Configuration, Configuration.GetSection("AzureAd"))
    .EnableTokenAcquisitionToCallDownstreamApi()
    .AddInMemoryTokenCaches();
// ...

Microsoft.Identity.Web innehåller två mekanismer för att anropa ett underordnat webb-API från ett annat API. Vilket alternativ du väljer beror på om du vill anropa Microsoft Graph eller något annat API.

Alternativ 1: Anropa Microsoft Graph

Om du vill anropa Microsoft Graph gör Microsoft.Identity.Web att du kan använda GraphServiceClient (exponerad av Microsoft Graph SDK) direkt i API-åtgärderna.

Kommentar

Det finns ett pågående problem för Microsoft Graph SDK v5+. Mer information finns i GitHub-problemet.

Så här exponerar du Microsoft Graph:

  1. Lägg till NuGet-paketet Microsoft.Identity.Web.GraphServiceClient i projektet.
  2. Lägg till .AddMicrosoftGraph() efter .EnableTokenAcquisitionToCallDownstreamApi() i Program.cs. .AddMicrosoftGraph() har flera åsidosättningar. Med hjälp av åsidosättningen som tar ett konfigurationsavsnitt som en parameter blir koden:
using Microsoft.Identity.Web;

// ...
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddMicrosoftIdentityWebApi(Configuration, Configuration.GetSection("AzureAd"))
    .EnableTokenAcquisitionToCallDownstreamApi()
    .AddMicrosoftGraph(Configuration.GetSection("GraphBeta"))
    .AddInMemoryTokenCaches();
// ...

Alternativ 2: Anropa ett annat underordnat webb-API än Microsoft Graph

  1. Lägg till NuGet-paketet Microsoft.Identity.Web.DownstreamApi i projektet.
  2. Lägg till .AddDownstreamApi() efter .EnableTokenAcquisitionToCallDownstreamApi() i Program.cs. Koden blir:
using Microsoft.Identity.Web;

// ...
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddMicrosoftIdentityWebApi(Configuration, "AzureAd")
    .EnableTokenAcquisitionToCallDownstreamApi()
    .AddDownstreamApi("MyApi", Configuration.GetSection("MyApiScope"))
    .AddInMemoryTokenCaches();
// ...

var;

  • MyApi anger namnet på det underordnade webb-API:et som ditt webb-API avser att anropa
  • MyApiScope är det omfång som krävs för att webb-API:et ska kunna begäras för att interagera med det underordnade webb-API:et

Dessa värden representeras i din JSON som liknar följande kodfragment.

"DownstreamAPI": {
      "BaseUrl": "https://downstreamapi.contoso.com/",
      "Scopes": "user.read"
    },

Om webbappen behöver anropa en annan API-resurs upprepar du .AddDownstreamApi() metoden med relevant omfång enligt följande kodfragment:

using Microsoft.Identity.Web;

// ...
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddMicrosoftIdentityWebApi(Configuration, "AzureAd")
    .EnableTokenAcquisitionToCallDownstreamApi()
    .AddDownstreamApi("MyApi", Configuration.GetSection("MyApiScope"))
    .AddDownstreamApi("MyApi2", Configuration.GetSection("MyApi2Scope"))
    .AddInMemoryTokenCaches();
// ...

Observera att .EnableTokenAcquisitionToCallDownstreamApi anropas utan någon parameter, vilket innebär att åtkomsttoken hämtas precis i tid när kontrollanten begär token genom att ange omfånget.

Omfånget kan också skickas när du anropar .EnableTokenAcquisitionToCallDownstreamApi, vilket gör att webbappen hämtar token under den första användarinloggningen. Token hämtas sedan från cacheminnet när kontrollanten begär den.

På samma sätt som med webbappar kan du välja olika implementeringar av tokencache. Mer information finns i Microsoft identity web – Token cache serialization on GitHub (Microsoft identity web – Token cache serialization on GitHub).

Följande bild visar möjligheterna med Microsoft.Identity.Web och påverkan på Program.cs:

Blockdiagram som visar tjänstkonfigurationsalternativ i startpunkt C S för att anropa ett webb-API och ange en implementering av tokencache

Kommentar

Om du vill förstå kodexemplen fullt ut här bör du känna till grunderna för ASP.NET Core, särskilt beroendeinmatning och alternativ.

Du kan också se ett exempel på implementering av OBO-flöde i Node.js och Azure Functions.

Protokoll

Mer information om OBO-protokollet finns i flödet Microsofts identitetsplattform och OAuth 2.0 On-Behalf-Of.

Gå vidare