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.
login_hint
, nesne kullanıcı adı özelliğinden veyaupn
kimlik belirtecindeki taleptenaccount
alınabilir. Uygulamanız B2C ile kullanıcıların kimliğini doğrularsa bkz. B2C kullanıcı akışlarını kimlik belirteçlerinde kullanıcı adı yayacak şekilde yapılandırma- Bir
account
nesnedenidTokenClaims
alınabilen Oturum Kimliğisid
. account
, hesap yöntemlerinden biri kullanılarak alınabilecek
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 loginHint
ve 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 sid
isteğ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
account
geç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:
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin