Memigrasikan aplikasi klien rahasia dari ADAL.NET ke MSAL.NET

Dalam pedoman ini, Anda akan memigrasikan aplikasi klien rahasia dari Pustaka Autentikasi Azure Active Directory untuk .NET (ADAL.NET) ke Pustaka Autentikasi Microsoft untuk .NET (MSAL.NET). Aplikasi klien rahasia mencakup aplikasi web, API web, dan aplikasi daemon yang memanggil layanan lain atas nama mereka sendiri. Untuk informasi selengkapnya tentang aplikasi rahasia, lihat Alur autentikasi dan skenario aplikasi. Jika aplikasi Anda berbasis ASP.NET Core, lihat Microsoft.Identity.Web.

Untuk registrasi aplikasi:

  • Anda tidak perlu membuat pendaftaran aplikasi baru. (Anda tetap memiliki ID klien yang sama.)
  • Anda tidak perlu mengubah praotorisasi (izin API yang disetujui admin).

Langkah migrasi

  1. Cari kode yang menggunakan ADAL.NET di aplikasi Anda.

    Kode yang menggunakan ADAL dalam aplikasi klien rahasia menginstansiasi AuthenticationContext dan memanggil AcquireTokenByAuthorizationCode atau satu mengambil alih AcquireTokenAsync dengan parameter berikut:

    • String resourceId. Variabel ini adalah URI ID aplikasi dari API web yang ingin Anda panggil.
    • Instans dari IClientAssertionCertificate atau ClientAssertion. Instans ini memberikan info masuk klien untuk aplikasi Anda untuk membuktikan identitas aplikasi Anda.
  2. Setelah Anda mengidentifikasi bahwa Anda memiliki aplikasi yang menggunakan ADAL.NET, instal paket NuGet MSAL.NET Microsoft.Identity.Client dan perbarui referensi pustaka proyek Anda. Untuk informasi selengkapnya, lihat Menginstal paket NuGet. Untuk menggunakan pembuat serialisasi cache token, pasang Microsoft.Identity.Web.TokenCache.

  3. Perbarui kode sesuai dengan skenario klien rahasia. Beberapa langkah bersifat umum dan berlaku di semua skenario klien rahasia. Langkah-langkah lain bersifat unik untuk setiap skenario.

    Skenario klien rahasia:

Anda mungkin telah memberikan wrapper di sekitar ADAL.NET untuk menangani sertifikat dan penembolokan. Pedoman ini menggunakan pendekatan yang sama untuk menggambarkan proses migrasi dari ADAL.NET ke MSAL.NET. Namun, kode ini hanya untuk tujuan demonstrasi. Jangan menyalin/menempelkan wrapper ini atau mengintegrasikannya dalam kode Anda sebagaimana mestinya.

Migrasi aplikasi daemon

Skenario Daemon menggunakan alur info masuk klien OAuth2.0. Skenario tersebut juga disebut panggilan layanan-ke-layanan. Aplikasi Anda memperoleh token atas namanya sendiri, bukan atas nama pengguna.

Cari tahu apakah kode Anda menggunakan skenario daemon

Kode ADAL untuk aplikasi Anda menggunakan skenario daemon jika berisi panggilan AuthenticationContext.AcquireTokenAsync dengan parameter berikut:

  • Sumber daya (URI ID aplikasi) sebagai parameter pertama
  • IClientAssertionCertificate atau ClientAssertion sebagai parameter kedua

AuthenticationContext.AcquireTokenAsync tidak memiliki parameter jenis UserAssertion. Jika memiliki, maka aplikasi Anda adalah API web, dan menggunakan skenario API web yang memanggil API web hilir.

Memperbarui kode skenario daemon

Langkah-langkah berikut untuk memperbarui kode yang berlaku di semua skenario klien rahasia:

  1. Tambah namespace layanan MSAL.NET dalam kode sumber Anda: using Microsoft.Identity.Client;.
  2. Alih-alih membuat instans AuthenticationContext, gunakan ConfidentialClientApplicationBuilder.Create untuk membuat instans IConfidentialClientApplication.
  3. Alih-alih untai (karakter) resourceId, MSAL.NET menggunakan cakupan. Karena aplikasi yang menggunakan ADAL.NET telah diotorisasi sebelumnya, Anda dapat selalu menggunakan cakupan berikut: new string[] { $"{resourceId}/.default" }.
  4. Ganti panggilan AuthenticationContext.AcquireTokenAsync dengan panggilan ke IConfidentialClientApplication.AcquireTokenXXX, di mana XXX bergantung pada skenario Anda.

Dalam kasus ini, ganti panggilan ke AuthenticationContext.AcquireTokenAsync dengan panggilan ke IConfidentialClientApplication.AcquireTokenClient.

Berikut adalah perbandingan kode ADAL.NET dan MSAL.NET untuk skenario daemon:

ADAL

MSAL

using Microsoft.IdentityModel.Clients.ActiveDirectory;
using System.Security.Cryptography.X509Certificates;
using System.Threading.Tasks;

public partial class AuthWrapper
{
const string ClientId = "Guid (AppID)";
const string authority 
= "https://login.microsoftonline.com/{tenant}";
// App ID URI of web API to call
const string resourceId = "https://target-api.domain.com";
X509Certificate2 certificate = LoadCertificate();



public async Task<AuthenticationResult> GetAuthenticationResult()
{


var authContext = new AuthenticationContext(authority);
var clientAssertionCert = new ClientAssertionCertificate(
ClientId,
certificate);


var authResult = await authContext.AcquireTokenAsync(
resourceId,
clientAssertionCert,
);

return authResult;
}
}
using Microsoft.Identity.Client;
using System.Security.Cryptography.X509Certificates;
using System.Threading.Tasks;

public partial class AuthWrapper
{
const string ClientId = "Guid (Application ID)";
const string authority 
= "https://login.microsoftonline.com/{tenant}";
// App ID URI of web API to call
const string resourceId = "https://target-api.domain.com";
X509Certificate2 certificate = LoadCertificate();

IConfidentialClientApplication app;

public async Task<AuthenticationResult> GetAuthenticationResult()
{
if (app == null)
{
app = ConfidentialClientApplicationBuilder.Create(ClientId)
.WithCertificate(certificate)
.WithAuthority(authority)
.Build();
}

var authResult = await app.AcquireTokenForClient(
new [] { $"{resourceId}/.default" })
// .WithTenantId(specificTenant)
// See https://aka.ms/msal.net/withTenantId
.ExecuteAsync()
.ConfigureAwait(false);

return authResult;
}
}

Dapatkan manfaat dari penembolokan token

Untuk mendapatkan keuntungan dari cache dalam memori, instans IConfidentialClientApplication perlu disimpan dalam variabel anggota. Jika Anda membuat ulang aplikasi klien rahasia setiap kali Anda meminta token, Anda tidak akan mendapat manfaat dari cache token.

Anda harus melakukan serialisasi AppTokenCache jika Anda tidak menggunakan cache token aplikasi dalam memori default. Demikian pula, Jika Anda ingin menerapkan cache token terdistribusi, Anda harus melakukan serialisasi AppTokenCache. Untuk detailnya, lihat Cache token untuk aplikasi web atau API web (aplikasi klien rahasia) dan sampel active-directory-dotnet-v1-to-v2/ConfidentialClientTokenCache.

Pelajari lebih lanjut tentang skenario daemon dan bagaimana penerapannya dengan MSAL.NET atau Microsoft.Identity.Web dalam aplikasi baru.

Manfaat MSAL

Manfaat utama dari MSAL.NET untuk aplikasi Anda meliputi:

  • Ketahanan. MSAL.NET membantu membuat aplikasi Anda tangguh melalui:

    • Manfaat Azure AD Cached Credential Service (CCS). CCS beroperasi sebagai cadangan Azure AD.
    • Pembaruan token secara proaktif jika API yang Anda hubungi memungkinkan token berumur panjang melalui evaluasi akses berkelanjutan.
  • Keamanan. Anda dapat memperoleh token Proof of Possession (PoP) jika API web yang ingin Anda hubungi membutuhkannya. Untuk detailnya, lihat token PoP di MSAL.NET

  • Performa dan skalabilitas. Jika Anda tidak perlu berbagi cache Anda dengan ADAL.NET, nonaktifkan kompatibilitas cache lama saat Anda membuat aplikasi klien rahasia (.WithLegacyCacheCompatibility(false)) untuk meningkatkan performa secara signifikan.

    app = ConfidentialClientApplicationBuilder.Create(ClientId)
            .WithCertificate(certificate)
            .WithAuthority(authority)
            .WithLegacyCacheCompatibility(false)
            .Build();
    

Pemecahan Masalah

MsalServiceException

Informasi pemecahan masalah berikut membuat dua asumsi:

  • Kode ADAL.NET Anda berfungsi.
  • Anda bermigrasi ke MSAL dengan menyimpan ID klien yang sama.

Jika Anda mendapatkan pengecualian dengan salah satu pesan berikut:

AADSTS700027: Client assertion contains an invalid signature. [Reason - The key was not found.]

AADSTS90002: Tenant 'cf61953b-e41a-46b3-b500-663d279ea744' not found. This may happen if there are no active subscriptions for the tenant. Check to make sure you have the correct tenant ID. Check with your subscription administrator.

Lakukan pemecahan masalah pengecualian dengan menggunakan langkah-langkah ini:

  1. Konfirmasikan bahwa Anda menggunakan versi terbaru MSAL.NET.
  2. Konfirmasikan bahwa host otoritas yang Anda tetapkan saat membuat aplikasi klien rahasia dan host otoritas yang Anda gunakan dengan ADAL serupa. Secara khusus, apakah cloud (Azure Pemerintah, Azure Tiongkok 21Vianet, atau Azure Jerman) sama?

MsalClientException

Di aplikasi multipenyewa, tentukan otoritas umum saat membangun aplikasi untuk menargetkan penyewa tertentu seperti, penyewa pengguna saat memanggil API web. Sejak MSAL.NET 4.37.0, saat Anda menentukan .WithAzureRegion pada pembuatan aplikasi, Anda tidak dapat lagi menentukan Otoritas menggunakan .WithAuthority selama permintaan token. Jika Anda melakukannya, Anda akan mendapatkan kesalahan berikut saat memperbarui versi MSAL.NET sebelumnya:

MsalClientException - "You configured WithAuthority at the request level, and also WithAzureRegion. This is not supported when the environment changes from application to request. Use WithTenantId at the request level instead."

Untuk mengatasi masalah ini, ganti .WithAuthority pada ekspresi AcquireTokenXXX dengan .WithTenantId. Tentukan penyewa menggunakan GUID atau nama domain.

Langkah berikutnya

Pelajari lebih lanjut tentang: