Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Ten artykuł pomoże Ci zrozumieć typy używane w aplikacjach klienckich z jednym i wieloma kontami publicznymi, koncentrując się na aplikacjach klienckich z jednym kontem publicznym.
Biblioteka Azure Active Directory Authentication Library (ADAL) modeluje serwer. Biblioteka Microsoft Authentication Library (MSAL) zamiast tego odwzorowuje aplikację kliencką. Większość aplikacji systemu Android jest traktowana jako klienci publiczni. Klient publiczny to aplikacja, która nie może bezpiecznie przechowywać sekretu.
Biblioteka MSAL dostosowuje interfejs API elementu PublicClientApplication, aby uprościć i usprawnić proces tworzenia aplikacji umożliwiających korzystanie tylko z jednego konta jednocześnie.
PublicClientApplication ma podklasy SingleAccountPublicClientApplication i MultipleAccountPublicClientApplication. Na poniższym diagramie przedstawiono relację między tymi klasami.
Publiczna aplikacja kliencka z jednym kontem
Klasa SingleAccountPublicClientApplication umożliwia utworzenie aplikacji opartej na protokole MSAL, która umożliwia logowanie tylko jednego konta naraz.
SingleAccountPublicClientApplication różni się od PublicClientApplication pod następującymi względami:
- MSAL śledzi konto, na które użytkownik jest obecnie zalogowany.
- Jeśli aplikacja korzysta z brokera (ustawienie domyślne podczas rejestracji aplikacji Microsoft Entra) i jest instalowane na urządzeniu, na którym znajduje się broker, biblioteka MSAL sprawdzi, czy konto jest nadal dostępne na urządzeniu.
-
signInumożliwia jawne zalogowanie się na konto, oddzielnie od żądania zakresów uprawnień. -
acquireTokenSilentnie wymaga parametru konta. Jeśli jednak podasz konto, a podane konto nie będzie zgodne z bieżącym kontem śledzonym przez MSAL, zostanie zgłoszony wyjątekMsalClientException. -
acquireTokennie zezwala użytkownikowi na przełączanie kont. Jeśli użytkownik spróbuje przełączyć się na inne konto, zostanie zgłoszony wyjątek. -
getCurrentAccountZwraca obiekt wynikowy, który udostępnia następujące elementy:- Wartość logiczna wskazująca, czy konto uległo zmianie. Konto może zostać zmienione w wyniku usunięcia go z urządzenia, na przykład.
- Poprzednie konto. Jest to przydatne, jeśli musisz wykonać czyszczenie danych lokalnych po usunięciu konta z urządzenia lub zalogowaniu się nowego konta.
- Bieżące konto.
-
signOutUsuwa wszystkie tokeny skojarzone z klientem z urządzenia.
Jeśli broker uwierzytelniania systemu Android, taki jak Microsoft Authenticator, link do Windows (LTW) lub usługa Intune Portal firmy jest zainstalowana na urządzeniu, a aplikacja jest skonfigurowana do korzystania z brokera, signOut nie usunie konta z urządzenia.
Scenariusz pojedynczego konta
Poniższy pseudo kod ilustruje użycie metody 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;
}
Publiczna aplikacja kliencka dla wielu kont
Klasa MultipleAccountPublicClientApplication służy do tworzenia aplikacji opartych na protokole MSAL, które umożliwiają logowanie wielu kont jednocześnie. Umożliwia pobieranie, dodawanie i usuwanie kont w następujący sposób:
Dodaj konto
Użyj co najmniej jednego konta w aplikacji, wywołując acquireToken co najmniej jeden raz.
Pobierz konta
- Wywołaj
getAccount, aby uzyskać konkretne konto. - Wywołaj metodę
getAccounts, aby uzyskać listę kont, które są obecnie znane aplikacji.
Aplikacja nie będzie mogła wyliczać wszystkich kont Platforma tożsamości Microsoft na urządzeniu znanym aplikacji brokera. Może on wyliczać tylko konta, które zostały użyte przez aplikację. Konta, które zostały usunięte z urządzenia, nie będą zwracane przez te funkcje.
Usuwanie konta
Usuń konto, wywołując removeAccount przy użyciu identyfikatora konta.
Jeśli aplikacja jest skonfigurowana do korzystania z brokera, a broker jest zainstalowany na urządzeniu, konto nie zostanie usunięte z brokera po wywołaniu metody removeAccount. Usuwane są tylko tokeny skojarzone z klientem.
Scenariusz z wieloma kontami
Poniższy pseudokod pokazuje, jak utworzyć aplikację obsługującą wiele kont, wyświetlić konta na urządzeniu i uzyskać tokeny.
// 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);