Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
La migration de vos applications à l’aide d’ADAL vers MSAL offre des avantages de sécurité et de résilience. Cet article décrit les différences entre MSAL.NET et ADAL.NET. Toutes les nouvelles applications doivent utiliser MSAL.NET et le Plateforme d'identités Microsoft, qui est la dernière génération de bibliothèques d’authentification Microsoft. À l’aide de MSAL.NET, vous obtenez des jetons pour les utilisateurs qui se connectent à votre application avec des Microsoft Entra ID (comptes professionnels et scolaires), des comptes Microsoft (personnels) ou Azure AD B2C. Si vous disposez d’une application existante qui utilise ADAL.NET, migrez-la vers MSAL.NET.
Vous devez toujours utiliser ADAL.NET si votre application doit connecter des utilisateurs avec des versions antérieures de Services ADFS (ADFS). Pour plus d’informations, consultez la prise en charge d’ADFS.
Prerequisites
Consultez la vue d’ensemble de MSAL pour en savoir plus sur MSAL.
Différences
| ADAL NET | MSAL NET | |
|---|---|---|
| Packages NuGet et espaces de noms | ADAL a été consommé à partir du Microsoft. Package NuGet IdentityModel.Clients.ActiveDirectory. L’espace de noms était Microsoft.IdentityModel.Clients.ActiveDirectory. |
Ajoutez le Microsoft. Package NuGet Identity.Client et utiliser l’espace Microsoft.Identity.Client de noms. Si vous créez une application cliente confidentielle, consultez Microsoft. Identity.Web. |
| Étendues et ressources | ADAL.NET acquiert des jetons pour les ressources. | MSAL.NET acquiert des jetons pour les étendues. Plusieurs remplacements MSAL.NET AcquireTokenXXX nécessitent un paramètre appelé étendues(IEnumerable<string> scopes). Ce paramètre est une liste simple de chaînes qui déclarent les autorisations et les ressources demandées. Les étendues connues sont les étendues du Microsoft Graph. Vous pouvez également accéder aux ressources v1.0 à l’aide de MSAL.NET. |
| Classes principales | ADAL.NET utilisé AuthenticationContext comme représentation de votre connexion au service d’émission de jeton de sécurité (STS) ou au serveur d’autorisation, via une autorité. | MSAL.NET est conçu autour des applications clientes. Il définit des IPublicClientApplication interfaces pour les applications clientes publiques et IConfidentialClientApplication pour les applications clientes confidentielles, ainsi qu’une interface IClientApplicationBase de base pour le contrat commun aux deux types d’applications. |
| Acquisition de jetons | Dans les clients publics, ADAL utilise AcquireTokenAsync et AcquireTokenSilentAsync pour les appels d’authentification. |
Dans les clients publics, MSAL utilise AcquireTokenInteractive et AcquireTokenSilent pour les mêmes appels d’authentification. Les paramètres sont différents des paramètres ADAL. Dans les applications clientes confidentielles, il existe des méthodes d’acquisition de jetons avec un nom explicite en fonction du scénario. Une autre différence est que, dans MSAL.NET, vous n’avez plus besoin de passer l’application ClientID dans chaque appel AcquireTokenXX. La ClientID valeur n’est définie qu’une seule fois lors de la génération IPublicClientApplication ou IConfidentialClientApplication. |
| IAccount et IUser | ADAL définit la notion d’utilisateur via l’interface IUser. Toutefois, un utilisateur est un humain ou un agent logiciel. Par conséquent, un utilisateur peut posséder un ou plusieurs comptes dans le Plateforme d'identités Microsoft (plusieurs comptes Microsoft Entra, Azure AD B2C, Microsoft comptes personnels). L’utilisateur peut également être responsable d’un ou plusieurs comptes Plateforme d'identités Microsoft. | MSAL.NET définit le concept de compte (via l’interface IAccount). L’interface IAccount représente des informations sur un seul compte. L’utilisateur peut avoir plusieurs comptes dans différents locataires. MSAL.NET fournit de meilleures informations dans les scénarios invités, car les informations de compte d’accueil sont fournies. Vous pouvez en savoir plus sur les différences entre IUser et IAccount. |
| Persistance du cache | ADAL.NET vous permet d’étendre la TokenCache classe pour implémenter la fonctionnalité de persistance souhaitée sur les plateformes sans stockage sécurisé (.NET Framework et .NET core) à l’aide des méthodes et BeforeWrite des BeforeAccessméthodes. Pour plus d’informations, consultez sérialisation du cache de jetons dans ADAL.NET. |
MSAL.NET rend le cache de jetons une classe scellée, en supprimant la possibilité de l’étendre. Par conséquent, votre implémentation de persistance du cache de jetons doit être sous la forme d’une classe d’assistance qui interagit avec le cache de jeton scellé. Cette interaction est décrite dans la sérialisation du cache de jetons dans MSAL.NET article. La sérialisation d’une application cliente publique (Voir le cache de jetons pour une application cliente publique), diffère de celle d’une application cliente confidentielle (Voir le cache de jeton pour une application web ou une API web). |
| Autorité commune | ADAL utilise Azure AD v1.0.
https://login.microsoftonline.com/commonl’autorité dans Azure AD v1.0 (utilisée par ADAL) permet aux utilisateurs de se connecter à l’aide de n’importe quel compte Microsoft Entra d’organisation (professionnel ou scolaire). Azure AD v1.0 n'autorise pas la connexion avec Microsoft comptes personnels. Pour plus d’informations, consultez la validation d’autorité dans ADAL.NET. |
MSAL utilise Azure AD v2.0.
https://login.microsoftonline.com/commonl’autorité dans Azure AD v2.0 (que MSAL utilise) permet aux utilisateurs de se connecter avec n’importe quel compte Microsoft Entra organisation (professionnel ou scolaire) ou avec un compte personnel Microsoft. Pour restreindre la connexion à l’aide uniquement de comptes d’organisation (compte professionnel ou scolaire) dans MSAL, vous devez utiliser le https://login.microsoftonline.com/organizations point de terminaison. Pour plus d’informations, consultez le paramètre dans l’application authoritycliente publique. |
Subventions prises en charge
Voici un résumé comparant MSAL.NET et ADAL.NET subventions prises en charge pour les applications clientes publiques et confidentielles.
Applications clientes publiques
L’image suivante résume certaines des différences entre ADAL.NET et MSAL.NET pour une application cliente publique.
Voici les subventions prises en charge dans ADAL.NET et MSAL.NET pour les applications de bureau et mobiles.
| Accorder | MSAL.NET | ADAL.NET |
|---|---|---|
| Interactive | Acquisition de jetons de manière interactive dans MSAL.NET | Authentification interactive |
| Authentification Windows intégrée | Authentification Windows intégrée | Authentification intégrée sur Windows (Kerberos) |
| Nom d’utilisateur / mot de passe | Authentification par nom d’utilisateur-mot de passe | Acquisition de jetons avec nom d’utilisateur et mot de passe |
| Flux de code de périphérique | Flux de code de périphérique | Profil d’appareil pour les appareils sans navigateurs web |
Applications clientes confidentielles
L’image suivante résume certaines des différences entre ADAL.NET et MSAL.NET pour une application cliente confidentielle.
Voici les subventions prises en charge dans ADAL.NET, MSAL.NET et Microsoft. Identity.Web pour les applications web, les API web et les applications démon.
| Type d’application | Accorder | MSAL.NET | ADAL.NET |
|---|---|---|---|
| Application web, API web, démon | Informations d’identification du client | Flux d’informations d’identification du client dans MSAL.NET | Flux d’informations d’identification du client dans ADAL.NET |
| API web | Au nom de | Au nom de MSAL.NET | Appel de service à service pour le compte de l’utilisateur avec ADAL.NET |
| Application web | Code d’authentification | Acquisition de jetons avec des codes d’autorisation sur des applications web avec A MSAL.NET | Acquisition de jetons avec des codes d’autorisation sur des applications web avec ADAL.NET |
Migration à partir d’ADAL 2.x avec des jetons d’actualisation
Dans ADAL.NET v2. X, les jetons d’actualisation ont été exposés pour vous permettre de développer des solutions autour de l’utilisation de ces jetons en les mettant en cache et en utilisant les AcquireTokenByRefreshToken méthodes fournies par ADAL 2.x.
Certaines de ces solutions ont été utilisées dans des scénarios tels que :
- Services de longue durée qui effectuent des actions, notamment l’actualisation des tableaux de bord pour les utilisateurs lorsque les utilisateurs ne sont plus connectés/ connectés à l’application.
- Scénarios WebFarm permettant au client d’apporter le jeton d’actualisation au service web (la mise en cache est effectuée côté client, cookie chiffré et non côté serveur).
MSAL.NET n'expose pas les jetons d'actualisation pour des raisons de sécurité. MSAL gère l’actualisation des jetons pour vous.
Heureusement, MSAL.NET dispose d’une API qui vous permet de migrer vos jetons d’actualisation précédents (acquis avec ADAL) dans les IConfidentialClientApplicationéléments suivants :
/// <summary>
/// Acquires an access token from an existing refresh token and stores it and the refresh token into
/// the application user token cache, where it will be available for further AcquireTokenSilent calls.
/// This method can be used in migration to MSAL from ADAL v2 and in various integration
/// scenarios where you have a RefreshToken available.
/// (see https://aka.ms/msal-net-migration-adal2-msal2)
/// </summary>
/// <param name="scopes">Scope to request from the token endpoint.
/// Setting this to null or empty will request an access token, refresh token and ID token with default scopes</param>
/// <param name="refreshToken">The refresh token from ADAL 2.x</param>
IByRefreshToken.AcquireTokenByRefreshToken(IEnumerable<string> scopes, string refreshToken);
Avec cette méthode, vous pouvez fournir le jeton d’actualisation précédemment utilisé avec toutes les étendues (ressources) souhaitées. Le jeton d’actualisation est échangé pour un nouveau jeton et mis en cache dans votre application.
Comme cette méthode est destinée aux scénarios qui ne sont pas typiques, il n’est pas facilement accessible avec le IConfidentialClientApplication sans le faire passer en IByRefreshTokenpremier.
L’extrait de code ci-dessous montre du code de migration dans une application cliente confidentielle.
TokenCache userCache = GetTokenCacheForSignedInUser();
string rt = GetCachedRefreshTokenForSignedInUser();
IConfidentialClientApplication app;
app = ConfidentialClientApplicationBuilder.Create(clientId)
.WithAuthority(Authority)
.WithRedirectUri(RedirectUri)
.WithClientSecret(ClientSecret)
.Build();
IByRefreshToken appRt = app as IByRefreshToken;
AuthenticationResult result = await appRt.AcquireTokenByRefreshToken(null, rt)
.ExecuteAsync()
.ConfigureAwait(false);
GetCachedRefreshTokenForSignedInUser récupère le jeton d’actualisation stocké dans un stockage par une version précédente de l’application utilisée pour utiliser ADAL 2.x.
GetTokenCacheForSignedInUser désérialise un cache pour l’utilisateur connecté (car les applications clientes confidentielles doivent avoir un cache par utilisateur).
Un jeton d’accès et un jeton d’ID sont retournés dans la AuthenticationResult valeur pendant que le nouveau jeton d’actualisation est stocké dans le cache. Vous pouvez également utiliser cette méthode pour différents scénarios d’intégration dans lesquels vous disposez d’un jeton d’actualisation.
Jetons v1.0 et v2.0
Il existe deux versions de jetons : les jetons v1.0 et les jetons v2.0. Le point de terminaison v1.0 (utilisé par ADAL) émet des jetons d’ID v1.0 tandis que le point de terminaison v2.0 (utilisé par MSAL) émet des jetons d’ID v2.0. Toutefois, les deux points de terminaison émettent des jetons d’accès de la version du jeton accepté par l’API web. Une propriété du manifeste d’application de l’API web permet aux développeurs de choisir la version du jeton acceptée. Consultez accessTokenAcceptedVersion la documentation de référence du manifeste d’application .
Pour plus d’informations sur les jetons d’accès v1.0 et v2.0, consultez Microsoft Entra jetons d’accès.
Exceptions
Exceptions requises pour l’interaction
À l’aide de MSAL.NET, vous interceptez MsalUiRequiredException comme décrit dans AcquireTokenSilent
catch(MsalUiRequiredException exception)
{
try {"try to authenticate interactively"}
}
Pour plus d’informations, consultez Gérer les erreurs et les exceptions dans MSAL.NET
ADAL.NET avait des exceptions moins explicites. Par exemple, lorsque l’authentification silencieuse a échoué dans ADAL, la procédure devait intercepter l’exception et rechercher le user_interaction_required code d’erreur :
catch(AdalException exception)
{
if (exception.ErrorCode == "user_interaction_required")
{
try
{“try to authenticate interactively”}}
}
}
Pour plus d’informations, consultez le modèle recommandé pour acquérir un jeton dans les applications clientes publiques avec ADAL.NET.
Comportement d’invite
Le comportement d’invite dans MSAL.NET équivaut au comportement d’invite dans ADAL.NET :
| ADAL.NET | MSAL.NET | Description |
|---|---|---|
PromptBehavior.Auto |
NoPrompt |
Microsoft Entra ID choisit le meilleur comportement (la connexion des utilisateurs en mode silencieux s’ils sont connectés avec un seul compte ou affiche le sélecteur de compte s’ils sont connectés avec plusieurs comptes). |
PromptBehavior.Always |
ForceLogin |
Réinitialise la zone de connexion et force l’utilisateur à réentérer ses informations d’identification. |
PromptBehavior.RefreshSession |
Consent |
Force l’utilisateur à consentir à nouveau à toutes les autorisations. |
PromptBehavior.Never |
Never |
N’utilisez pas ; Utilisez plutôt le modèle recommandé pour les applications clientes publiques. |
PromptBehavior.SelectAccount |
SelectAccount |
Affiche le sélecteur de compte et force l’utilisateur à sélectionner un compte. |
Gestion des exceptions de défi de revendication
Parfois, lors de l’acquisition d’un jeton, Microsoft Entra ID lève une exception au cas où une ressource exige davantage de revendications de l’utilisateur (par exemple, l’authentification à deux facteurs).
Dans MSAL.NET, les exceptions de défi de revendication sont gérées de la manière suivante :
- Les
Claimssurfaces sont exposées dans leMsalServiceException. - Il existe une WithClaims(String) méthode qui peut s’appliquer aux
AcquireTokenXXXgénérateurs.
Pour plus d’informations, consultez Gestion de MsalUiRequiredException.
Dans ADAL.NET, les exceptions de défi de revendication ont été gérées de la manière suivante :
-
AdalClaimChallengeExceptionest une exception (dérivant deAdalServiceException). LeClaimsmembre contient un fragment JSON avec les revendications, qui sont attendues. - L’application cliente publique recevant cette exception nécessaire pour appeler la
AcquireTokenInteractivesubstitution ayant un paramètre de revendication. Ce remplacement ne tente même pas d’atteindreAcquireTokenInteractivele cache, car il n’est pas nécessaire. La raison est que le jeton dans le cache n’a pas les revendications appropriées (sinon unAdalClaimChallengeExceptionjeton n’aurait pas été levée). Par conséquent, il n’est pas nécessaire d’examiner le cache. IlClaimChallengeExceptionpeut être reçu dans une api WebAPI effectuant OBO, mais ilAcquireTokenInteractivedoit être appelé dans une application cliente publique appelant cette API web.
Pour plus d’informations, notamment des exemples, consultez la gestion d’AdalClaimChallengeException.
Étendues
La bibliothèque ADAL utilise le concept de ressources avec resourceId des chaînes, MSAL.NET, mais utilise des étendues. La logique utilisée par Microsoft Entra ID est la suivante :
- Pour le point de terminaison ADAL (v1.0) avec un jeton d’accès v1.0 (le seul possible),
aud=resource. - Pour le point de terminaison MSAL (v2.0) demandant un jeton d’accès pour une ressource acceptant des jetons v2.0,
aud=resource.AppId. - Pour le point de terminaison MSAL (v2.0) demandant un jeton d’accès pour une ressource acceptant un jeton d’accès v1.0, Microsoft Entra ID analyse l’audience souhaitée à partir de l’étendue demandée. Pour ce faire, prenez tout avant la dernière barre oblique et utilisez-la comme identificateur de ressource. Par conséquent, si
https://database.windows.netvous attendez un public dehttps://database.windows.net/, vous devez demander une étendue dehttps://database.windows.net//.default(notez la double barre oblique avant ./default). Ceci est illustré par des exemples 1 et 2 ci-dessous.
Exemple 1 :
Si vous souhaitez acquérir des jetons pour une application acceptant des jetons v1.0 (par exemple, microsoft API Graph, autrement dithttps://graph.microsoft.com), vous devrez créer scopes en concaténant un identificateur de ressource souhaité avec une autorisation OAuth2 souhaitée pour cette ressource.
Par exemple, pour accéder au nom de l’utilisateur via une API web v1.0 dont l’URI d’ID d’application est ResourceId, vous souhaitez utiliser :
var scopes = new [] { ResourceId+"/user_impersonation" };
Si vous souhaitez lire et écrire avec MSAL.NET Microsoft Entra ID à l'aide de Microsoft API Graph (https://graph.microsoft.com/), vous devez créer une liste d'étendues comme dans l'extrait de code ci-dessous :
string ResourceId = "https://graph.microsoft.com/";
string[] scopes = { ResourceId + "Directory.Read", ResourceId + "Directory.Write" }
Exemple 2
Si resourceId se termine par un « / », vous devez avoir un double « / » lors de l’écriture de la valeur d’étendue. Par exemple, si vous souhaitez écrire l’étendue correspondant à l’API Azure Resource Manager (https://management.core.windows.net/), demandez l’étendue suivante (notez les deux barres obliques).
var resource = "https://management.core.windows.net/"
var scopes = new[] {"https://management.core.windows.net//user_impersonation"};
var result = await app.AcquireTokenInteractive(scopes).ExecuteAsync();
// then call the API: https://management.azure.com/subscriptions?api-version=2016-09-01
Cela est dû au fait que l'API Resource Manager attend une barre oblique dans sa revendication d'audience (aud), puis une barre oblique sépare le nom de l'API de l'étendue.
Si vous souhaitez acquérir un jeton pour toutes les étendues statiques d’une application v1.0, vous devez créer votre liste d’étendues, comme indiqué dans l’extrait de code ci-dessous :
ResourceId = "someAppIDURI";
var scopes = new [] { ResourceId+"/.default" };
Pour un flux d’informations d’identification client, l’étendue à passer serait /.defaultégalement . Cette étendue indique à Microsoft Entra ID : « toutes les autorisations au niveau de l’application auxquelles l’administrateur a consenti dans l’inscription de l’application.
Étapes suivantes
Migrez vos applications d’ADAL vers MSALMigrate your ADAL.NET confidentiel client apps to use MSAL.NET