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.
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 ettMsalClientException
.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
getAccounts
fö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)
{
}
});