Sdílet prostřednictvím


Webové rozhraní API, které volá webová rozhraní API: Konfigurace kódu

Po dokončení registrace webového rozhraní API je možné nakonfigurovat kód aplikace. Konfigurace webového rozhraní API pro volání podřízeného webového rozhraní API vychází z kódu, který se používá při ochraně webového rozhraní API. Další informace najdete v tématu Chráněné webové rozhraní API: Konfigurace aplikace.

Microsoft.Identity.Web

Microsoft doporučuje použít balíček NuGet Microsoft.Identity.Web při vývoji rozhraní API chráněného ASP.NET Core, které volá podřízená webová rozhraní API. Viz Chráněné webové rozhraní API: Konfigurace kódu | Microsoft.Identity.Web pro rychlou prezentaci této knihovny v kontextu webového rozhraní API.

Tajné klíče klienta nebo klientské certifikáty

Vzhledem k tomu, že vaše webová aplikace teď volá podřízené webové rozhraní API, zadejte tajný klíč klienta nebo klientský certifikát do souboru appsettings.json . Můžete také přidat oddíl, který určuje:

  • Adresa URL podřízeného webového rozhraní API
  • Obory vyžadované pro volání rozhraní API

V následujícím příkladu GraphBeta část určuje tato nastavení.

{
  "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"]
    }
}

Poznámka:

Můžete navrhnout kolekci přihlašovacích údajů klienta, včetně řešení bez přihlašovacích údajů, jako je federace identit úloh pro Azure Kubernetes. Předchozí verze Microsoft.Identity.Web vyjádřily tajný klíč klienta v jedné vlastnosti ClientSecret místo ClientCredentials. Tato funkce je stále podporovaná pro zpětnou kompatibilitu, ale nemůžete použít vlastnost ClientSecret i kolekci ClientCredentials.

Místo tajného klíče klienta můžete zadat klientský certifikát. Následující fragment kódu ukazuje použití certifikátu uloženého ve službě 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"]
  }
}

Upozorňující

Pokud zapomenete změnit Scopes pole, při pokusu o použití IDownstreamApi oborů se zobrazí hodnota null a IDownstreamApi pokusíte se anonymní (neověřené) volání do podřízeného rozhraní API, což bude mít za 401/unauthenticatednásledek .

Microsoft.Identity.Web nabízí několik způsobů, jak popsat certifikáty podle konfigurace nebo kódu. Podrobnosti najdete v tématu Microsoft.Identity.Web – Použití certifikátů na GitHubu.

Program.cs

using Microsoft.Identity.Web;

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

Webové rozhraní API potřebuje získat token pro podřízené rozhraní API. Zadejte ji přidáním .EnableTokenAcquisitionToCallDownstreamApi() řádku za .AddMicrosoftIdentityWebApi(Configuration). Tento řádek zveřejňuje ITokenAcquisition službu, kterou lze použít v akcích kontroleru nebo stránek.

Alternativní metodou je však implementace mezipaměti tokenů. Například přidání .AddInMemoryTokenCaches(), do Program.cs umožňuje, aby token byl uložen do mezipaměti v paměti.

using Microsoft.Identity.Web;

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

Microsoft.Identity.Web poskytuje dva mechanismy pro volání podřízeného webového rozhraní API z jiného rozhraní API. Možnost, kterou zvolíte, závisí na tom, jestli chcete volat Microsoft Graph nebo jiné rozhraní API.

Možnost 1: Volání Microsoft Graphu

Pokud chcete volat Microsoft Graph, Microsoft.Identity.Web umožňuje přímo používat GraphServiceClient (vystavené sadou Microsoft Graph SDK) v akcích rozhraní API.

Poznámka:

Stále dochází k problému se sadou Microsoft Graph SDK verze 5 nebo novější. Další informace najdete v problému s GitHubem.

Zveřejnění Microsoft Graphu:

  1. Přidejte do projektu balíček NuGet Microsoft.Identity.Web.GraphServiceClient .
  2. Přidejte .AddMicrosoftGraph() za .EnableTokenAcquisitionToCallDownstreamApi() Program.cs. .AddMicrosoftGraph() má několik přepsání. Pomocí přepsání, které jako parametr přebírá oddíl konfigurace, se kód stane:
using Microsoft.Identity.Web;

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

Možnost 2: Volání podřízeného webového rozhraní API jiného než Microsoft Graphu

  1. Přidejte do projektu balíček NuGet Microsoft.Identity.Web.DownstreamApi .
  2. Přidejte .AddDownstreamApi() za .EnableTokenAcquisitionToCallDownstreamApi() Program.cs. Kód se stane:
using Microsoft.Identity.Web;

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

Kde;

  • MyApi označuje název podřízeného webového rozhraní API, které vaše webové rozhraní API hodlá volat.
  • MyApiScope je rozsah potřebný k tomu, aby vaše webové rozhraní API požadovalo interakci s podřízeným webovým rozhraním API.

Tyto hodnoty budou reprezentovány ve formátu JSON, které budou podobné následujícímu fragmentu kódu.

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

Pokud webová aplikace potřebuje volat jiný prostředek rozhraní API, opakujte .AddDownstreamApi() metodu s příslušným oborem, jak je znázorněno v následujícím fragmentu kódu:

using Microsoft.Identity.Web;

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

Všimněte si, že .EnableTokenAcquisitionToCallDownstreamApi se volá bez jakéhokoli parametru, což znamená, že přístupový token se získá včas, protože kontroler požaduje token zadáním oboru.

Obor se dá předat také při volání .EnableTokenAcquisitionToCallDownstreamApi, což způsobí, že webová aplikace získá token během počátečního přihlášení uživatele sám. Token se pak natáhne z mezipaměti, když ho kontroler požádá.

Podobně jako u webových aplikací je možné zvolit různé implementace mezipaměti tokenů. Podrobnosti najdete na webu Microsoft Identity – Serializace mezipaměti tokenů na GitHubu.

Následující obrázek ukazuje možnosti Microsoft.Identity.Web a dopad na Program.cs:

Block diagram showing service configuration options in startup dot C S for calling a web API and specifying a token cache implementation

Poznámka:

Abyste plně porozuměli příkladům kódu, seznamte se se základy ASP.NET Core a zejména injektážem závislostí a možnostmi.

Můžete si také prohlédnout příklad implementace toku OBO v Node.js a Azure Functions.

Protokol

Další informace o protokolu OBO najdete v toku Microsoft Identity Platform a OAuth 2.0 On-Behalf-Of.

Další kroky

Přejděte k dalšímu článku v tomto scénáři a získejte token aplikace.