Общедоступные клиентские приложения для одной и нескольких учетных записей

Из этой статьи вы узнаете, какие типы используются в общедоступных клиентских приложениях для одной и нескольких учетных записей, при этом особое внимание уделено общедоступным клиентским приложениям для одной учетной записи.

Библиотека проверки подлинности Майкрософт (MSAL) моделирует клиентское приложение. Большинство приложений Android считаются общедоступными клиентами. Общедоступный клиент — это приложение, которое не может безопасно хранить секрет.

MSAL специализирует поверхность API PublicClientApplication для упрощения и уточнения процесса разработки для приложений, в которых можно использовать только одну учетную запись за раз. Для PublicClientApplication созданы подклассы SingleAccountPublicClientApplication и MultipleAccountPublicClientApplication. На следующей схеме показана связь между этими классами.

SingleAccountPublicClientApplication UML Class Diagram

Общедоступное клиентское приложение для одной учетной записи

С помощью класса SingleAccountPublicClientApplication можно создать приложение на основе MSAL, которое разрешает вход только в одну учетную запись за раз. SingleAccountPublicClientApplication имеет следующие отличия от PublicClientApplication :

  • MSAL отслеживает текущую учетную запись, с которой выполнен вход в систему.
    • Если приложение использует брокер (по умолчанию во время регистрации приложения на портале Azure) и устанавливается на устройстве, где есть брокер, MSAL проверит, доступна ли по-прежнему учетная запись на устройстве.
  • signIn позволяет выполнять вход в учетную запись явным образом и отдельно от запроса областей.
  • Для acquireTokenSilent не требуется параметр учетной записи. Если вы указываете учетную запись, которая не соответствует текущей учетной записи, отслеживающей MSAL, будет создано исключение MsalClientException.
  • acquireToken не позволяет пользователю переключать учетные записи. Если пользователь попытается переключиться на другую учетную запись, возникнет исключение.
  • getCurrentAccount возвращает результирующий объект, предоставляющий следующее:
    • Логическое значение, указывающее, изменена ли учетная запись. К примеру, учетная запись может быть изменена в результате удаления с устройства.
    • Предыдущая учетная запись. Это полезно, если необходимо выполнить очистку локальных данных при удалении учетной записи с устройства или при входе в новую учетную запись.
    • currentAccount.
  • signOut удаляет с устройства все токены, связанные с клиентом.

Если на устройстве установлен брокер проверки подлинности Android, например Microsoft Authenticator или Корпоративный портал Intune, а в приложении настроено использование брокера, signOut не удалит учетную запись с устройства.

Сценарий с одной учетной записью

Следующий псевдокод иллюстрирует использование 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;
}

Общедоступное клиентское приложение для нескольких учетных записей

Класс MultipleAccountPublicClientApplication используется для создания приложений на основе MSAL, которые позволяют войти в несколько учетных записей одновременно. С его помощью можно получать, добавлять и удалять учетные записи следующим образом.

Добавить учетную запись

Используйте одну или несколько учетных записей в приложении, вызвав acquireToken один или несколько раз.

Получение учетных записей

  • Вызовите getAccount, чтобы получить определенную учетную запись.
  • Вызовите getAccounts, чтобы получить список учетных записей, известных приложению.

Приложение не сможет перечислять все учетные записи платформы удостоверений Майкрософт на устройстве, известном приложению брокера. Оно может перечислять только учетные записи, используемые приложением. Учетные записи, удаленные с устройства, не будут возвращены этими функциями.

Удаление учетной записи

Удалите учетную запись, вызвав removeAccount с помощью идентификатора учетной записи.

Если в приложении настроено использование брокера и он установлен на устройстве, то при вызове removeAccount учетная запись не будет удалена из брокера. Удаляются только токены, связанные с клиентом.

Сценарий с несколькими учетными записями

В следующем псевдокоде показано, как создать приложение с несколькими учетными записями, вывести список учетных записей на устройстве и получить токены.

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