Compartilhar via


Aplicativos cliente públicos de uma única conta e de várias contas

Este artigo o ajudará a reconhecer os tipos usados em aplicativos cliente públicos de uma ou várias contas, com foco em aplicativos cliente públicos de conta única.

A MSAL (Biblioteca de Autenticação da Microsoft) modela o aplicativo cliente. A maioria dos aplicativos Android é considerada clientes públicos. Um cliente público é um aplicativo que não pode manter um segredo com segurança.

A MSAL especializa a superfície da API do PublicClientApplication para simplificar e esclarecer a experiência de desenvolvimento para aplicativos que permitem o uso de apenas uma conta de cada vez. PublicClientApplication é subclasse de SingleAccountPublicClientApplication e MultipleAccountPublicClientApplication. O diagrama a seguir mostra a relação entre essas classes.

SingleAccountPublicClientApplication UML Class Diagram

Aplicativo cliente público de conta única

A classe SingleAccountPublicClientApplication permite que você crie um aplicativo baseado em MSAL, possibilitando que apenas uma única conta seja conectada por vez. SingleAccountPublicClientApplication é diferente de PublicClientApplication nestes aspectos:

  • A MSAL rastreia a conta atualmente conectada.
    • Se o aplicativo estiver usando um agente (o padrão durante o registro de aplicativo do portal do Azure) e estiver instalado em um dispositivo em que um agente está presente, a MSAL verificará se a conta ainda está disponível no dispositivo.
  • signIn permite que você conecte uma conta explicitamente e separadamente dos escopos de solicitação.
  • acquireTokenSilent não requer um parâmetro de conta. Se você fornecer uma conta e a conta fornecida não corresponder à conta atual rastreada pela MSAL, MsalClientException será gerado.
  • acquireToken não permite que o usuário alterne contas. Se o usuário tentar alternar para uma conta diferente, uma exceção será gerada.
  • getCurrentAccount retorna um objeto de resultado que fornece o seguinte:
    • Um booliano que indica se a conta foi alterada. Uma conta pode ser alterada como resultado de ter sido removida do dispositivo, por exemplo.
    • A conta anterior. Isso será útil se você precisar fazer qualquer limpeza de dados local quando a conta for removida do dispositivo ou quando uma nova conta for conectada.
    • A currentAccount.
  • signOut remove todos os tokens associados ao cliente do dispositivo.

Quando um agente de Autenticação do Android, como o Microsoft Authenticator ou o Portal da Empresa do Intune estiver instalado no dispositivo e o aplicativo estiver configurado para usar o agente, signOut não removerá a conta do dispositivo.

Cenário de conta única

O pseudocódigo a seguir ilustra o uso de 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;
}

Aplicativo cliente público de várias contas

A classe MultipleAccountPublicClientApplication é usada para criar aplicativos baseados em MSAL que permitem que várias contas sejam assinadas ao mesmo tempo. Ela permite que você receba, adicione e remova contas da seguinte forma:

Adicionar uma conta

Use uma ou mais contas no aplicativo chamando acquireToken uma ou mais vezes.

Obter contas

  • Chame getAccount para obter uma conta específica.
  • Chame getAccounts para obter uma lista de contas atualmente conhecidas para o aplicativo.

Seu aplicativo não poderá enumerar todas as contas da plataforma de identidade da Microsoft no dispositivo conhecido pelo aplicativo do agente. Ele só pode enumerar contas que foram usadas pelo aplicativo. As contas que foram removidas do dispositivo não serão retornadas por essas funções.

Remover uma conta

Remova uma conta chamando removeAccount com um identificador de conta.

Se o aplicativo estiver configurado para usar um agente, e houver um agente instalado no dispositivo, a conta não será removida do agente quando você chamar removeAccount. Somente os tokens associados ao cliente são removidos.

Cenário de várias contas

O pseudocódigo a seguir mostra como criar um aplicativo de várias contas, listar contas no dispositivo e adquirir tokens.

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