Общедоступные клиентские приложения для одной и нескольких учетных записей
Из этой статьи вы узнаете, какие типы используются в общедоступных клиентских приложениях для одной и нескольких учетных записей, при этом особое внимание уделено общедоступным клиентским приложениям для одной учетной записи.
Библиотека проверки подлинности Майкрософт (MSAL) моделирует клиентское приложение. Большинство приложений Android считаются общедоступными клиентами. Общедоступный клиент — это приложение, которое не может безопасно хранить секрет.
MSAL специализирует поверхность API PublicClientApplication
для упрощения и уточнения процесса разработки для приложений, в которых можно использовать только одну учетную запись за раз. Для PublicClientApplication
созданы подклассы SingleAccountPublicClientApplication
и MultipleAccountPublicClientApplication
. На следующей схеме показана связь между этими классами.
Общедоступное клиентское приложение для одной учетной записи
С помощью класса 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)
{
}
});