Aplicativos cliente públicos de conta única e múltipla

Este artigo irá ajudá-lo a entender os tipos usados em aplicativos cliente público de conta única e múltipla, com foco em aplicativos cliente público de conta única.

A Microsoft Authentication Library (MSAL) modela seu aplicativo cliente. A maioria dos aplicativos Android são considerados 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 para simplificar e esclarecer a experiência de desenvolvimento de PublicClientApplication aplicativos que permitem que apenas uma conta seja usada de cada vez. PublicClientApplication é subclassificada por 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 SingleAccountPublicClientApplication classe permite que você crie um aplicativo baseado em MSAL que só permite que uma única conta seja conectada de cada vez. SingleAccountPublicClientApplication difere das PublicClientApplication seguintes formas:

  • A MSAL rastreia a conta conectada no momento.
    • Se seu aplicativo estiver usando um broker (o padrão durante o registro do aplicativo do portal do Azure) e estiver instalado em um dispositivo onde um broker esteja presente, a MSAL verificará se a conta ainda está disponível no dispositivo.
  • signIn permite que você entre em uma conta explicitamente e separadamente da solicitação de escopos.
  • 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, uma MsalClientException será lançada.
  • acquireToken não permite que o usuário mude de conta. Se o usuário tentar mudar para uma conta diferente, uma exceção será lançada.
  • getCurrentAccount Retorna um objeto Result que fornece o seguinte:
    • Um booleano indicando se a conta mudou. Uma conta pode ser alterada como resultado de ser removida do dispositivo, por exemplo.
    • A conta anterior. Isso é útil se você precisar fazer qualquer limpeza de dados local quando a conta for removida do dispositivo ou quando uma nova conta estiver conectada.
    • A conta corrente.
  • signOut Remove todos os tokens associados ao seu cliente do dispositivo.

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

Cenário de conta única

O pseudocódigo a seguir ilustra o uso do 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 MultipleAccountPublicClientApplication classe é usada para criar aplicativos baseados em MSAL que permitem que várias contas sejam conectadas ao mesmo tempo. Ele permite que você obtenha, adicione e remova contas da seguinte maneira:

Adicionar uma conta

Use uma ou mais contas em seu aplicativo ligando uma acquireToken ou mais vezes.

Obter contas

  • Ligue getAccount para obter uma conta específica.
  • Ligue getAccountspara obter uma lista de contas atualmente conhecidas pelo aplicativo.

Seu aplicativo não poderá enumerar todas as contas da plataforma de identidade da Microsoft no dispositivo conhecido pelo aplicativo corretor. Ele só pode enumerar contas que foram usadas pelo seu 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 seu aplicativo estiver configurado para usar um broker e um broker estiver instalado no dispositivo, a conta não será removida do broker quando você ligar removeAccountpara o . Apenas os tokens associados ao seu 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)
        {
        }
});