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.

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.