MSAL.js ile çoklu oturum açma

Çoklu oturum açma (SSO), kullanıcıdan kimlik bilgileri istenmesi sayısını azaltarak daha sorunsuz bir deneyim sağlar. Kullanıcılar kimlik bilgilerini bir kez girer ve oluşturulan oturum, daha fazla sorulmadan aynı cihazdaki diğer uygulamalar tarafından yeniden kullanılabilir.

Microsoft Entra ID, kullanıcı ilk kez kimlik doğrulaması yaparken oturum tanımlama bilgisi ayarlayarak SSO'ya olanak tanır. MSAL.js ayrıca kullanıcının kimlik belirteçlerini ve erişim belirteçlerini uygulama etki alanı başına tarayıcı depolama alanında önbelleğe alır. Microsoft Entra oturum tanımlama bilgisi ile Microsoft Authentication Library (MSAL) önbelleği olan bu iki mekanizma, birbirinden bağımsızdır ancak SSO davranışı sağlamak için birlikte çalışır.

Aynı uygulama için tarayıcı sekmeleri arasında SSO

Bir kullanıcının birkaç sekmede açık bir uygulaması olduğunda ve bunlardan birinde oturum açtığında, sorulmadan diğer sekmelerde açık olan aynı uygulamada oturum açabilir. Bunu yapmak için, aşağıdaki örnekte gösterildiği gibi MSAL.js yapılandırma nesnesinde localStorage değerini olarak ayarlamanız gerekir:

const config = {
  auth: {
    clientId: "1111-2222-3333-4444-55555555",
  },
  cache: {
    cacheLocation: "localStorage",
  },
};

const msalInstance = new msal.PublicClientApplication(config);

Bu durumda, farklı tarayıcı sekmelerindeki uygulama örnekleri aynı MSAL önbelleğini kullanır ve böylece kimlik doğrulama durumunu aralarında paylaşır. Kullanıcı başka bir tarayıcı sekmesinden veya penceresinden oturum açtığında uygulama örneklerini güncelleştirmek için MSAL olaylarını da kullanabilirsiniz. Daha fazla bilgi için bkz.: Sekmeler ve pencereler arasında oturum açma durumunun eşitlenmesi

Farklı uygulamalar arasında SSO

Bir kullanıcı kimlik doğruladığında, tarayıcıda Microsoft Entra etki alanına bir oturum çerezi ayarlanır. MSAL.js, kullanıcıya farklı uygulamalar arasında SSO sağlamak için bu oturum tanımlama bilgisine dayanır. Özellikle MSAL.js, kullanıcının oturum açmasını sağlamak ve herhangi bir etkileşim olmadan belirteçler elde etmek için ssoSilent yöntemini sunar. Ancak, kullanıcının Microsoft Entra ID olan bir oturumda birden çok kullanıcı hesabı varsa, oturum açmak için bir hesap seçmesi istenir. Bu nedenle, yöntemi kullanarak ssoSilent SSO'ya ulaşmanın iki yolu vardır.

Kullanıcı ipucu ile

Performansı artırmak ve yetkilendirme sunucusunun doğru hesap oturumunu aramasını sağlamak için, belirteci sessizce almak için yönteminin ssoSilent istek nesnesinde aşağıdaki seçeneklerden birini geçirebilirsiniz.

login_hint isteğe bağlı kimlik belirteci talebini, sessiz ve etkileşimli istekler için en güvenilir hesap ipucu olduğundan, ssoSilent için loginHint olarak sağlandığı şekliyle kullanmanızı öneririz.

Oturum açma ipucu kullanma

login_hint isteğe bağlı talep, Microsoft Entra ID’ye oturum açmaya çalışan kullanıcı hesabı hakkında bir ipucu sağlar. Genellikle etkileşimli kimlik doğrulama istekleri sırasında gösterilen hesap seçimi istemini atlamak için, loginHint aşağıdakini sağlayın:

const silentRequest = {
    scopes: ["User.Read", "Mail.Read"],
    loginHint: "user@contoso.com"
};

try {
    const loginResponse = await msalInstance.ssoSilent(silentRequest);
} catch (err) {
    if (err instanceof InteractionRequiredAuthError) {
        const loginResponse = await msalInstance.loginPopup(silentRequest).catch(error => {
            // handle error
        });
    } else {
        // handle error
    }
}

Bu örnekte, loginHint etkileşimli belirteç istekleri sırasında ipucu olarak kullanılan kullanıcının e-postasını veya UPN'sini içerir. İpucu, sessiz SSO’yu kolaylaştırmak için uygulamalar arasında iletilebilir; bu sayede A uygulaması bir kullanıcının oturum açmasını sağlayabilir, loginHint öğesini okuyabilir ve ardından claim’i ve mevcut kiracı bağlamını B uygulamasına gönderebilir. Microsoft Entra ID, oturum açma formunu önceden doldurmaya veya hesap seçimi istemini atlayarak belirtilen kullanıcı için doğrudan kimlik doğrulama işlemine geçmeye çalışır.

Talepteki login_hint bilgiler mevcut kullanıcılarla eşleşmiyorsa, hesap seçimi de dahil olmak üzere standart oturum açma deneyiminden geçmek üzere yeniden yönlendirilirler.

Oturum kimliği kullanma

Oturum kimliği kullanmak için, uygulamanızın kimlik belirteçlerine sid talep olarak ekleyin. Talep, sid bir uygulamanın bir kullanıcının Microsoft Entra oturumunu hesap adından veya kullanıcı adından bağımsız olarak tanımlamasına olanak tanır. gibi sidisteğe bağlı talepler eklemeyi öğrenmek için bkz . Uygulamanıza isteğe bağlı talepler sağlama. MSAL.jsile yaptığınız ssoSilent sessiz kimlik doğrulama isteklerinde oturum kimliğini (SID) kullanın.

const request = {
  scopes: ["user.read"],
  sid: sid,
};

 try {
    const loginResponse = await msalInstance.ssoSilent(request);
} catch (err) {
    if (err instanceof InteractionRequiredAuthError) {
        const loginResponse = await msalInstance.loginPopup(request).catch(error => {
            // handle error
        });
    } else {
        // handle error
    }
}

Hesap nesnesi kullanma

Kullanıcı hesabı bilgilerini biliyorsanız, kullanıcı hesabını getAccountByUsername() veya getAccountByHomeId() yöntemlerini kullanarak da alabilirsiniz:

const username = "test@contoso.com";
const myAccount  = msalInstance.getAccountByUsername(username);

const request = {
    scopes: ["User.Read"],
    account: myAccount
};

try {
    const loginResponse = await msalInstance.ssoSilent(request);
} catch (err) {
    if (err instanceof InteractionRequiredAuthError) {
        const loginResponse = await msalInstance.loginPopup(request).catch(error => {
            // handle error
        });
    } else {
        // handle error
    }
}

Kullanıcıdan ipucu olmadan

Aşağıdaki kodda gösterildiği gibi, herhangi bir account, sid ya da login_hint iletmeden ssoSilent yöntemini kullanmayı deneyebilirsiniz.

const request = {
    scopes: ["User.Read"]
};

try {
    const loginResponse = await msalInstance.ssoSilent(request);
} catch (err) {
    if (err instanceof InteractionRequiredAuthError) {
        const loginResponse = await msalInstance.loginPopup(request).catch(error => {
            // handle error
        });
    } else {
        // handle error
    }
}

Ancak, uygulamanın tek bir tarayıcı oturumunda birden çok kullanıcısı varsa veya kullanıcının bu tek tarayıcı oturumu için birden çok hesabı varsa sessiz oturum açma hataları olasılığı vardır. Birden çok hesap varsa aşağıdaki hata görüntülenebilir:

InteractionRequiredAuthError: interaction_required: AADSTS16000: Either multiple user identities are available for the current request or selected account is not supported for the scenario.

Hata, sunucunun hangi hesapta oturum açacağını belirleyemediğini ve hesabı seçmek için önceki örnekteki parametrelerden birini (account, login_hint, sid) veya etkileşimli bir oturum açmayı gerektirdiğini gösterir.

Kullanırken dikkat edilmesi gerekenler ssoSilent

Yeniden yönlendirme URI'si (yanıt URL'si)

Daha iyi performans elde etmek ve sorunların önüne geçmeye yardımcı olmak için redirectUri öğesini boş bir sayfaya veya MSAL kullanmayan başka bir sayfaya ayarlayın.

  • Uygulama yalnızca açılır pencere ve sessiz yöntemlerini kullanıyorsa, PublicClientApplication yapılandırma nesnesinde redirectUri özelliğini ayarlayın.
  • Uygulama yeniden yönlendirme yöntemlerini de kullanıyorsa, redirectUri öğesini her istek için ayarlayın.

Üçüncü taraf tanımlama bilgileri

ssoSilent gizli bir iframe açmaya ve Microsoft Entra ID'deki mevcut bir oturumu yeniden kullanmaya çalışır. Bu, Safari gibi üçüncü taraf tanımlama bilgilerini engelleyen tarayıcılarda çalışmaz ve etkileşim hatasına neden olur:

InteractionRequiredAuthError: login_required: AADSTS50058: A silent sign-in request was sent but no user is signed in. The cookies used to represent the user's session were not sent in the request to Azure AD

Hatayı çözmek için kullanıcının, loginPopup() veya loginRedirect() kullanarak etkileşimli bir kimlik doğrulama isteği oluşturması gerekir. Bazı durumlarda, SSO sağlamak için none prompt değeri, etkileşimli bir MSAL.js yöntemiyle birlikte kullanılabilir. Daha fazla bilgi için bkz. prompt=none ile etkileşimli istekler . Kullanıcının oturum açma bilgilerine zaten sahipseniz, belirli bir hesapla oturum açmak için isteğe bağlı loginHint veya sid parametrelerinden birini iletebilirsiniz.

prompt=login ile SSO'ya olumsuzlama

Yetkilendirme sunucusunda etkin bir oturum olsa bile Microsoft Entra ID’nin kullanıcıdan kimlik bilgilerini girmesini istemesini tercih ediyorsanız, MSAL.js ile yapılan isteklerde login istem parametresini kullanabilirsiniz. Daha fazla bilgi için bkz. MSAL.js istem davranışı .

kimlik doğrulama durumunu ADAL.js ile MSAL.js arasında paylaşma

MSAL.js, Microsoft Entra kimlik doğrulama senaryoları için ADAL.js özellik eşliği getirir. ADAL.js'dan MSAL.js geçişi kolaylaştırmak ve uygulamalar arasında kimlik doğrulama durumunu paylaşmak için kitaplık, ADAL.js önbelleğinde kullanıcının oturumunu temsil eden kimlik belirtecini okur. ADAL.js'den geçiş yaparken bundan yararlanmak için, kitaplıkların belirteçleri önbelleğe almak üzere localStorage kullandığından emin olmanız gerekir. Hem MSAL.js hem de ADAL.js yapılandırmasında, başlatma sırasında cacheLocation değerini localStorage olarak aşağıdaki şekilde ayarlayın:


// In ADAL.js
window.config = {
  clientId: "1111-2222-3333-4444-55555555",
  cacheLocation: "localStorage",
};

var authContext = new AuthenticationContext(config);

// In latest MSAL.js version
const config = {
  auth: {
    clientId: "1111-2222-3333-4444-55555555",
  },
  cache: {
    cacheLocation: "localStorage",
  },
};

const msalInstance = new msal.PublicClientApplication(config);

Sonraki Adımlar

SSO hakkında daha fazla bilgi için bkz: