Aplikasi daemon .NET dapat memanggil API web. Aplikasi daemon .NET juga dapat memanggil beberapa API web yang telah disetujui sebelumnya.
Microsoft.Identity.Web mengabstraksi kompleksitas MSAL.NET. Ini memberi Anda API tingkat yang lebih tinggi yang menangani internal MSAL.NET untuk Anda, seperti memproses kesalahan Akses Bersyar, penembolokan.
Berikut adalah Program.cs aplikasi daemon yang memanggil API hilir:
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();
tokenAcquirerFactory.Services.AddDownstreamApi("MyApi",
tokenAcquirerFactory.Configuration.GetSection("MyWebApi"));
var sp = tokenAcquirerFactory.Build();
var api = sp.GetRequiredService<IDownstreamApi>();
var result = await api.GetForAppAsync<IEnumerable<TodoItem>>("MyApi");
Console.WriteLine($"result = {result?.Count()}");
Berikut adalah Program.cs aplikasi daemon yang memanggil Microsoft Graph:
var tokenAcquirerFactory = TokenAcquirerFactory.GetDefaultInstance();
tokenAcquirerFactory.Services.AddMicrosoftGraph();
var serviceProvider = tokenAcquirerFactory.Build();
try
{
GraphServiceClient graphServiceClient = serviceProvider.GetRequiredService<GraphServiceClient>();
var users = await graphServiceClient.Users
.GetAsync(r => r.Options.WithAppOnly());
Console.WriteLine($"{users.Count} users");
Console.ReadKey();
}
catch (Exception ex) { Console.WriteLine("We could not retrieve the user's list: " + $"{ex}"); }
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
// Set the appropriate header fields in the request header.
conn.setRequestProperty("Authorization", "Bearer " + accessToken);
conn.setRequestProperty("Accept", "application/json");
String response = HttpClientHelper.getResponseStringFromConn(conn);
int responseCode = conn.getResponseCode();
if(responseCode != HttpURLConnection.HTTP_OK) {
throw new IOException(response);
}
JSONObject responseObject = HttpClientHelper.processResponse(responseCode, response);
Menggunakan klien HTTP seperti Axios, panggil URI titik akhir API dengan token akses sebagai token pembawa otorisasi.
const axios = require('axios');
async function callApi(endpoint, accessToken) {
const options = {
headers: {
Authorization: `Bearer ${accessToken}`
}
};
console.log('request made to web API at: ' + new Date().toString());
try {
const response = await axios.default.get(endpoint, options);
return response.data;
} catch (error) {
console.log(error)
return error;
}
};
endpoint = "url to the API"
http_headers = {'Authorization': 'Bearer ' + result['access_token'],
'Accept': 'application/json',
'Content-Type': 'application/json'}
data = requests.get(endpoint, headers=http_headers, stream=False).json()
Properti AuthenticationResult di MSAL.NET
Metode untuk memperoleh token menampilkan AuthenticationResult
. Untuk metode asinkron, Task<AuthenticationResult>
ditampilkan.
Dalam MSAL.NET, AuthenticationResult
mengekspos:
AccessToken
untuk API web untuk mengakses sumber daya. Parameter ini adalah string, biasanya JWT berkode Base-64. Klien tidak boleh melihat ke dalam token akses. Formatnya tidak dijamin tetap stabil, dan dapat dienkripsi untuk sumber daya. Menulis kode yang tergantung pada konten token akses pada klien adalah salah satu sumber kesalahan terbesar dan jeda logika klien. Untuk mengetahui informasi selengkapnya, lihat Token akses.
IdToken
untuk pengguna. Parameter ini adalah JWT yang dikodekan. Untuk mengetahui informasi selengkapnya, lihat Token ID.
ExpiresOn
memberi tahu tanggal dan waktu saat token kedaluwarsa.
TenantId
berisi penyewa tempat pengguna ditemukan. Untuk pengguna tamu dalam skenario Microsoft Entra B2B, ID penyewa adalah penyewa tamu, bukan penyewa unik.
Saat token dikirim untuk pengguna, AuthenticationResult
juga berisi informasi tentang pengguna ini. Untuk alur klien rahasia yang mana token diminta tanpa pengguna untuk aplikasi, informasi pengguna ini adalah null.
Scopes
yang tokennya dikeluarkan.
- ID unik untuk pengguna.
IAccount
MSAL.NET mendefinisikan gagasan akun melalui antarmuka IAccount
. Perubahan melanggar ini memberikan semantik yang tepat. Pengguna yang sama dapat memiliki beberapa akun, di direktori Microsoft Entra yang berbeda. MSAL.NET juga memberikan informasi yang lebih baik dalam skenario tamu, karena informasi akun beranda disediakan.
Diagram berikut menunjukkan struktur antarmuka IAccount
.
Kelas AccountId
mengidentifikasi akun di penyewa tertentu dengan properti yang ditunjukkan dalam tabel berikut.
Properti |
Deskripsi |
TenantId |
Representasi string untuk GUID, yang merupakan ID penyewa tempat akun berada. |
ObjectId |
Representasi string untuk GUID, yang merupakan ID pengguna yang memiliki akun di penyewa. |
Identifier |
Pengidentifikasi unik untuk akun. Identifier adalah perangkaian ObjectId dan TenantId yang dipisahkan oleh koma. Ini bukan Base 64 yang dikodekan. |
Antarmuka IAccount
mewakili informasi tentang satu akun. Pengguna yang sama dapat tersedia di penyewa yang berbeda, yang berarti bahwa pengguna dapat memiliki beberapa akun. Anggotanya ditampilkan dalam tabel berikut.
Properti |
Deskripsi |
Username |
String yang berisi nilai yang dapat ditampilkan dalam format UserPrincipalName (UPN), misalnya, john.doe@contoso.com. String ini bisa null, tidak seperti HomeAccountId dan HomeAccountId.Identifier, yang tidak akan null. Properti ini menggantikan properti DisplayableId dari IUser pada versi MSAL.NET sebelumnya. |
Environment |
String yang berisi penyedia identitas untuk akun ini, misalnya, login.microsoftonline.com . Properti ini menggantikan properti IdentityProvider dari IUser , kecuali IdentityProvider juga memiliki informasi tentang penyewa, selain lingkungan cloud. Di sini, nilainya hanya berupa host. |
HomeAccountId |
ID akun untuk akun rumah bagi pengguna. Properti ini secara unik mengidentifikasi pengguna di seluruh penyewa Microsoft Entra. |
Gunakan token untuk memanggil API yang dilindungi
Setelah AuthenticationResult
ditampilkan oleh MSAL di result
, tambahkan ke header otorisasi HTTP sebelum Anda melakukan panggilan untuk mengakses API web yang dilindungi.
httpClient = new HttpClient();
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", result.AccessToken);
// Call the web API.
HttpResponseMessage response = await _httpClient.GetAsync(apiUri);
...
}
Untuk aplikasi daemon, API web yang Anda panggil perlu disetujui sebelumnya. Tidak ada persetujuan bertahap dengan aplikasi daemon. (Tidak ada interaksi pengguna.) Admin penyewa perlu memberikan persetujuan sebelumnya untuk aplikasi dan semua izin API. Jika Anda ingin memanggil beberapa API, memperoleh token untuk semua sumber daya, setiap kali memanggil AcquireTokenForClient
. MSAL menggunakan cache token aplikasi untuk menghindari panggilan layanan yang tidak perlu.