Získání tokenů pro volání webového rozhraní API pomocí aplikace démona

Po vytvoření důvěrné klientské aplikace můžete získat token pro aplikaci voláním AcquireTokenForClient, předáním oboru a případně vynucením aktualizace tokenu.

Obory, které se mají vyžádat

Obor, který se má vyžádat pro tok přihlašovacích údajů klienta, je název prostředku následovaný /.default. Tato notace říká Microsoftu Entra ID, aby během registrace aplikace používalo staticky deklarovaná oprávnění na úrovni aplikace. Tato oprávnění rozhraní API musí také udělit správce tenanta.

Tady je příklad definování rozsahů webového rozhraní API v rámci konfigurace v souboru appsettings.json. Tento příklad pochází z ukázky kódu démona konzoly .NET na GitHubu.

{
    "AzureAd": {
        // Same AzureAd section as before.
    },

    "MyWebApi": {
        "BaseUrl": "https://localhost:44372/",
        "RelativePath": "api/TodoList",
        "RequestAppToken": true,
        "Scopes": [ "[Enter here the scopes for your web API]" ]
    }
}

Prostředky Azure AD (v1.0)

Obor použitý pro přihlašovací údaje klienta by měl vždy být ID prostředku následované /.default.

Důležité

Když MSAL požádá o přístupový token pro prostředek, který přijímá přístupový token verze 1.0, Microsoft Entra ID parsuje požadovanou cílovou skupinu z požadovaného oboru tím, že převezme vše před posledním lomítkem a použije ho jako identifikátor prostředku. Pokud tedy jako Azure SQL Database (https://database.windows.net), prostředek očekává cílovou skupinu, která končí lomítkem (pro Azure SQL Database, https://database.windows.net/), budete muset požádat o rozsah https://database.windows.net//.default. (Všimněte si dvojitého lomítka.) Viz také MSAL.NET problém č. 747: Resource url's trailing slash is omitted, which caused sql auth failure.

AcquireTokenForClient API

Pokud chcete získat token pro aplikaci, použijte AcquireTokenForClient nebo jeho ekvivalent v závislosti na platformě.

S Microsoft.Identity.Web nepotřebujete získat token. Rozhraní API vyšší úrovně můžete použít, jak vidíte při volání webového rozhraní API z aplikace démona. Pokud ale používáte sadu SDK, která vyžaduje token, následující fragment kódu ukazuje, jak tento token získat.

using Microsoft.Extensions.DependencyInjection;
using Microsoft.Identity.Abstractions;
using Microsoft.Identity.Web;

// In the Program.cs, acquire a token for your downstream API

var tokenAcquirerFactory = TokenAcquirerFactory.GetDefaultInstance();
ITokenAcquirer acquirer = tokenAcquirerFactory.GetTokenAcquirer();
AcquireTokenResult tokenResult = await acquirer.GetTokenForUserAsync(new[] { "https://graph.microsoft.com/.default" });
string accessToken = tokenResult.AccessToken;

Protokol

Pokud ještě nemáte knihovnu pro zvolený jazyk, můžete protokol použít přímo:

První případ: Přístup k žádosti o token pomocí sdíleného tajného kódu

POST /{tenant}/oauth2/v2.0/token HTTP/1.1           //Line breaks for clarity.
Host: login.microsoftonline.com
Content-Type: application/x-www-form-urlencoded

client_id=00001111-aaaa-2222-bbbb-3333cccc4444
&scope=https%3A%2F%2Fgraph.microsoft.com%2F.default
&client_secret=A1b-C2d_E3f.H4i,J5k?L6m!N7o-P8q_R9s.T0u
&grant_type=client_credentials

Druhý případ: Přístup k žádosti o token pomocí certifikátu

POST /{tenant}/oauth2/v2.0/token HTTP/1.1               // Line breaks for clarity.
Host: login.microsoftonline.com
Content-Type: application/x-www-form-urlencoded

scope=https%3A%2F%2Fgraph.microsoft.com%2F.default
&client_id=11112222-bbbb-3333-cccc-4444dddd5555
&client_assertion_type=urn%3Aietf%3Aparams%3Aoauth%3Aclient-assertion-type%3Ajwt-bearer
&client_assertion=aaaaaaaa-0b0b-...
&grant_type=client_credentials

Další informace najdete v dokumentaci k protokolu: Microsoft Identity Platform a tok přihlašovacích údajů klienta OAuth 2.0.

Řešení problému

Použili jste obor resource/.default?

Pokud se zobrazí chybová zpráva s informací, že jste použili neplatný obor, pravděpodobně jste obor nepoužili resource/.default .

Pokud se při volání rozhraní API zobrazí nedostatečná oprávnění k dokončení operace , musí správce tenanta aplikaci udělit oprávnění.

Pokud neudělíte souhlas správce s vaší aplikací, dojde k následující chybě:

Failed to call the web API: Forbidden
Content: {
  "error": {
    "code": "Authorization_RequestDenied",
    "message": "Insufficient privileges to complete the operation.",
    "innerError": {
      "request-id": "<guid>",
      "date": "<date>"
    }
  }
}

V závislosti na roli vyberte jednu z následujících možností.

Globální správce tenanta

Pokud chcete globálního správce tenanta, přejděte do podnikových aplikací v Centru pro správu Microsoft Entra. Vyberte registraci aplikace a v části Zabezpečení v levém podokně vyberte Oprávnění. Pak vyberte velké tlačítko s popiskem Udělení souhlasu správce pro {Název tenanta} (kde {Název tenanta} je název adresáře).

Standardní uživatel

Pro standardního uživatele vašeho tenanta požádejte globálního Správa istratora o udělení souhlasu správce s aplikací. Uděláte to tak, že správci poskytnete následující adresu URL:

https://login.microsoftonline.com/Enter_the_Tenant_Id_Here/adminconsent?client_id=Enter_the_Application_Id_Here

V adrese URL:

  • Nahraďte Enter_the_Tenant_Id_Here ID tenanta nebo názvem tenanta (například contoso.microsoft.com).
  • Enter_the_Application_Id_Here je ID aplikace (klienta) registrované aplikace.

Tato chyba AADSTS50011: No reply address is registered for the application se může zobrazit po udělení souhlasu s aplikací pomocí předchozí adresy URL. K této chybě dochází, protože aplikace a adresa URL nemají identifikátor URI přesměrování. To můžete ignorovat.

Voláte vlastní rozhraní API?

Pokud vaše aplikace démona volá vlastní webové rozhraní API a nemohli jste přidat oprávnění aplikace k registraci aplikace démona, musíte do registrace aplikace webového rozhraní API přidat role aplikace.

Další kroky

Přejděte k dalšímu článku v tomto scénáři volání webového rozhraní API.