Aplikasi daemon yang memanggil API web - memperoleh token

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 permintaan alur info masuk klien adalah nama sumber daya yang diikuti dengan /.default. Notasi ini memberi tahu Microsoft Azure Active Directory (Microsoft Azure AD) untuk menggunakan izin tingkat aplikasi yang dinyatakan secara statik selama pendaftaran aplikasi. Selain itu, izin API berikut harus diberikan oleh administrator penyewa.

ResourceId = "someAppIDURI";
var scopes = new [] {  ResourceId+"/.default"};

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 (yang merupakan kasus di atas), Microsoft Azure AD memilah 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 mendapatkan token untuk aplikasi ini, Anda akan menggunakan AcquireTokenForClient atau setara, tergantung pada platformnya.

using Microsoft.Identity.Client;

// With client credentials flows, the scope is always of the shape "resource/.default" because the
// application permissions need to be set statically (in the portal or by PowerShell), and then granted by
// a tenant administrator.
string[] scopes = new string[] { "https://graph.microsoft.com/.default" };

AuthenticationResult result = null;
try
{
 result = await app.AcquireTokenForClient(scopes)
                  .ExecuteAsync();
}
catch (MsalUiRequiredException ex)
{
    // The application doesn't have sufficient permissions.
    // - Did you declare enough app permissions during app creation?
    // - Did the tenant admin grant permissions to the application?
}
catch (MsalServiceException ex) when (ex.Message.Contains("AADSTS70011"))
{
    // Invalid scope. The scope has to be in the form "https://resourceurl/.default"
    // Mitigation: Change the scope to be as expected.
}

AcquireTokenForClient menggunakan cache token aplikasi

Di MSAL.NET, AcquireTokenForClient menggunakan cache token aplikasi. (Semua metode AcquireTokenXX lainnya menggunakan cache token pengguna.) Jangan memanggil AcquireTokenSilent sebelum Anda memanggil AcquireTokenForClient, karena AcquireTokenSilent menggunakan cache token pengguna. AcquireTokenForClient memeriksa cache token aplikasi itu sendiri dan memperbaruinya.

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=535fb089-9ff3-47b6-9bfb-4f1264799865
&scope=https%3A%2F%2Fgraph.microsoft.com%2F.default
&client_secret=qWgdYAmab0YSkuL1qKv5bPX
&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=97e0a5b7-d745-40b6-94fe-5f77d35c6e05
&client_assertion_type=urn%3Aietf%3Aparams%3Aoauth%3Aclient-assertion-type%3Ajwt-bearer
&client_assertion=eyJhbGciOiJSUzI1NiIsIng1dCI6Imd4OHRHeXN5amNScUtqRlBuZDdSRnd2d1pJMCJ9.eyJ{a lot of characters here}M8U3bSUKKJDEg
&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. Lihat langkah 6 dari Daftarkan aplikasi klien di atas. Biasanya Anda akan melihat kesalahan yang terlihat seperti kesalahan ini:

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

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.