Pojedyncze i wiele publicznych aplikacji klienckich konta

Ten artykuł pomoże Ci zrozumieć typy używane w aplikacjach klienckich z jednym i wieloma kontami publicznymi, koncentrując się na aplikacjach klienckich z jednym kontem publicznym.

Biblioteka Microsoft Authentication Library (MSAL) modeluje aplikację kliencą. Większość aplikacji systemu Android jest traktowana jako klienci publiczni. Klient publiczny to aplikacja, która nie może bezpiecznie przechowywać wpisu tajnego.

Biblioteka MSAL specjalizuje się w powierzchni interfejsu PublicClientApplication API, aby uprościć i wyjaśnić środowisko programistyczne dla aplikacji, które umożliwiają korzystanie tylko z jednego konta naraz. PublicClientApplication jest podklasy według SingleAccountPublicClientApplication i MultipleAccountPublicClientApplication. Na poniższym diagramie przedstawiono relację między tymi klasami.

SingleAccountPublicClientApplication UML Class Diagram

Publiczna aplikacja kliencka pojedynczego konta

Klasa SingleAccountPublicClientApplication umożliwia utworzenie aplikacji opartej na protokole MSAL, która umożliwia logowanie tylko jednego konta naraz. SingleAccountPublicClientApplication różni się od PublicClientApplication następujących sposobów:

  • Biblioteka MSAL śledzi aktualnie zalogowane konto.
    • Jeśli aplikacja korzysta z brokera (domyślnego podczas rejestracji aplikacji w witrynie Azure Portal) i jest zainstalowana na urządzeniu, na którym znajduje się broker, biblioteka MSAL sprawdzi, czy konto jest nadal dostępne na urządzeniu.
  • signIn umożliwia jawne i oddzielne logowanie się do konta od żądań zakresów.
  • acquireTokenSilent nie wymaga parametru konta. Jeśli podasz konto, a podane konto nie jest zgodne z bieżącym kontem śledzonym przez bibliotekę MSAL, MsalClientException zostanie zwrócony błąd.
  • acquireToken nie zezwala użytkownikowi na przełączanie kont. Jeśli użytkownik spróbuje przełączyć się na inne konto, zostanie zgłoszony wyjątek.
  • getCurrentAccount Zwraca obiekt wynikowy, który udostępnia następujące elementy:
    • Wartość logiczna wskazująca, czy konto uległo zmianie. Konto może zostać zmienione w wyniku usunięcia go z urządzenia, na przykład.
    • Poprzednie konto. Jest to przydatne, jeśli musisz wykonać czyszczenie danych lokalnych po usunięciu konta z urządzenia lub zalogowaniu się nowego konta.
    • Bieżącykonto.
  • signOut Usuwa wszystkie tokeny skojarzone z klientem z urządzenia.

Jeśli na urządzeniu jest zainstalowany broker uwierzytelniania systemu Android, taki jak Microsoft Authenticator lub Intune — Portal firmy, a aplikacja jest skonfigurowana do korzystania z brokera, signOut nie usunie konta z urządzenia.

Scenariusz pojedynczego konta

Poniższy pseudo kod ilustruje użycie metody 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;
}

Wiele publicznych aplikacji klienckich kont

Klasa MultipleAccountPublicClientApplication służy do tworzenia aplikacji opartych na protokole MSAL, które umożliwiają logowanie wielu kont jednocześnie. Umożliwia pobieranie, dodawanie i usuwanie kont w następujący sposób:

Dodaj konto

Użyj co najmniej jednego konta w aplikacji, wywołując acquireToken co najmniej jeden raz.

Pobieranie kont

  • Wywołaj metodę getAccount , aby uzyskać określone konto.
  • Wywołaj metodę getAccounts, aby uzyskać listę kont, które są obecnie znane aplikacji.

Aplikacja nie będzie mogła wyliczać wszystkich kont Platforma tożsamości Microsoft na urządzeniu znanym aplikacji brokera. Może on wyliczać tylko konta, które zostały użyte przez aplikację. Konta, które zostały usunięte z urządzenia, nie będą zwracane przez te funkcje.

Usuwanie konta

Usuń konto, wywołując removeAccount przy użyciu identyfikatora konta.

Jeśli aplikacja jest skonfigurowana do korzystania z brokera, a broker jest zainstalowany na urządzeniu, konto nie zostanie usunięte z brokera po wywołaniu metody removeAccount. Usuwane są tylko tokeny skojarzone z klientem.

Scenariusz z wieloma kontami

Poniższy pseudo kod pokazuje, jak utworzyć wiele aplikacji konta, wyświetlić listę kont na urządzeniu i uzyskać 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
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)
        {
        }
});