Openbare client-apps voor één en meerdere accounts

Dit artikel helpt u inzicht te krijgen in de typen die worden gebruikt in openbare client-apps voor één account en meerdere accounts, met een focus op openbare client-apps voor één account.

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

MSAL is gespecialiseerd in het API-gebied van het vereenvoudigen en verduidelijken van PublicClientApplication de ontwikkelervaring voor apps waarmee slechts één account tegelijk kan worden gebruikt. PublicClientApplication wordt gesubklasseerd door SingleAccountPublicClientApplication en MultipleAccountPublicClientApplication. In het volgende diagram ziet u de relatie tussen deze klassen.

SingleAccountPublicClientApplication-klassediagram in UML

Openbare clienttoepassing voor één account

Met SingleAccountPublicClientApplication de klasse kunt u een OP MSAL gebaseerde app maken waarmee slechts één 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 Microsoft Entra app-registratie) 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 kunt u zich expliciet en afzonderlijk van het aanvragen van scopes aanmelden bij een account.
  • 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 door MSAL wordt bijgehouden, wordt er een MsalClientException gegenereerd.
  • acquireToken staat de gebruiker niet toe om van account te wisselen. 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 Booleaanse waarde die aangeeft of het account is gewijzigd. Een account kan bijvoorbeeld worden gewijzigd doordat het van het apparaat wordt verwijderd.
    • 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 huidige account.
  • signOut verwijdert alle tokens die zijn gekoppeld aan uw client van het apparaat.

Wanneer op het apparaat een verificatiebroker voor Android, zoals Microsoft Authenticator, Link naar Windows (LTW) of Intune Bedrijfsportal, is geïnstalleerd en uw app is geconfigureerd om de broker te gebruiken, wordt met signOut de account niet van het apparaat verwijderd.

Scenario met één account

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

Openbare clienttoepassing voor meerdere accounts

De MultipleAccountPublicClientApplication klasse 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 een of meer keren aan te roepen acquireToken .

Accounts ophalen

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

Uw app kan niet alle Microsoft identity platform accounts op het apparaat inventariseren die bekend zijn bij de broker-app. Het kan alleen accounts inventariseren 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 een account-id aan te roepen removeAccount .

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 belt removeAccount. Alleen tokens die aan uw client zijn gekoppeld, worden verwijderd.

Scenario met meerdere accounts

De volgende pseudocode laat zien hoe u een app voor 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
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);