Openbare client-apps met enkele of meerdere accounts

Met dit artikel krijgt u inzicht in de typen die worden gebruikt in openbare client-apps met enkele en meerdere accounts, met een focus op openbare client-apps met enkele accounts.

De Azure Active Directory Authentication Library (ADAL) modelleert de server. De Microsoft Authentication Library (MSAL) modelleert in plaats daarvan uw clienttoepassing. De meeste Android-apps worden beschouwd als openbare clients. Een openbare client is een app die een geheim niet veilig kan houden.

MSAL is gespecialiseerd in het API-oppervlak van PublicClientApplication om de ontwikkelervaring voor apps waarmee slechts één account tegelijk kan worden gebruikt te vereenvoudigen en te verduidelijken. PublicClientApplication zijn subklassen van SingleAccountPublicClientApplication en MultipleAccountPublicClientApplication. Het volgende diagram geeft de relatie tussen deze klassen weer.

SingleAccountPublicClientApplication UML-klassediagram

Openbare client-apps met enkele accounts

Met de SingleAccountPublicClientApplication-klasse kunt u een OP MSAL gebaseerde app maken waarmee een enkele account tegelijk kan worden aangemeld. SingleAccountPublicClientApplication verschilt van PublicClientApplication op de volgende manieren:

  • MSAL houdt het momenteel aangemelde account bij.
    • Als uw app een broker gebruikt (de standaardinstelling tijdens app-registratie van Azure Portal) en is geïnstalleerd op een apparaat waarop een broker aanwezig is, controleert MSAL of het account nog steeds beschikbaar is op het apparaat.
  • signIn hiermee kunt u zich expliciet en afzonderlijk aanmelden voor het aanvragen van bereiken.
  • acquireTokenSilent hiervoor is geen accountparameter vereist. Als u wel een account opgeeft en het account dat u opgeeft, niet overeenkomt met het huidige account dat wordt bijgehouden door MSAL, wordt er een MsalClientException gegenereerd.
  • acquireToken staat de gebruiker niet toe om van account over te schakelen. Als de gebruiker probeert over te schakelen naar een ander account, wordt er een uitzondering gegenereerd.
  • getCurrentAccount retourneert een resultaatobject dat het volgende biedt:
    • Een Boole-waarde die aangeeft of het account is gewijzigd. Een account kan bijvoorbeeld worden gewijzigd als gevolg van het verwijderen van het apparaat.
    • Het vorige account. Dit is handig als u lokale gegevens moet opschonen wanneer het account van het apparaat wordt verwijderd of wanneer een nieuw account is aangemeld.
    • Het currentAccount.
  • signOut verwijdert alle tokens die zijn gekoppeld aan uw client van het apparaat.

Wanneer een Android Authentication Broker, zoals Microsoft Authenticator of Intune-bedrijfsportal is geïnstalleerd op het apparaat en uw app is geconfigureerd voor het gebruik van de broker, verwijderd signOut het account niet van het apparaat.

Scenario boot enkele accounts

De volgende pseudocode illustreert het gebruik van 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.
app.signIn(getActivity(), scopes, new AuthenticationCallback()
{

        @Override
        public void onSuccess(IAuthenticationResult authenticationResult) 
        {
            mAccount = authenticationResult.getAccount();
        }

        @Override
        public void onError(MsalException exception)
        {
        }

        @Override
        public void onCancel()
        {
        }
    }
);

// 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;
}

Openbare client-apps met meerdere accounts

De klasse MultipleAccountPublicClientApplication wordt gebruikt om op MSAL gebaseerde apps te maken waarmee meerdere accounts tegelijkertijd kunnen worden aangemeld. Hiermee kunt u accounts als volgt ophalen, toevoegen en verwijderen:

Een account toevoegen

Gebruik een of meer accounts in uw toepassing door acquireToken een of meerdere keren aan te roepen.

Accounts ophalen

  • Roep getAccount aan om een specifiek account op te halen.
  • Roep getAccountsaan om een lijst met accounts op te halen die momenteel bekend zijn bij de app.

Uw app kan niet alle Microsoft Identity Platform-accounts op het apparaat inventariseren die bekend zijn bij de broker-app. Het kan alleen accounts opsommen die door uw app zijn gebruikt. Accounts die van het apparaat zijn verwijderd, worden niet geretourneerd door deze functies.

Een account verwijderen

Verwijder een account door removeAccount aan te roepen met een account-id.

Als uw app is geconfigureerd voor het gebruik van een broker en er een broker op het apparaat is geïnstalleerd, wordt het account niet verwijderd uit de broker wanneer u removeAccount aanroept. Alleen tokens die aan uw client zijn gekoppeld, worden verwijderd.

Scenario met meerdere accounts

De volgende pseudocode laat zien hoe u een app met meerdere accounts maakt, accounts op het apparaat weergeeft en tokens verkrijgt.

// 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
app.acquireToken(getActivity(), scopes, new AuthenticationCallback()
 {

        @Override
        public void onSuccess(IAuthenticationResult authenticationResult) 
        {
            mAccount = authenticationResult.getAccount();
        }

        @Override
        public void onError(MsalException exception)
        {
        }

        @Override
        public void onCancel()
        {
        }
 });

...

// 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
app.acquireTokenSilentAsync(scopes, selectedAccount, authority, new SilentAuthenticationCallback()
{

        @Override
        public void onSuccess(IAuthenticationResult authenticationResult) 
        {
            mAccount = authenticationResult.getAccount();
        }

        @Override
        public void onError(MsalException exception)
        {
        }
});