Aplicações cliente públicas de conta única e de várias contas

Este artigo irá ajudá-lo a compreender os tipos usados em aplicações de cliente público de uma ou múltiplas contas, com foco em aplicações de cliente público de conta única.

A Biblioteca de Autenticação Azure Active Directory (ADAL) modela o servidor. A Biblioteca de Autenticação da Microsoft (MSAL) modela, em vez disso, a sua aplicação cliente. A maioria das aplicações Android são consideradas clientes públicos. Um cliente público é uma aplicação que não consegue guardar um segredo de forma segura.

A MSAL especializa-se na superfície da PublicClientApplication API para simplificar e clarificar a experiência de desenvolvimento de aplicações que permitem usar apenas uma conta de cada vez. PublicClientApplication é subclassificado por SingleAccountPublicClientApplication e MultipleAccountPublicClientApplication. O diagrama seguinte mostra a relação entre estas classes.

Diagrama de Classes UML de SingleAccountPublicClientApplication

Aplicação pública de cliente de conta única

A SingleAccountPublicClientApplication aula permite-te criar uma aplicação baseada em MSAL que só permite iniciar sessão de uma única conta de cada vez. SingleAccountPublicClientApplication difere dos PublicClientApplication seguintes aspetos:

  • O MSAL acompanha a conta atualmente iniciada.
    • Se a sua aplicação estiver a usar um corretor (o padrão durante o registo da aplicação Microsoft Entra) e estiver instalada num dispositivo onde um corretor esteja presente, a MSAL verificará se a conta ainda está disponível no dispositivo.
  • signIn Permite-lhe iniciar sessão numa conta de forma explícita e separada de pedir os Scopes.
  • acquireTokenSilent Não requer um parâmetro de conta. Se fornecer uma conta e a conta fornecida não corresponder à conta atual registada pela MSAL, é lançada uma MsalClientException.
  • acquireToken não permite ao utilizador mudar de conta. Se o utilizador tentar mudar para outra conta, é lançada uma exceção.
  • getCurrentAccount devolve um objeto de resultado que fornece o seguinte:
    • Um valor booleano que indica se a conta foi alterada. Uma conta pode ser alterada como resultado de ser removida do dispositivo, por exemplo.
    • A conta anterior. Isto é útil se precisares de fazer alguma limpeza local de dados quando a conta é removida do dispositivo ou quando uma nova conta é iniciada.
    • A Conta Corrente.
  • signOut remove todos os tokens associados ao seu cliente do dispositivo.

Quando um broker de autenticação Android, como o Microsoft Authenticator, Link to Windows (LTW) ou Intune Portal da Empresa, está instalado no dispositivo e a sua aplicação está configurada para usar o broker, signOut não remove a conta do dispositivo.

Cenário de conta única

O pseudocódigo seguinte ilustra a utilização 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.
SignInParameters signInParameters = SignInParameters.builder()
        .withActivity(getActivity()) // Pass the current activity
        .withScopes(scopes) // Specify the scopes
        .withCallback(new AuthenticationCallback() {
            @Override
            public void onSuccess(IAuthenticationResult authenticationResult){
                mAccount = authenticationResult.getAccount();
            }
    
            @Override
            public void onError(MsalException exception){
            }
    
            @Override
            public void onCancel(){
            }
        })
        .build();


app.signIn(signInParameters);

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

Aplicação cliente pública para várias contas

A MultipleAccountPublicClientApplication classe é usada para criar aplicações baseadas em MSAL que permitem iniciar sessão de várias contas ao mesmo tempo. Permite-lhe obter, adicionar e remover contas da seguinte forma:

Adicionar uma conta

Use uma ou mais contas na sua candidatura ligando acquireToken uma ou mais vezes.

Obter contas

  • Ligue getAccount para obter uma conta específica.
  • Ligue getAccountspara obter uma lista de contas atualmente conhecidas na aplicação.

A sua aplicação não conseguirá listar todas as contas da plataforma de identidades da Microsoft no dispositivo que sejam conhecidas pela aplicação intermediária. Só pode enumerar contas que foram usadas pela sua aplicação. As contas que foram removidas do dispositivo não serão devolvidas por estas funções.

Remover uma conta

Remova uma conta ligando removeAccount com um identificador de conta.

Se a sua aplicação estiver configurada para usar um corretor, e um corretor estiver instalado no dispositivo, a conta não será removida do corretor quando ligar removeAccount. Apenas os tokens associados ao seu cliente são removidos.

Cenário de múltiplas contas

O pseudocódigo seguinte mostra como criar uma aplicação com múltiplas 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
AcquireTokenParameters acquireTokenParameters = new AcquireTokenParameters.Builder()
        .startAuthorizationFromActivity(getActivity())
        .withScopes(scopes)
        .withCallback(new AuthenticationCallback(){
    
            @Override
            public void onSuccess(IAuthenticationResult authenticationResult) {
                mAccount = authenticationResult.getAccount();
            }
    
            @Override
            public void onError(MsalException exception){
            }
    
            @Override
            public void onCancel(){
            }
         })
        .build();
app.acquireToken(acquireTokenParameters);


...

// 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
AcquireTokenSilentParameters acquireTokenSilentParameters = new AcquireTokenSilentParameters.Builder()
        .withScopes(scopes)
        .forAccount(selectedAccount)
        .fromAuthority(authority)
        .withCallback(new SilentAuthenticationCallback() {

            @Override
            public void onSuccess(IAuthenticationResult authenticationResult) {
                mAccount = authenticationResult.getAccount();
            }
    
            @Override
            public void onError(MsalException exception){
            }
        })
        .build();
app.acquireTokenSilentAsync(acquireTokenSilentParameters);