Aplicaciones cliente públicas de cuenta única y de varias cuentas

Este artículo le ayudará a comprender los tipos usados en aplicaciones cliente públicas de una y varias cuentas, con un enfoque en las aplicaciones cliente públicas de una sola cuenta.

La biblioteca de autenticación de Azure Active Directory (ADAL) modela el servidor. En su lugar, el Biblioteca de autenticación de Microsoft (MSAL) modela la aplicación cliente. La mayoría de las aplicaciones Android se consideran clientes públicos. Un cliente público es una aplicación que no puede mantener un secreto de forma segura.

MSAL especializa la superficie de API de PublicClientApplication para simplificar y aclarar la experiencia de desarrollo de las aplicaciones que permiten usar solo una cuenta a la vez. PublicClientApplication es subclasado por SingleAccountPublicClientApplication y MultipleAccountPublicClientApplication. En el diagrama siguiente se muestra la relación entre estas clases.

Diagrama de clases UML de SingleAccountPublicClientApplication

Aplicación cliente pública de cuenta única

La SingleAccountPublicClientApplication clase permite crear una aplicación basada en MSAL que solo permite iniciar sesión en una sola cuenta a la vez. SingleAccountPublicClientApplication difiere de PublicClientApplication en los siguientes aspectos:

  • MSAL realiza un seguimiento de la cuenta que tiene iniciada la sesión actualmente.
    • Si la aplicación usa un agente (el valor predeterminado durante Microsoft Entra registro de aplicaciones) y se instala en un dispositivo donde está presente un agente, MSAL comprobará que la cuenta sigue estando disponible en el dispositivo.
  • signIn le permite iniciar sesión en una cuenta de forma explícita y separada de los ámbitos de solicitud.
  • acquireTokenSilent no requiere un parámetro de cuenta. Si proporciona una cuenta y la cuenta que proporciona no coincide con la cuenta actual cuyo seguimiento se realiza mediante MSAL, se produce la excepción MsalClientException.
  • acquireToken no permite al usuario cambiar de cuenta. Si el usuario intenta cambiar a otra cuenta, se produce una excepción.
  • getCurrentAccount devuelve un objeto de resultado que proporciona lo siguiente:
    • Valor booleano que indica si la cuenta ha cambiado. Una cuenta puede cambiar, por ejemplo, al ser eliminada del dispositivo.
    • La cuenta anterior. Esto resulta útil si necesita realizar una limpieza de datos local cuando se quita la cuenta del dispositivo o cuando se inicia sesión en una nueva cuenta.
    • La currentAccount.
  • signOut elimina del dispositivo todos los tokens asociados a tu cliente.

Cuando un agente de autenticación de Android, como Microsoft Authenticator, Vincular a Windows (LTW) o Intune Portal de empresa, está instalado en el dispositivo y la aplicación está configurada para usar el agente, signOut no eliminará la cuenta del dispositivo.

Escenario de una sola cuenta

En el pseudocódigo siguiente se muestra el 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.
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;
}

Aplicación cliente pública de varias cuentas

La MultipleAccountPublicClientApplication clase se usa para crear aplicaciones basadas en MSAL que permiten que varias cuentas inicien sesión al mismo tiempo. Permite obtener, agregar y quitar cuentas de la siguiente manera:

Agregar una cuenta

Use una o varias cuentas en la aplicación llamando a acquireToken una o varias veces.

Obtención de cuentas

  • Llame getAccount a para obtener una cuenta específica.
  • Llama a getAccounts para obtener una lista de las cuentas que la aplicación conoce actualmente.

La aplicación no podrá enumerar todas las cuentas de la Plataforma de identidad de Microsoft en el dispositivo conocido por la aplicación de agente. Solo puede enumerar las cuentas que ha usado la aplicación. Estas funciones no devolverán las cuentas que se han quitado del dispositivo.

Quitar una cuenta

Elimine una cuenta llamando a removeAccount con un identificador de cuenta.

Si la aplicación está configurada para usar un broker y hay un broker instalado en el dispositivo, la cuenta no se quitará del broker al llamar a removeAccount. Solo se quitan los tokens asociados con el cliente.

Escenario de varias cuentas

En el pseudocódigo siguiente se muestra cómo crear una aplicación de varias cuentas, enumerar cuentas en el dispositivo y 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);