Öffentliche Client-Apps für einzelne und mehrere Konten
Dieser Artikel hilft Ihnen dabei, die in öffentlichen Client-Apps für einzelne und mehrere Konten verwendeten Typen zu verstehen, wobei der Schwerpunkt auf öffentlichen Client-Apps für einzelne Konten liegt.
Ihre Clientanwendung wird von der Microsoft-Authentifizierungsbibliothek (Microsoft Authentication Library, MSAL) modelliert. Die meisten Android-Apps gelten als öffentliche Clients. Ein öffentlicher Client ist eine App, die einen geheimen Schlüssel nicht sicher aufbewahren kann.
MSAL spezialisiert die API-Oberfläche von PublicClientApplication
, um die Entwicklungsumgebung für Apps zu vereinfachen und zu verdeutlichen, die jeweils nur ein Konto verwenden können. Für PublicClientApplication
sind die Unterklassen SingleAccountPublicClientApplication
und MultipleAccountPublicClientApplication
definiert. Im folgenden Diagramm ist die Beziehung zwischen diesen Klassen dargestellt.
Öffentliche Clientanwendung für ein einzelnes Konto
Die SingleAccountPublicClientApplication
-Klasse ermöglicht Ihnen das Erstellen einer MSAL-basierten App, die jeweils nur die Anmeldung eines einzelnen Kontos zulässt. SingleAccountPublicClientApplication
unterscheidet sich auf folgende Weise von PublicClientApplication
:
- MSAL verfolgt das aktuell angemeldete Konto nach.
- Wenn Ihre App einen Broker verwendet (Standard bei der App-Registrierung im Azure-Portal) und auf einem Gerät installiert ist, auf dem ein Broker vorhanden ist, überprüft MSAL, ob das Konto weiterhin auf dem Gerät verfügbar ist.
- Mit
signIn
können Sie ein Konto explizit und separat von der Anforderung von Bereichen anmelden. acquireTokenSilent
erfordert keinen Kontoparameter. Wenn Sie ein Konto angeben und das von Ihnen angegebene Konto nicht dem von MSAL nachverfolgten aktuellen Konto entspricht, wird eineMsalClientException
ausgelöst.acquireToken
lässt nicht zu, dass der Benutzer Konten wechselt. Wenn der Benutzer versucht, zu einem anderen Konto zu wechseln, wird eine Ausnahme ausgelöst.getCurrentAccount
gibt ein Ergebnisobjekt zurück, das Folgendes angibt:- Einen booleschen Wert, der angibt, ob das Konto geändert wurde. Ein Konto kann beispielsweise geändert werden, wenn ein Konto vom Gerät entfernt wurde.
- Das vorherige Konto. Dies ist hilfreich, wenn Sie eine lokale Datenbereinigung durchführen müssen, wenn das Konto vom Gerät entfernt wird oder ein neues Konto angemeldet wird.
- Das aktuelle Konto.
signOut
entfernt alle Ihrem Client zugeordneten Token vom Gerät.
Wenn ein Android-Authentifizierungsbroker wie z. B. Microsoft Authenticator oder Intune-Unternehmensportal auf dem Gerät installiert ist und Ihre App für die Verwendung des Brokers konfiguriert ist, entfernt signOut
das Konto nicht vom Gerät.
Szenario mit einem einzelnen Konto
Im folgenden Pseudocode wird die Verwendung von SingleAccountPublicClientApplication
veranschaulicht.
// 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.
app.signIn(getActivity(), scopes, new AuthenticationCallback()
{
@Override
public void onSuccess(IAuthenticationResult authenticationResult)
{
mAccount = authenticationResult.getAccount();
}
@Override
public void onError(MsalException exception)
{
}
@Override
public void onCancel()
{
}
}
);
// 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;
}
Öffentliche Clientanwendung für mehrere Konten
Die MultipleAccountPublicClientApplication
-Klasse wird verwendet, um MSAL-basierte Apps zu erstellen, die ein gleichzeitiges Anmelden mehrerer Konten zulassen. Damit können Sie Konten wie folgt abrufen, hinzufügen und entfernen:
Konto hinzufügen
Verwenden Sie ein oder mehrere Konten in Ihrer Anwendung, indem Sie acquireToken
einmal oder mehrmals aufrufen.
Abrufen von Konten
- Rufen Sie
getAccount
auf, um ein bestimmtes Konto abzurufen. - Rufen Sie
getAccounts
auf, um eine Liste der Konten abzurufen, die der App aktuell bekannt sind.
Ihre App kann nicht alle auf dem Gerät vorhandenen Microsoft Identity Platform-Konten auflisten, die der Broker-App bekannt sind. Es können nur die von Ihrer App verwendeten Konten aufgelistet werden. Konten, die vom Gerät entfernt wurden, werden von diesen Funktionen nicht zurückgegeben.
Entfernen eines Kontos
Entfernen Sie ein Konto, indem Sie removeAccount
mit einem Kontobezeichner aufrufen.
Wenn Ihre App für die Verwendung eines Brokers konfiguriert ist und ein Broker auf dem Gerät installiert ist, wird das Konto nicht vom Broker entfernt, wenn Sie removeAccount
aufrufen. Es werden nur Ihrem Client zugeordnete Token entfernt.
Szenario mit mehreren Konten
Aus dem folgenden Pseudocode geht hervor, wie Sie eine App für mehrere Konten erstellen, Konten auf dem Gerät auflisten und Token abrufen.
// 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
app.acquireToken(getActivity(), scopes, new AuthenticationCallback()
{
@Override
public void onSuccess(IAuthenticationResult authenticationResult)
{
mAccount = authenticationResult.getAccount();
}
@Override
public void onError(MsalException exception)
{
}
@Override
public void onCancel()
{
}
});
...
// 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
app.acquireTokenSilentAsync(scopes, selectedAccount, authority, new SilentAuthenticationCallback()
{
@Override
public void onSuccess(IAuthenticationResult authenticationResult)
{
mAccount = authenticationResult.getAccount();
}
@Override
public void onError(MsalException exception)
{
}
});