Applications clientes publiques à compte unique et multiple

Cet article vous aidera à comprendre les types utilisés dans les applications clientes publiques à un seul et plusieurs comptes, avec un focus sur les applications clientes publiques à compte unique.

La bibliothèque d’authentification (ADAL) Azure Active Directory modélise le serveur. Le Microsoft Authentication Library (MSAL) modélise plutôt votre application cliente. La majorité des applications Android sont considérées comme des clients publics. Un client public est une application qui ne peut pas conserver en toute sécurité un secret.

MSAL adapte l’interface de programmation de PublicClientApplication afin de simplifier et de clarifier l’expérience de développement pour les applications ne permettant l’utilisation que d’un seul compte à la fois. PublicClientApplication est sous-classé par SingleAccountPublicClientApplication et MultipleAccountPublicClientApplication. Le diagramme suivant montre la relation entre ces classes.

Diagramme de classes UML SingleAccountPublicClientApplication

Application cliente publique à compte unique

La SingleAccountPublicClientApplication classe vous permet de créer une application MSAL qui autorise uniquement la connexion d’un seul compte à la fois. SingleAccountPublicClientApplication diffère de PublicClientApplication des façons suivantes :

  • MSAL effectue le suivi du compte actuellement connecté.
    • Si votre application utilise un répartiteur (la valeur par défaut pendant l’inscription de l’application Microsoft Entra) et est installée sur un appareil sur lequel un répartiteur est présent, MSAL vérifie que le compte est toujours disponible sur l’appareil.
  • signIn vous permet de connecter un compte explicitement et indépendamment de la demande d’étendues.
  • acquireTokenSilent ne nécessite pas de paramètre de compte. Si vous fournissez un compte et si le compte que vous fournissez ne correspond pas au compte actuellement suivi par MSAL, une exception MsalClientException est levée.
  • acquireToken n’autorise pas l’utilisateur à changer de compte. Si l’utilisateur tente de basculer vers un autre compte, une exception est levée.
  • getCurrentAccount retourne un objet de résultat qui fournit les éléments suivants :
    • Valeur booléenne indiquant si le compte a changé. Un compte peut être modifié, par exemple, s’il est supprimé de l’appareil.
    • Compte précédent. Cela est utile si vous devez effectuer un nettoyage des données locales lorsque le compte est supprimé de l’appareil ou lorsqu’un nouveau compte est connecté.
    • Le currentAccount.
  • signOut supprime tous les jetons associés à votre client de l’appareil.

Lorsqu'un répartiteur d'authentification Android tel que Microsoft Authenticator, Link to Windows (LTW) ou Intune Portail d'entreprise est installé sur l'appareil et votre application est configurée pour utiliser le répartiteur, signOut ne supprime pas le compte de l'appareil.

Scénario de compte unique

Le pseudo-code suivant illustre l’utilisation SingleAccountPublicClientApplication.

// Construct Single Account Public Client Application
ISingleAccountPublicClientApplication app = PublicClientApplication.createSingleAccountPublicClientApplication(getApplicationContext(), R.raw.msal_config);

String[] scopes = {"User.Read"};
IAccount mAccount = null;

// Acquire a token interactively
// The user will get a UI prompt before getting the token.
SignInParameters signInParameters = SignInParameters.builder()
        .withActivity(getActivity()) // Pass the current activity
        .withScopes(scopes) // Specify the scopes
        .withCallback(new AuthenticationCallback() {
            @Override
            public void onSuccess(IAuthenticationResult authenticationResult){
                mAccount = authenticationResult.getAccount();
            }
    
            @Override
            public void onError(MsalException exception){
            }
    
            @Override
            public void onCancel(){
            }
        })
        .build();


app.signIn(signInParameters);

// Load Account Specific Data
getDataForAccount(account);

// Get Current Account
ICurrentAccountResult currentAccountResult = app.getCurrentAccount();
if (currentAccountResult.didAccountChange()){
    // Account Changed Clear existing account data
    clearDataForAccount(currentAccountResult.getPriorAccount());
    mAccount = currentAccountResult.getCurrentAccount();
    if (account != null){
        //load data for new account
        getDataForAccount(account);
    }
}

// Sign out
if (app.signOut()) {
    clearDataForAccount(mAccount);
    mAccount = null;
}

Application cliente publique de plusieurs comptes

La MultipleAccountPublicClientApplication classe est utilisée pour créer des applications basées sur MSAL qui permettent à plusieurs comptes d’être connectés en même temps. Il vous permet d’obtenir, d’ajouter et de supprimer des comptes comme suit :

Ajouter un compte

Utilisez un ou plusieurs comptes dans votre application en appelant acquireToken une ou plusieurs fois.

Obtenir des comptes

  • Appelez getAccount pour obtenir un compte spécifique.
  • Appelez getAccountspour obtenir la liste des comptes actuellement connus de l’application.

Votre application ne pourra pas lister tous les comptes de la plateforme d’identités Microsoft présents sur l’appareil et connus de l’application broker. Il ne peut énumérer que les comptes qui ont été utilisés par votre application. Les comptes qui ont été supprimés de l’appareil ne seront pas retournés par ces fonctions.

Supprimer un compte

Supprimez un compte en appelant removeAccount avec un identificateur de compte.

Si votre application est configurée pour utiliser un répartiteur et qu’un répartiteur est installé sur l’appareil, le compte ne sera pas supprimé du répartiteur lorsque vous appelez removeAccount. Seuls les jetons associés à votre client sont supprimés.

Scénario de plusieurs comptes

Le pseudo-code suivant montre comment créer une application de compte multiple, répertorier des comptes sur l’appareil et acquérir des jetons.

// Construct Multiple Account Public Client Application
IMultipleAccountPublicClientApplication app = PublicClientApplication.createMultipleAccountPublicClientApplication(getApplicationContext(), R.raw.msal_config);

String[] scopes = {"User.Read"};
IAccount mAccount = null;

// Acquire a token interactively
// The user will be required to interact with a UI to obtain a token
AcquireTokenParameters acquireTokenParameters = new AcquireTokenParameters.Builder()
        .startAuthorizationFromActivity(getActivity())
        .withScopes(scopes)
        .withCallback(new AuthenticationCallback(){
    
            @Override
            public void onSuccess(IAuthenticationResult authenticationResult) {
                mAccount = authenticationResult.getAccount();
            }
    
            @Override
            public void onError(MsalException exception){
            }
    
            @Override
            public void onCancel(){
            }
         })
        .build();
app.acquireToken(acquireTokenParameters);


...

// Get the default authority
String authority = app.getConfiguration().getDefaultAuthority().getAuthorityURL().toString();

// Get a list of accounts on the device
List<IAccount> accounts = app.getAccounts();

// Pick an account to obtain a token from without prompting the user to sign in
IAccount selectedAccount = accounts.get(0);

// Get a token without prompting the user
AcquireTokenSilentParameters acquireTokenSilentParameters = new AcquireTokenSilentParameters.Builder()
        .withScopes(scopes)
        .forAccount(selectedAccount)
        .fromAuthority(authority)
        .withCallback(new SilentAuthenticationCallback() {

            @Override
            public void onSuccess(IAuthenticationResult authenticationResult) {
                mAccount = authenticationResult.getAccount();
            }
    
            @Override
            public void onError(MsalException exception){
            }
        })
        .build();
app.acquireTokenSilentAsync(acquireTokenSilentParameters);