Aracılığıyla paylaş


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, bir 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 ve Microsoft Authentication Library (MSAL) önbelleği olmak üzere 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 cacheLocation 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çmış durumda eşitleme

Farklı uygulamalar arasında SSO

Kullanıcı kimlik doğrulamasından geçtiğinde, tarayıcıdaki Microsoft Entra etki alanında bir oturum tanımlama bilgisi 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ı oturum açma ve etkileşim olmadan belirteçleri alma yöntemini sunar ssoSilent . Ancak, kullanıcının Microsoft Entra Id ile 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.

Sessiz ve etkileşimli isteklerin login_hint en güvenilir hesap ipucu olduğundan isteğe loginHint ssoSilent bağlı kimlik belirteci talebini kullanmanızı öneririz.

Oturum açma ipucu kullanma

İsteğe login_hint bağlı talep, Oturum açmaya çalışan kullanıcı hesabı hakkında Microsoft Entra Id'ye 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 geçirilebilir; burada A uygulaması bir kullanıcıda oturum açabilir, dosyasını okuyabilir loginHintve ardından talebi ve geçerli kiracı bağlamını B uygulamasına gönderebilir. Microsoft Entra Id, oturum açma formunu önceden doldurmayı veya hesap seçim istemini atlamayı dener ve belirtilen kullanıcının kimlik doğrulama işlemine doğrudan devam eder.

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 isteğe bağlı talep olarak ekleyinsid. 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.js ile 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 veya getAccountByHomeId() yöntemlerini kullanarak getAccountByUsername() da kullanıcı hesabını 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ı ipucu olmadan

herhangi bir sid accountgeçirmeden veya login_hint aşağıdaki kodda gösterildiği gibi yöntemini kullanmaya ssoSilent çalışabilirsiniz:

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 sağlamak ve sorunları önlemeye yardımcı olmak için öğesini boş bir sayfaya veya MSAL kullanmayan başka bir sayfaya ayarlayın redirectUri .

  • Uygulama yalnızca açılan ve sessiz yöntemler kullanırsa, yapılandırma nesnesinde PublicClientApplication öğesini ayarlayınredirectUri.
  • Uygulama yeniden yönlendirme yöntemlerini de kullanıyorsa, istek başına temelinde değerini ayarlayın redirectUri .

Üçüncü taraf tanımlama bilgileri

ssoSilent gizli bir iframe açmayı ve mevcut bir oturumu Microsoft Entra ID ile 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 veya loginRedirect()kullanarak etkileşimli bir kimlik doğrulama isteği oluşturması loginPopup() gerekir. Bazı durumlarda, istem değeri hiçbiri SSO'ya ulaşmak için etkileşimli bir MSAL.js yöntemiyle birlikte kullanılamaz. Daha fazla bilgi için bkz . prompt=none ile etkileşimli istekler. Kullanıcının oturum açma bilgilerine zaten sahipseniz, belirli bir hesapta oturum açmak için veya sid isteğe bağlı parametreleri geçirebilirsinizloginHint.

prompt=login ile SSO'ya olumsuzlama

Yetkilendirme sunucusuyla etkin bir oturum olmasına rağmen kullanıcıdan kimlik bilgilerini girmesini istemek için Microsoft Entra Id'yi tercih ediyorsanız, MSAL.js içeren isteklerde oturum açma istemi 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'den MSAL.js kolay geçiş yapmak 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 geçiş yaparken bundan yararlanmak için kitaplıkların belirteçleri önbelleğe almak için kullandığından localStorage emin olmanız gerekir. cacheLocation localStorage başlatma sırasında hem MSAL.js hem de ADAL.js yapılandırmasında öğesini şu ş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: