MSAL Browser'daki hesaplar

Bu, önbelleğe alınmış hesaplara erişmek için @azure/msal-browser aşağıdaki API'leri sağlayan, kitaplığın platforma özgü Hesaplar belgeleridir:

  • getAllAccounts(): şu anda önbellekte olan tüm hesapları döndürür. Belirli bir hesap kümesini döndürmek için isteğe bağlı bir filtreyi destekler. Bir uygulamanın, belirteçleri sessizce almak için bir hesap seçmesi gerekir.
  • getAccount(): geçirilen filtreyle eşleşen ilk önbelleğe alınmış hesabı döndürür. Hesapların önbellekten okunma sırası rastgeledir ve filtrelenen listedeki ilk hesabın herhangi iki çağrısı getAccountiçin aynı olacağının garantisi yoktur. Aşağıda açıklandığı gibi, filtre özniteliklerinin sayısını artırmak daha kesin eşleşmeler sağlayacaktır.

Hesap Filtresi Nesnesi

AccountFilter türü belgelerinde hesapları filtrelemek için kullanılabilecek ve birleştirilebilen özellikler listelenir.

Note

Tek bir hesap filtresi özniteliğinin önbelleğe alınmış bir hesap nesnesini benzersiz olarak tanımlaması genellikle garanti edilmemektedir. gibi homeAccountId + localAccountIdbirlikte yinelemeyecek özniteliklerin bir bileşimini eklemek, aramayı iyileştirmeye yardımcı olabilir.

Note

realm önbellektedir tenantId .

Aşağıdaki getAccountBy API'ler kullanım dışı bırakıldı. Lütfen bunun yerine uygun bir filtre nesnesi kullanın getAccount() :

  • getAccountByHomeId(): yerine kullanın getAccount({ homeAccountId }) .
  • getAccountByLocalId(): yerine kullanın getAccount({ localAccountId }) .
  • getAccountByUsername(): yerine kullanın getAccount({ username }) .

Aşağıda, bu API'leri kapsayan bir kullanım örnekleri verilmiştir:


let homeAccountId = null; // Initialize global accountId (can also be localAccountId or username) used for account lookup later, ideally stored in app state

// This callback is passed into `acquireTokenPopup` and `acquireTokenRedirect` to handle the interactive auth response
function handleResponse(resp) {
    if (resp !== null) {
        homeAccountId = resp.account.homeAccountId; // alternatively: resp.account.homeAccountId or resp.account.username
    } else {
        const currentAccounts = myMSALObj.getAllAccounts();
        if (currentAccounts.length < 1) { // No cached accounts
            return;
        } else if (currentAccounts.length > 1) { // Multiple account scenario
            // Add account selection code here
            homeAccountId = ...
        } else if (currentAccounts.length === 1) {
            homeAccountId = currentAccounts[0].homeAccountId; // Single account scenario
        }
    }
}

Şimdi, bir belirteci sessizce almadan önce önbelleğe alınmış hesabı aramak için , ve username gibi homeAccountIdlocalAccountIdhesap özellikleri kullanılabilir:

// This method attempts silent token acquisition and falls back on acquireTokenPopup
async function getTokenPopup(request, homeAccountId) {
    // In this case, accounts are filtered by homeAccountId, but more attributes can be added to refine the search and increase the precision of the account filter
    const accountFilter = {
        homeAccountId: homeAccountId,
    };
    request.account = myMSALObj.getAccount(accountFilter);
    return await myMSALObj.acquireTokenSilent(request).catch(async (error) => {
        // Handle error
        return await myMSALObj.acquireTokenPopup(request);
    });
}

Oturum açma ipucuna göre filtreleme

itibarıyla @azure/msal-browser@3.2.0, hesapları aramak ve filtrelemek için tüm oturum açma ipucu değerleri kullanılabilir. Oturum açma ipucuna göre filtrelemek için MSAL, eşleşmeleri aramak için nesnedeki AccountFilter değeri aşağıdaki hesap öznitelikleriyle karşılaştırır loginHint (öncelik sırasına göre):

  • login_hint Kimlik belirteci talebi
  • username account özelliği
  • upn Kimlik belirteci talebi

Note

Yukarıdaki tüm öznitelikler, özellik olarak hesap filtresine loginHint geçirilebilir. Hesap filtresi özniteliğini username olarak usernameda kabul eder ve daha performanslı bir arama yapar.

Talebi kullanma login_hint

const accountFilter = {
    loginHint: previouslyObtainedIdTokenClaims.login_hint;
};
request.account = myMSALObj.getAccount(accountFilter);
return await myMSALObj.acquireTokenSilent(request).catch(async (error) => {
    // Handle error
    return await myMSALObj.acquireTokenPopup(request);
});

'kullanıcı adı' kullanma

Note

username Değer nesneye AccountFilter veya loginHintolarak username eklenebilir. Bunun nedeni, talebin username belirteç hizmetinin oturum açma ipucu olarak kabul ettiği 3 değerden (ve upn kimlik belirteci talepleri ile login_hint birlikte) biri olmasıdır. Uygulamanız söz konusu değerin bir usernameolduğundan eminse, özelliği olarak AccountFilter.username ayarlamak daha iyi bir arama performansı sağlar. Uygulamanız bir username oturum açma ipucu kullanıyorsa ve bu değerin bir username, login_hintveya upn talepten gelip gelmediğine ilişkin bağlamı korumazsa, değeri olarak loginHint ayarlayabilmeniz yararlı olur.

Farklı geçirme usernameloginHint

const accountUsername = userProfile.username;
const accountFilter = {
    loginHint: accountUsername;
};
request.account = myMSALObj.getAccount(accountFilter);
return await myMSALObj.acquireTokenSilent(request).catch(async (error) => {
    // Handle error
    return await myMSALObj.acquireTokenPopup(request);
});

Farklı geçirme usernameusername

const accountUsername = userProfile.username;
const accountFilter = {
    username: accountUsername;
};
request.account = myMSALObj.getAccount(accountFilter);
return await myMSALObj.acquireTokenSilent(request).catch(async (error) => {
    // Handle error
    return await myMSALObj.acquireTokenPopup(request);
});

Talebi kullanma upn

const accountFilter = {
    loginHint: previouslyObtainedIdTokenClaims.upn;
};
request.account = myMSALObj.getAccount(accountFilter);
return await myMSALObj.acquireTokenSilent(request).catch(async (error) => {
    // Handle error
    return await myMSALObj.acquireTokenPopup(request);
});

Etkin Hesap API'leri

Kitaplık @azure/msal-browser ayrıca hangi hesabın şu anda "etkin" olduğunu ve belirteç istekleri için kullanılması gerektiğini izlemenize yardımcı olacak 2 kullanışlı API sağlar.

  • getActiveAccount(): Geçerli etkin hesabı döndürür
  • setActiveAccount(): Bir hesap nesnesi alır ve bunu etkin hesap olarak ayarlar

Belirteçleri almak için hangi hesabın kullanılacağına karar vermek uygulamaya bağlıdır ancak kullanmak istediğiniz hesabı belirledikten sonra API'yi seçilen hesap nesnesiyle çağırmanız setActiveAccount() yeterlidir. Tek tek istekte farklı bir hesap belirtilmezse, tüm acquireToken, login veya ssoSilent aramaları artık varsayılan olarak etkin hesabı kullanır. Şu anda etkin olan hesabı temizlemek için öğesini çağırabilirsiniz setActiveAccount(null).

function login() {
    return myMsalObj.loginPopup().then((response) => {
        // After a successful login set the active account to be the user that just logged in
        myMsalObj.setActiveAccount(response.account);
    });
}

function getAccessToken() {
    // Providing an account in the token request is not required if there is an active account set
    return myMsalObj.acquireTokenSilent({ scopes: ["User.Read"] });
}

Not: 2.16.0 sürümünden itibaren etkin hesap örneğinizde PublicClientApplication yapılandırılan önbellek konumunda depolanır. Önceki bir sürümü kullanıyorsanız etkin hesap bellek içinde depolanır ve bu nedenle her sayfa yükünde sıfırlanmalıdır.

İç İçe Uygulama Kimlik Doğrulaması

NAA uygulamaları setActiveAccount() için ve getActiveAccount() NO-OP API'lerdir. Kullanıcılar etkin hesapları ayarlayıp alabiliyor olsalar da, NAA uygulamasının her zaman tek bir hesabı olması beklendiğinden ve hesabın ile konak uygulaması accountContexttarafından sağlandığından etkin olarak yoksayılırlar. Gelecekte hub'lar arasında birden çok hesap desteklendiğinde bu davranışın değişmesi beklenir.

Notlar

  • Geçerli msal-browser varsayılan örneğinde çalışan tek bir hesap senaryosu vardır.
  • Birden çok hesap senaryonuz varsa, lütfen örneği (içinde handleResponse()) değiştirerek önbelleğe alınan tüm hesapları listeleyin ve belirli bir hesap seçin.
  • Bir uygulama' yı temel alan bir hesap almak istiyorsa, FILTREyi usernameusername API'de kullanmadan username önce (belirli bir login kullanıcının API'sinin yanıtından) kaydetmesi getAccount() gerekir.
  • getAllAccounts() birkaç etkileşimli belirteç isteğinde bulunduysanız ve kullanıcı bu etkileşimlerden iki veya daha fazlasında farklı hesaplar seçtiyse birden çok hesap döndürür. Microsoft Entra ID ilk etkileşimden sonra hesap seçim ekranını görüntülemesi için etkileşimli acquireToken veya oturum açma API'sine veya geçirmeniz prompt: "select_account"prompt: "login" gerekebilir.
  • Hesap API'leri yerel hesap durumunu döndürür ve mutlaka sunucu durumunu yansıtmaz. Daha önce MSAL.js kullanarak bu uygulamada oturum açmış hesapları döndürürler ve sunucu oturumu hala etkin olabilir veya olmayabilir.
  • Farklı etki alanlarında barındırılan iki uygulama, tarayıcı depolama alanı etki alanı tarafından segemented nedeniyle hesap durumunu paylaşmaz.
  • getAllAccounts() sipariş edilmez ve birden çok aramada aynı sırada olması garanti edilmez
  • AcquireToken veya oturum açma API'sine yapılan her başarılı çağrı tam olarak bir hesap döndürür