Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Este artigo ajudará você a entender os tipos usados em aplicativos cliente públicos de conta única e várias, com foco em aplicativos cliente públicos de conta única.
A ADAL (Biblioteca de Autenticação de Azure Active Directory) modela o servidor. Em vez disso, o Biblioteca do Microsoft Authenticator (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 de PublicClientApplication para simplificar e esclarecer a experiência de desenvolvimento de aplicativos que permitem o uso de apenas uma conta por vez.
PublicClientApplication tem como subclasses SingleAccountPublicClientApplication e MultipleAccountPublicClientApplication. O diagrama a seguir mostra a relação entre essas classes.
Aplicativo cliente público de conta única
A SingleAccountPublicClientApplication classe permite que você crie um aplicativo baseado em MSAL que só permita que uma única conta seja conectado por vez.
SingleAccountPublicClientApplication difere de PublicClientApplication das seguintes maneiras:
- A MSAL rastreia a conta atualmente conectada.
- Se o aplicativo estiver usando um agente (o padrão durante Microsoft Entra registro de aplicativo) e estiver instalado em um dispositivo em que um agente está presente, a MSAL verificará se a conta ainda está disponível no dispositivo.
-
signInpermite que você conecte uma conta explicitamente e de forma separada dos escopos de solicitação. -
acquireTokenSilentnão requer um parâmetro de conta. Se você fornecer uma conta e a conta fornecida não corresponder à conta atual rastreada pela MSAL,MsalClientExceptionserá gerado. -
acquireTokennão permite que o usuário mude de conta. Se o usuário tentar mudar para uma conta diferente, uma exceção será gerada. -
getCurrentAccountretorna um objeto de resultado que fornece o seguinte:- Um booliano que indica se a conta foi alterada. Uma conta pode ser alterada como resultado da remoção do dispositivo, por exemplo.
- A conta anterior. Isso é útil se você precisar fazer alguma limpeza local de dados quando a conta for removida do dispositivo ou quando uma nova conta fizer login.
- A currentAccount.
-
signOutremove todos os tokens associados ao seu cliente do dispositivo.
Quando um agente de Autenticação do Android, como Microsoft Authenticator, Link para Windows (LTW) ou Intune Portal da Empresa estiver instalado no dispositivo e seu 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.
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;
}
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 conectados 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 chamando acquireToken uma ou mais vezes.
Obter contas
- Chame
getAccountpara obter uma conta específica. - Chame
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 do agente. 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 aplicativo estiver configurado para usar um agente e um agente estiver instalado no dispositivo, a conta não será removida do agente quando você chamar removeAccount. Somente 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
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);