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.

Microsoft Authentication Library (MSAL) modellerar 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.

SingleAccountPublicClientApplication UML Class Diagram

Offentligt klientprogram för enskilt konto

Med SingleAccountPublicClientApplication klassen kan du skapa en MSAL-baserad app som bara tillåter att ett enskilt 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 asynkron meddelandekö (standardvärdet vid registrering av Azure-portalappen) och är installerad på en enhet där en asynkron meddelandekö finns, kontrollerar MSAL att kontot fortfarande är tillgängligt på enheten.
  • signIn gör att du kan logga in ett konto explicit och separat från att begära omfång.
  • 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.
    • CurrentAccount.
  • signOut tar bort eventuella token som är associerade med klienten från enheten.

När en Android-autentiseringskoordinator, till exempel Microsoft Authenticator eller Intune-företagsportal installeras på enheten och appen är konfigurerad för att använda asynkron meddelandekö, signOut tas inte kontot bort 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.
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;
}

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 räkna upp alla Microsofts identitetsplattform konton på den enhet som är känd för koordinatorappen. 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 har konfigurerats för att använda en asynkron meddelandekö och en asynkron meddelandekö har installerats på enheten tas kontot inte bort från asynkron meddelandekö 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
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)
        {
        }
});