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 ett och flera konton, med fokus på offentliga klientappar för ett konto.
Azure Active Directory Authentication Library (ADAL) modellerar servern. Microsoft Authentication Library (MSAL) modellerar i stället klientprogrammet. De flesta 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
. I följande diagram visas relationen mellan dessa klasser.
Offentligt klientprogram för enskilt konto
Med SingleAccountPublicClientApplication
klassen kan du skapa en MSAL-baserad app som endast 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 asynkron meddelandekö (standard under Azure Portal appregistrering) och installeras 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 inte någon kontoparameter. Om du anger ett konto och det konto som 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 genereras ett undantag.getCurrentAccount
returnerar ett resultatobjekt som tillhandahå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 loggas in.
- CurrentAccount.
signOut
tar bort eventuella token som är associerade med klienten från enheten.
När en asynkron 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 tillåter att flera konton 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å enheten som är kända 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 är konfigurerad för att använda en asynkron meddelandekö och en asynkron meddelandekö är installerad på enheten tas inte kontot bort från den asynkrona meddelandekön 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)
{
}
});