Modo de dispositivo compartilhado para dispositivos Android

Trabalhadores da linha de frente, como associados de varejo, membros da tripulação de voo e trabalhadores do serviço de campo geralmente usam um dispositivo móvel compartilhado para executar seu trabalho. Esses dispositivos compartilhados podem apresentar riscos de segurança se os usuários compartilharem suas senhas ou PINs, intencionalmente ou não, para acessar dados comerciais e de clientes no dispositivo compartilhado.

O modo de dispositivo compartilhado permite configurar um dispositivo Android 8.0 ou superior, de modo que os funcionários possam compartilhar o dispositivo com segurança. Os funcionários podem fazer login uma vez e obter logon único (SSO) em todos os aplicativos que oferecem suporte a esse recurso, o que lhes dá acesso mais rápido às informações. Quando os funcionários saem depois de concluir seu turno ou tarefa, eles são automaticamente desconectados do dispositivo e de todos os aplicativos compatíveis, deixando o dispositivo pronto para o próximo usuário.

Para aproveitar o recurso Modo de Dispositivo Compartilhado, os desenvolvedores de aplicativos e os administradores de dispositivos de nuvem trabalham juntos:

  1. Os administradores de dispositivos preparam o dispositivo para ser compartilhado manualmente ou usando um provedor de gerenciamento de dispositivo móvel (MDM), como Microsoft Intune. A opção preferencial é usar um MDM, pois permite configurar o dispositivo em modo de dispositivo compartilhado em larga escala por meio do provisionamento sem toque. O MDM envia o aplicativo Microsoft Authenticator para os dispositivos e ativa o "Modo Compartilhado" para cada dispositivo por meio de uma atualização de configuração gerenciada para o dispositivo. Essa configuração de Modo Compartilhado é o que altera o comportamento dos aplicativos com suporte no dispositivo. Essa configuração do provedor de MDM define o modo de dispositivo compartilhado para o dispositivo e dispara o registro de dispositivo compartilhado usando o Aplicativo Authenticator.

  2. Os desenvolvedores de aplicativos gravam um aplicativo de conta única (não há suporte para aplicativos de várias contas no modo de dispositivo compartilhado) para lidar com o seguinte cenário:

    • Fazer login de um usuário em todo o dispositivo em qualquer aplicativo compatível
    • Desconecte um usuário em todos os dispositivos por meio de qualquer aplicativo compatível
    • Consultar o estado do dispositivo para determinar se seu aplicativo está em um dispositivo que está no modo de dispositivo compartilhado
    • Consultar o estado do dispositivo do usuário para determinar as alterações em seu aplicativo desde o último uso

    O suporte ao modo de dispositivo compartilhado deve ser considerado uma atualização de recurso para seu aplicativo e pode ajudar a aumentar sua adoção em ambientes em que o mesmo dispositivo é usado entre vários usuários.

    Importante

    Microsoft aplicativos que dão suporte ao modo de dispositivo compartilhado no Android não exigem nenhuma alteração e só precisam ser instalados no dispositivo para obter os benefícios que vêm com o modo de dispositivo compartilhado.

Configurar o dispositivo no modo de dispositivo compartilhado

Para configurar seu dispositivo Android para dar suporte ao modo de dispositivo compartilhado, ele deve estar executando o Sistema Operacional Android 8.0 ou posterior. O dispositivo também deve ser limpo por meio de uma redefinição de fábrica ou então todos os aplicativos da Microsoft e outros aplicativos com o modo de dispositivo compartilhado habilitado devem ser desinstalados e reinstalados.

O Microsoft Intune oferece suporte ao provisionamento sem toque para dispositivos no modo de dispositivo compartilhado do Microsoft Entra, o que significa que o dispositivo pode ser configurado e inscrito no Intune com interação mínima do funcionário da linha de frente. Para configurar um dispositivo no modo de dispositivo compartilhado ao usar o Microsoft Intune como o MDM, consulte Configurar a inscrição de dispositivos no modo de dispositivo compartilhado do Microsoft Entra.

Modificar seu aplicativo Android para dar suporte ao modo de dispositivo compartilhado

Seus usuários dependem de você para garantir que seus dados não sejam vazados para outro usuário. As seções a seguir fornecem sinais úteis para indicar ao aplicativo que ocorreu uma alteração e deve ser tratada. Você é responsável por verificar o estado do usuário no dispositivo sempre que seu aplicativo é usado e limpar os dados do usuário anterior. Isso inclui se ele foi recarregado a partir do plano de fundo em várias tarefas. Em uma alteração de usuário, você deve garantir que os dados do usuário anterior sejam limpos e que todos os dados em cache exibidos em seu aplicativo sejam removidos. É altamente recomendável que você e sua empresa realizem um processo de revisão de segurança depois de atualizar seu aplicativo para dar suporte ao modo de dispositivo compartilhado.

Adicionar o SDK do Biblioteca do Microsoft Authenticator (MSAL) às dependências do aplicativo

Adicione a biblioteca MSAL como uma dependência em seu arquivo build.gradle, da seguinte maneira:

dependencies{
  implementation 'com.microsoft.identity.client.msal:5.+'
}

Configurar seu aplicativo para usar o modo de dispositivo compartilhado

Os aplicativos escritos usando o SDK da MSAL (Biblioteca de Autenticação da Microsoft) podem gerenciar uma única conta ou várias contas. Para obter detalhes, consulte o modo de conta única ou o modo de várias contas. As aplicações de modo de dispositivo partilhado só funcionam no modo de conta única.

Se você não pretende dar suporte ao modo de múltiplas contas, defina "account_mode" como "SINGLE" no seu arquivo de configuração do MSAL. Isso garante que seu aplicativo sempre obterá ISingleAccountPublicClientApplication e simplifica significativamente a integração do MSAL. O valor padrão de "account_mode" é "MULTIPLE", portanto é importante alterar esse valor no arquivo de configuração se você está usando o modo "single account".

Aqui está um exemplo do arquivo de configuração:

{
  "client_id": "Client ID after app registration at https://aka.ms/MobileAppReg",
  "authorization_user_agent": "WEBVIEW",
  "redirect_uri": "Redirect URI after app registration at https://aka.ms/MobileAppReg",
  "account_mode": "SINGLE",
  "broker_redirect_uri_registered": true,
  "authorities": [
    {
      "type": "AAD",
      "audience": {
        "type": "AzureADandPersonalMicrosoftAccount",
        "tenant_id": "common"
      }
    }
  ]
}

Consulte a documentação de configuração para obter mais informações sobre como configurar o arquivo de configuração.

Suporte a conta única e várias contas

Seu aplicativo pode ser criado para dar suporte à execução em dispositivos pessoais e compartilhados. Se seu aplicativo atualmente dá suporte a várias contas e você deseja dar suporte ao modo de dispositivo compartilhado, adicione suporte para o modo de conta única.

Você também pode querer que seu aplicativo altere o comportamento a depender do tipo de dispositivo onde ele está sendo executado. Use ISingleAccountPublicClientApplication.isSharedDevice() para determinar quando executar no modo de conta única.

Há duas interfaces diferentes que representam o tipo de dispositivo no qual seu aplicativo está. Quando você solicita uma instância de aplicativo do Application Factory da MSAL, o objeto de aplicativo correto é fornecido automaticamente.

O modelo de objeto a seguir ilustra o tipo de objeto que você pode receber e o que significa no contexto de um dispositivo compartilhado:

modelo de herança de aplicativo cliente público

Você precisa realizar uma verificação de tipo e fazer uma conversão para a interface apropriada ao obter o objeto PublicClientApplication. O seguinte código verifica os modos de várias contas ou de conta única e faz a conversão apropriada do objeto de aplicativo:

private IPublicClientApplication mApplication;

        // Running in personal-device mode?
        if (mApplication instanceOf IMultipleAccountPublicClientApplication) {
          IMultipleAccountPublicClientApplication multipleAccountApplication = (IMultipleAccountPublicClientApplication) mApplication;
          ...
        // Running in shared-device mode?
        } else if (mApplication instanceOf ISingleAccountPublicClientApplication) {
           ISingleAccountPublicClientApplication singleAccountApplication = (ISingleAccountPublicClientApplication) mApplication;
            ...
        }

As seguintes diferenças se aplicam dependendo se seu aplicativo está em execução em um dispositivo compartilhado ou pessoal:

Dispositivo no modo compartilhado Dispositivo pessoal
Contas Conta única Várias contas
Entrada Global Global
Logoff Global Cada aplicativo pode controlar se a saída é local para o aplicativo.
Tipos de conta com suporte Somente contas corporativas Contas pessoais e de trabalho são suportadas

Inicializar o objeto PublicClientApplication

Se você definir "account_mode":"SINGLE" no arquivo de configuração do MSAL, você poderá converter com segurança o objeto de aplicativo retornado como um ISingleAccountPublicCLientApplication.

private ISingleAccountPublicClientApplication mSingleAccountApp;

PublicClientApplication.create(
    this.getApplicationCOntext(),
    R.raw.auth_config_single_account,
    new PublicClientApplication.ApplicationCreatedListener() {

        @Override
        public void onCreated(IPublicClientApplication application){
            mSingleAccountApp = (ISingleAccountPublicClientApplication)application;
        }

        @Override
        public void onError(MsalException exception){
            /*Fail to initialize PublicClientApplication */
        }
    });

Detectar o modo compartilhado do dispositivo

A detecção do modo de dispositivo compartilhado é importante para seu aplicativo. Muitos aplicativos exigem uma alteração na experiência do usuário (UX) quando o aplicativo é usado em um dispositivo compartilhado. Por exemplo, seu aplicativo pode ter um recurso de "Inscrição", o que não é apropriado para um trabalhador de linha de frente, pois eles provavelmente já têm uma conta. Talvez você também queira adicionar segurança extra ao tratamento de dados do aplicativo se ele estiver no modo de dispositivo compartilhado.

Use a API isSharedDevice no IPublicClientApplication para determinar se um aplicativo está em execução em um dispositivo no modo de dispositivo compartilhado.

Os snippets de código a seguir mostram exemplos de como usar a isSharedDevice API.

deviceModeTextView.setText(mSingleAccountApp.isSharedDevice() ? "Shared" : "Non-Shared");

Obter o usuário conectado e determinar se houve mudança de usuário no dispositivo

Outra parte importante do suporte ao modo de dispositivo compartilhado é determinar o estado do usuário no dispositivo e limpar os dados do aplicativo se um usuário tiver sido alterado ou se não houver nenhum usuário no dispositivo. Você é responsável por garantir que os dados não sejam vazados para outro usuário.

Você pode usar getCurrentAccountAsync a API para consultar a conta atualmente assinada no dispositivo.

O método loadAccount recupera a conta do usuário conectado. O método onAccountChanged determina se o usuário conectado mudou e, nesse caso, limpa:

private void loadAccount()
{
  mSingleAccountApp.getCurrentAccountAsync(new ISingleAccountPublicClientApplication.CurrentAccountCallback())
  {
    @Override
    public void onAccountLoaded(@Nullable IAccount activeAccount)
    {
      if (activeAccount != null)
      {
        signedInUser = activeAccount;
        final AcquireTokenSilentParameters silentParameters = new AcquireTokenSilentParameters.Builder()
                        .fromAuthority(signedInUser.getAuthority())
                        .forAccount(signedInUser)
                        .withScopes(Arrays.asList(getScopes()))
                        .withCallback(getAuthSilentCallback())
                        .build();
        mSingleAccountApp.acquireTokenSilentAsync(silentParameters);
      }
    }
    @Override
    public void onAccountChanged(@Nullable IAccount priorAccount, @Nullable Iaccount currentAccount)
    {
      if (currentAccount == null)
      {
        //Perform a cleanup task as the signed-in account changed.
        cleaUp();
      }
    }
    @Override
    public void onError(@NonNull Exception exception)
    {
        //getCurrentAccountAsync failed
    }
  }
}

Efetuar login de um usuário de forma global

Quando um dispositivo é configurado como um dispositivo compartilhado, seu aplicativo pode chamar a signIn API para entrar na conta. A conta estará disponível globalmente para todos os aplicativos qualificados no dispositivo depois que o primeiro aplicativo entrar na conta.

final SignInParameters signInParameters = ... /* create SignInParameters object */
mSingleAccountApp.signIn(signInParameters);

Desconectar um usuário globalmente

O código a seguir remove a conta conectada e limpa os tokens em cache não apenas do aplicativo, mas também do dispositivo que está em modo de dispositivo compartilhado. No entanto, ele não limpa os dados do aplicativo. Você deve limpar os dados do aplicativo e limpar todos os dados armazenados em cache que seu aplicativo possa estar exibindo para o usuário.

mSingleAccountApp.signOut(new ISingleAccountPublicClientApplication.SignOutCallback() {
    @Override
    public void onSignOut() {
        // clear data from your application
    }

    @Override
    public void onError(@NonNull MsalException exception) {
        // signout failed, show error
    }
});

Receber uma difusão para detectar a saída global iniciada em outros aplicativos

Para receber o broadcast de alteração de conta, você precisa registrar um broadcast receiver. É recomendável registrar o receptor da difusão por meio dos Receptores registrados com contexto.

Quando uma difusão de alteração de conta for recebida, obtenha imediatamente o usuário conectado e determine se o usuário foi alterado no dispositivo. Se uma alteração for detectada, inicie a limpeza de dados da conta inserida anteriormente. É recomendável interromper corretamente todas as operações e fazer a limpeza dos dados.

O snippet de código abaixo mostra como você pode registrar um receptor de transmissão.

private static final String CURRENT_ACCOUNT_CHANGED_BROADCAST_IDENTIFIER = "com.microsoft.identity.client.sharedmode.CURRENT_ACCOUNT_CHANGED";
private BroadcastReceiver mAccountChangedBroadcastReceiver;
private void registerAccountChangeBroadcastReceiver(){
    mAccountChangedBroadcastReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            //INVOKE YOUR PRIOR ACCOUNT CLEAN UP LOGIC HERE
        }
    };
    IntentFilter filter = new

    IntentFilter(CURRENT_ACCOUNT_CHANGED_BROADCAST_IDENTIFIER);
    this.registerReceiver(mAccountChangedBroadcastReceiver, filter);
}

Microsoft aplicativos que dão suporte ao modo de dispositivo compartilhado

Esses aplicativos da Microsoft dão suporte ao modo de dispositivo compartilhado do Microsoft Entra:

MDMs de terceiros que dão suporte ao modo de dispositivo compartilhado

Esses provedores terceirizados de MDM (Mobile Gerenciamento de Dispositivos) dão suporte ao modo de dispositivo compartilhado do Microsoft Entra:

Saída da sessão em dispositivos compartilhados e o ciclo de vida do aplicativo em geral

Quando um usuário sai, você precisa tomar medidas para proteger a privacidade e os dados do usuário. Por exemplo, se você estiver criando um aplicativo de registros médicos, é importante garantir que, quando o usuário encerrar a sessão, os registros de pacientes exibidos anteriormente sejam apagados. Seu aplicativo deve estar preparado para privacidade de dados e verificação de dados a cada vez que ele entrar no primeiro plano.

Quando seu aplicativo usa a MSAL para desconectar o usuário em um aplicativo em execução no dispositivo que está no modo compartilhado, a conta de entrada e os tokens armazenados em cache são removidos do aplicativo e do dispositivo.

O diagrama a seguir mostra o ciclo de vida geral do aplicativo e os eventos comuns que podem ocorrer durante a execução do aplicativo. O diagrama abrange desde o momento em que uma atividade é iniciada, o login e o logout de uma conta, até como eventos como pausar, retomar e parar a atividade se encaixam nesse processo.

Ciclo de vida do aplicativo de dispositivo compartilhado

Próximas Etapas 

Configure um dispositivo Android para executar aplicativos no modo de dispositivo compartilhado e teste seu aplicativo.

Modo de dispositivo compartilhado para dispositivos Android