Offentliga klientappar för enskilda och flera konton

Den här artikeln hjälper dig att förstå vilka typer som används i offentliga klientappar för enskilda och flera konton, med fokus på offentliga klientappar för enskilda konton.

ADAL (Azure Active Directory Authentication Library) modellerar servern. Microsofts autentiseringsbibliotek (MSAL) modellerar i stället klientprogrammet. Majoriteten av Android-appar betraktas som offentliga klienter. En offentlig klient är en app som inte säkert kan hålla en hemlighet.

MSAL är specialiserat på API-ytan PublicClientApplication för att förenkla och förtydliga utvecklingsupplevelsen för appar som endast tillåter att ett konto används i taget. PublicClientApplication är underklassad av SingleAccountPublicClientApplication och MultipleAccountPublicClientApplication. Följande diagram visar relationen mellan dessa klasser.

UML-klassdiagram för SingleAccountPublicClientApplication

Offentligt klientprogram för enskilt konto

Med SingleAccountPublicClientApplication klassen kan du skapa en MSAL-baserad app som bara tillåter att ett enda konto loggas in i taget. SingleAccountPublicClientApplication skiljer sig från PublicClientApplication på följande sätt:

  • MSAL spårar det inloggade kontot.
    • Om din app använder en broker (standardalternativet vid registrering av Microsoft Entra-appen) och är installerad på en enhet där en broker finns, verifierar MSAL att kontot fortfarande är tillgängligt på enheten.
  • signIn gör att du kan logga in på ett konto uttryckligen och separat från begäran om behörigheter.
  • acquireTokenSilent kräver ingen kontoparameter. Om du anger ett konto och kontot du anger inte matchar det aktuella kontot som spåras av MSAL genereras ett MsalClientException .
  • acquireToken tillåter inte att användaren byter konto. Om användaren försöker växla till ett annat konto utlöses ett undantag.
  • getCurrentAccount returnerar ett resultatobjekt som innehåller följande:
    • Ett booleskt värde som anger om kontot har ändrats. Ett konto kan till exempel ändras på grund av att det tas bort från enheten.
    • Det tidigare kontot. Detta är användbart om du behöver rensa lokala data när kontot tas bort från enheten eller när ett nytt konto är loggat in.
    • Det aktuella currentAccount.
  • signOut tar bort eventuella token som är associerade med klienten från enheten.

När en Android-autentiseringsförmedlare, till exempel Microsoft Authenticator, Link to Windows (LTW) eller Intune Company Portal, är installerad på enheten och din app är konfigurerad att använda förmedlaren, tar signOut inte bort kontot från enheten.

Scenario med ett enskilt konto

Följande pseudokod visar hur du använder 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;
}

Offentligt klientprogram för flera konton

Klassen MultipleAccountPublicClientApplication används för att skapa MSAL-baserade appar som gör att flera konton kan loggas in samtidigt. Det gör att du kan hämta, lägga till och ta bort konton på följande sätt:

Lägga till ett konto

Använd ett eller flera konton i ditt program genom att anropa acquireToken en eller flera gånger.

Hämta konton

  • Anropa getAccount för att hämta ett specifikt konto.
  • Anropa getAccountsför att hämta en lista över konton som för närvarande är kända för appen.

Din app kommer inte att kunna lista alla konton för Microsofts identitetsplattform på enheten som brokerappen känner till. Den kan bara räkna upp konton som har använts av din app. Konton som har tagits bort från enheten returneras inte av dessa funktioner.

Ta bort ett konto

Ta bort ett konto genom att anropa removeAccount med en kontoidentifierare.

Om din app är konfigurerad för att använda en broker, och en broker är installerad på enheten, tas kontot inte bort från brokern när du anropar removeAccount. Endast token som är associerade med klienten tas bort.

Scenario med flera konton

Följande pseudokod visar hur du skapar en app för flera konton, listar konton på enheten och hämtar token.

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