Tek ve birden çok hesap genel istemci uygulamaları

Bu makale, tek ve birden çok hesap genel istemci uygulamalarında kullanılan türleri anlamanıza ve tek hesap genel istemci uygulamalarına odaklanmanıza yardımcı olur.

Azure Active Directory Kimlik Doğrulama Kitaplığı (ADAL) sunucuyu modeller. bunun yerine Microsoft Authentication Library (MSAL), istemci uygulamanızı modeller. Android uygulamalarının çoğu genel istemci olarak kabul edilir. Genel istemci, bir gizemi güvenli bir şekilde saklayamayan bir uygulamadır.

MSAL, api yüzeyini PublicClientApplication , aynı anda yalnızca bir hesabın kullanılmasına izin veren uygulamalar için geliştirme deneyimini basitleştirmek ve netleştirmek için özelleştirir. PublicClientApplicationve SingleAccountPublicClientApplicationtarafından MultipleAccountPublicClientApplication alt sınıflandırılır. Aşağıdaki diyagramda bu sınıflar arasındaki ilişki gösterilmektedir.

SingleAccountPublicClientApplication UML Sınıf Diyagramı

Tek hesaplı genel istemci uygulaması

sınıfı, SingleAccountPublicClientApplication aynı anda yalnızca tek bir hesabın oturum açmasına izin veren MSAL tabanlı bir uygulama oluşturmanıza olanak tanır. SingleAccountPublicClientApplication aşağıdaki şekillerden PublicClientApplication farklıdır:

  • MSAL, şu anda oturum açmış olan hesabı izler.
    • Uygulamanız bir aracı kullanıyorsa (Microsoft Entra uygulama kaydı sırasında varsayılan değer) ve bir aracının bulunduğu bir cihazda yüklüyse, MSAL hesabın cihazda hala kullanılabilir olduğunu doğrular.
  • signIn , bir hesapta kapsam istemeden açıkça ve ayrı olarak oturum açmanıza olanak tanır.
  • acquireTokenSilent hesap parametresi gerektirmez. Bir hesap belirtirseniz ve belirttiğiniz hesap MSAL’ın izlediği geçerli hesapla eşleşmiyorsa, bir MsalClientException fırlatılır.
  • acquireToken kullanıcının hesap değiştirmesine izin vermez. Kullanıcı farklı bir hesaba geçmeye çalışırsa bir özel durum fırlatılır.
  • getCurrentAccount aşağıdakileri sağlayan bir sonuç nesnesi döndürür:
    • Hesabın değişip değişmediğini gösteren boole değeri. Örneğin cihazdan kaldırılan bir hesap değiştirilebilir.
    • Önceki hesap. Bu, hesap cihazdan kaldırıldığında veya yeni bir hesap oturum açtığında herhangi bir yerel veri temizleme işlemi yapmanız gerektiğinde kullanışlıdır.
    • Geçerli currentAccount.
  • signOut istemcinizle ilişkili tüm belirteçleri cihazdan kaldırır.

Microsoft Authenticator, Windows Bağlantısı (LTW) veya Intune Şirket Portalı gibi bir Android kimlik doğrulama aracısı cihaza yüklüyse ve uygulamanız aracıyı kullanacak şekilde yapılandırılmışsa, signOut hesabı cihazdan kaldırmaz.

Tek hesap senaryosu

Aşağıdaki sözde kod, SingleAccountPublicClientApplication kullanımını gösterir.

// 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;
}

Birden çok hesap genel istemci uygulaması

sınıfı MultipleAccountPublicClientApplication , birden çok hesabın aynı anda oturum açmasına olanak sağlayan MSAL tabanlı uygulamalar oluşturmak için kullanılır. Hesapları aşağıdaki gibi almanıza, eklemenize ve kaldırmanıza olanak tanır:

Hesap ekleme

Bir veya daha fazla kez arayarak acquireToken uygulamanızda bir veya daha fazla hesap kullanın.

Hesapları getir

  • Belirli bir hesabı almak için arayın getAccount .
  • Şu anda uygulama tarafından bilinen hesapların listesini almak için arayın getAccounts.

Uygulamanız, aracı uygulamanın bildiği cihazdaki tüm Microsoft kimlik platformu hesaplarını listeleyemez. Yalnızca uygulamanız tarafından kullanılan hesapları numaralandırabilir. Cihazdan kaldırılan hesaplar bu işlevler tarafından döndürülmeyecektir.

Hesabı kaldırma

Bir hesabı, hesap tanımlayıcısı ile removeAccount çağrısı yaparak kaldırın.

Uygulamanız bir broker kullanacak şekilde yapılandırılmışsa ve cihazda bir broker yüklüyse, removeAccount çağırdığınızda hesap broker’dan kaldırılmaz. Yalnızca istemcinizle ilişkili belirteçler kaldırılır.

Birden çok hesap senaryosu

Aşağıdaki sahte kodda birden çok hesap uygulaması oluşturma, cihazdaki hesapları listeleme ve belirteç alma işlemleri gösterilmektedir.

// 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);