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
.
Zapomněli jste poskytnout souhlas správce? Aplikace démona ji potřebují!
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í.
Správce cloudové aplikace
Pokud chcete správce cloudových aplikací, 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 správce cloudových aplikací, aby aplikaci udělil souhlas správce. 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říkladcontoso.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.