Memperoleh token untuk memanggil API web menggunakan aplikasi daemon
Setelah Anda membuat aplikasi klien rahasia, Anda dapat memperoleh token untuk aplikasi dengan memanggil AcquireTokenForClient
, melewati cakupan, dan secara opsional memaksa refresh token.
Cakupan untuk permintaan
Cakupan untuk meminta aliran info masuk klien adalah nama sumber daya yang diikuti oleh dengan /.default
. Notasi ini memberi tahu Microsoft Entra ID untuk menggunakan izin tingkat aplikasi yang dinyatakan secara statis selama pendaftaran aplikasi. Selain itu, izin API berikut harus diberikan oleh administrator penyewa.
Berikut adalah contoh menentukan cakupan untuk API web sebagai bagian dari konfigurasi dalam file appsettings.json. Contoh ini diambil dari sampel kode daemon konsol .NET di GitHub.
{
"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]" ]
}
}
Sumber daya Microsoft Azure AD (v1.0)
Cakupan yang digunakan untuk info masuk klien harus selalu menjadi ID sumber daya diikuti oleh /.default
.
Penting
Ketika MSAL meminta token akses untuk sumber daya yang menerima token akses versi 1.0, ID Microsoft Entra mengurai audiens yang diinginkan dari cakupan yang diminta dengan mengambil semuanya sebelum garis miring terakhir dan menggunakannya sebagai pengidentifikasi sumber daya.
Jika, seperti Azure SQL Database (https://database.windows.net
), sumber daya mengharapkan audiens yang diakhiri dengan garis miring (untuk Azure SQL Database, https://database.windows.net/
), Anda harus meminta cakupan https://database.windows.net//.default
. (Perhatikan garis miring ganda.) Lihat juga masalah MSAL.NET #747: Resource url's trailing slash is omitted, which caused sql auth failure
.
API AcquireTokenForClient
Untuk memperoleh token untuk aplikasi, gunakan AcquireTokenForClient
atau yang setara, tergantung pada platform.
Dengan Microsoft.Identity.Web, Anda tidak perlu memperoleh token. Anda dapat menggunakan API tingkat yang lebih tinggi, seperti yang Anda lihat di Memanggil API web dari aplikasi daemon. Namun, jika Anda menggunakan SDK yang memerlukan token, cuplikan kode berikut menunjukkan cara mendapatkan token ini.
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
Jika Anda belum memiliki pustaka untuk bahasa yang dipilih, Anda mungkin ingin menggunakan protokol secara langsung:
Kasus pertama: Mengakses permintaan token dengan menggunakan rahasia bersama
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
Kasus kedua: Mengakses permintaan token dengan menggunakan sertifikat
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
Untuk informasi selengkapnya, lihat dokumentasi protokol: Platform identitas Microsoft dan alur kredensial klien OAuth 2.0.
Pemecahan Masalah
Apakah Anda menggunakan cakupan resource/.default?
Jika Anda mendapatkan pesan kesalahan yang memberi tahu bahwa Anda menggunakan cakupan yang tidak valid, Anda mungkin tidak menggunakan cakupan resource/.default
.
Apakah Anda lupa memberikan persetujuan admin? Aplikasi Daemon membutuhkannya!
Jika Anda mendapatkan kesalahan hak istimewa yang tidak mencukupi untuk memanggil API, administrator penyewa perlu memberikan izin ke aplikasi.
Jika Anda tidak memberikan persetujuan admin untuk aplikasi, Anda akan mengalami kesalahan berikut:
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>"
}
}
}
Pilih salah satu opsi berikut, tergantung pada perannya.
Administrator penyewa global
Untuk administrator penyewa global, buka Aplikasi perusahaan di pusat admin Microsoft Entra. Pilih pendaftaran aplikasi, dan pilih Izin dari bagian Keamanan di panel kiri. Kemudian pilih tombol besar berlabel Berikan persetujuan admin untuk {Tenant Name} (di mana {Tenant Name} adalah nama direktori).
Pengguna standar
Untuk pengguna standar penyewa Anda, minta Administrator Global untuk memberikan persetujuan admin ke aplikasi. Untuk melakukan ini, berikan URL berikut kepada administrator:
https://login.microsoftonline.com/Enter_the_Tenant_Id_Here/adminconsent?client_id=Enter_the_Application_Id_Here
Di URL:
- Ganti
Enter_the_Tenant_Id_Here
dengan ID penyewa atau nama penyewa (misalnya,contoso.microsoft.com
). Enter_the_Application_Id_Here
adalah ID aplikasi (klien) untuk aplikasi terdaftar.
AADSTS50011: No reply address is registered for the application
Kesalahan dapat ditampilkan setelah Anda memberikan persetujuan ke aplikasi dengan menggunakan URL sebelumnya. Kesalahan ini terjadi karena aplikasi dan URL tidak memiliki URI pengalihan. Ini dapat diabaikan.
Apakah Anda memanggil API Anda sendiri?
Jika aplikasi daemon Anda memanggil API web Anda sendiri dan Anda tidak dapat menambahkan izin aplikasi ke pendaftaran aplikasi daemon, Anda perlu Menambahkan peran aplikasi ke pendaftaran aplikasi API web.
Langkah berikutnya
Lanjut ke artikel berikutnya dalam skenario ini, Memanggil API web.