Veřejné klientské aplikace s jedním a více účty

Tento článek vám pomůže pochopit typy používané v jednoúčelových veřejných klientských aplikacích s více účty a zaměřit se na veřejné klientské aplikace s jedním účtem.

Knihovna Azure Active Directory Authentication Library (ADAL) modeluje server. Místo toho Identity a ověřování Microsoftu (MSAL) modeluje vaši klientskou aplikaci. Většina aplikací pro Android se považuje za veřejné klienty. Veřejný klient je aplikace, která nemůže bezpečně uchovávat tajný kód.

MSAL se specializuje na rozhraní PublicClientApplication API pro zjednodušení a objasnění vývojového prostředí pro aplikace, které umožňují používat vždy jenom jeden účet. PublicClientApplication je podtříděna podle SingleAccountPublicClientApplication a MultipleAccountPublicClientApplication. Následující diagram znázorňuje vztah mezi těmito třídami.

Diagram tříd UML pro SingleAccountPublicClientApplication

Veřejná klientská aplikace s jedním účtem

Třída SingleAccountPublicClientApplication umožňuje vytvořit aplikaci založenou na MSAL, která umožňuje přihlášení pouze jednoho účtu najednou. SingleAccountPublicClientApplication se liší od PublicClientApplication v následujících způsobech:

  • MSAL sleduje aktuálně přihlášený účet.
    • Pokud vaše aplikace používá zprostředkovatele (výchozí nastavení při registraci aplikace Microsoft Entra) a je nainstalovaná na zařízení, kde je zprostředkovatel, nástroj MSAL ověří, jestli je účet na zařízení stále dostupný.
  • signIn umožňuje explicitně se přihlásit k účtu odděleně od žádosti o oprávnění.
  • acquireTokenSilent nevyžaduje parametr účtu. Pokud zadáte účet a zadaný účet neodpovídá aktuálnímu účtu sledovanému službou MSAL, vyvolá se chyba MsalClientException .
  • acquireToken neumožňuje uživateli přepnout účty. Pokud se uživatel pokusí přepnout na jiný účet, vyvolá se výjimka.
  • getCurrentAccount vrátí objekt výsledku, který poskytuje následující:
    • Logická hodnota označující, jestli se účet změnil. Účet se může změnit například v důsledku odebrání ze zařízení.
    • Předchozí účet. To je užitečné, pokud potřebujete provést vyčištění místních dat, když je účet odebrán ze zařízení nebo když je nový účet přihlášený.
    • Aktuální účet.
  • signOut odebere všechny tokeny přidružené k vašemu klientovi ze zařízení.

Pokud je na zařízení nainstalovaný zprostředkovatel ověřování androidu, jako je Microsoft Authenticator, odkaz na Windows (LTW) nebo Intune Portál společnosti a vaše aplikace je nakonfigurovaná tak, aby používala zprostředkovatele, signOut neodebere účet ze zařízení.

Scénář s jedním účtem

Následující pseudokód znázorňuje použití 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;
}

Veřejná klientská aplikace s více účty

Třída MultipleAccountPublicClientApplication se používá k vytváření aplikací založených na MSAL, které umožňují přihlášení více účtů najednou. Umožňuje získat, přidat a odebrat účty následujícím způsobem:

Přidání účtu

Použijte jeden nebo více účtů ve vaší aplikaci voláním acquireToken jednou nebo vícekrát.

Získání účtů

  • Zavolejte getAccount, abyste získali konkrétní účet.
  • Voláním getAccounts zobrazíte seznam účtů, které aplikace aktuálně zná.

Vaše aplikace nebude moct vytvořit výčet všech účtů Microsoft identity platform v zařízení známém pro aplikaci zprostředkovatele. Může vytvořit výčet jenom účtů, které vaše aplikace používala. Tyto funkce nevrátí účty, které byly ze zařízení odebrány.

Odebrání účtu

Odeberte účet voláním removeAccount s identifikátorem účtu.

Pokud je vaše aplikace nakonfigurovaná pro použití zprostředkovatele a v zařízení je nainstalovaný zprostředkovatel, účet se při volání removeAccount ze zprostředkovatele neodebere. Odeberou se jenom tokeny přidružené k vašemu klientovi.

Scénář s více účty

Následující pseudokód ukazuje, jak vytvořit aplikaci s více účty, vypsat účty na zařízení a získat tokeny.

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