Egyszeri bejelentkezés az MSAL.js-sel
Az egyszeri bejelentkezés (SSO) zökkenőmentesebb élményt nyújt azáltal, hogy csökkenti a felhasználó hitelesítő adatainak kérésének számát. A felhasználók egyszer adhatók meg a hitelesítő adataiknak, és a létrehozott munkamenetet további kérés nélkül újra felhasználhatják más alkalmazások ugyanazon az eszközön.
A Microsoft Entra ID egy munkamenet-cookie beállításával engedélyezi az egyszeri bejelentkezést, amikor egy felhasználó először hitelesít. MSAL.js a felhasználó azonosító jogkivonatait és hozzáférési jogkivonatait is gyorsítótárazza a böngésző tárterületén alkalmazástartományonként. A két mechanizmus, a Microsoft Entra munkamenet-cookie és a Microsoft Authentication Library (MSAL) gyorsítótár független egymástól, de együttműködve biztosítják az egyszeri bejelentkezés viselkedését.
Egyszeri bejelentkezés ugyanazon alkalmazás böngészőfülei között
Ha egy felhasználó több lapon is megnyit egy alkalmazást, és az egyiken bejelentkezik, a rendszer anélkül is bejelentkezhet ugyanabba az alkalmazásba, hogy más lapon is megnyitva lenne. Ehhez be kell állítania a cacheLocation értéket MSAL.js konfigurációs objektumban localStorage
az alábbi példában látható módon:
const config = {
auth: {
clientId: "1111-2222-3333-4444-55555555",
},
cache: {
cacheLocation: "localStorage",
},
};
const msalInstance = new msal.PublicClientApplication(config);
Ebben az esetben a különböző böngészőlapok alkalmazáspéldányai ugyanazt az MSAL-gyorsítótárat használják, így megosztják közöttük a hitelesítési állapotot. MSAL-eseményeket is használhat az alkalmazáspéldányok frissítéséhez, amikor egy felhasználó bejelentkezik egy másik böngészőlapról vagy ablakból. További információ: A naplózott állapot szinkronizálása lapok és ablakok között
Egyszeri bejelentkezés a különböző alkalmazások között
Amikor egy felhasználó hitelesít, egy munkamenet-cookie van beállítva a Böngésző Microsoft Entra tartományában. MSAL.js erre a munkamenet-cookie-ra támaszkodik, hogy sSO-t biztosítson a felhasználónak a különböző alkalmazások között. A MSAL.js többek között lehetővé teszi a ssoSilent
felhasználó bejelentkezését és a jogkivonatok interakció nélküli beszerzését. Ha azonban a felhasználó több felhasználói fiókkal rendelkezik egy Microsoft Entra-azonosítóval rendelkező munkamenetben, a rendszer kérni fogja, hogy válasszon ki egy fiókot, amellyel bejelentkezhet. Ennek megfelelően kétféleképpen lehet SSO-t elérni metódussal ssoSilent
.
Felhasználói tipp
A teljesítmény javítása és annak biztosítása érdekében, hogy az engedélyezési kiszolgáló megkeresse a megfelelő fiók munkamenetet, a metódus kérésobjektumában az alábbi lehetőségek egyikét ssoSilent
adhatja meg a jogkivonat csendes lekéréséhez.
login_hint
, amely lekérhető azaccount
objektum felhasználónév tulajdonságából vagy azupn
azonosító jogkivonatában lévő jogcímből. Ha az alkalmazás B2C-vel hitelesíti a felhasználókat, tekintse meg a következőt: A B2C felhasználói folyamatainak konfigurálása felhasználónév azonosító jogkivonatokban való kibocsátásához- Munkamenet-azonosító,
sid
amely egyaccount
objektumbólidTokenClaims
kérhető le. account
, amely a fiók metódusainak egyikéből kérhető le
Javasoljuk, hogy használja a login_hint
választható azonosító jogkivonat-jogcímet , ssoSilent
mivel loginHint
ez a legmegbízhatóbb, csendes és interaktív kéréseket jelző fiók.
Bejelentkezési tipp használata
Az login_hint
opcionális jogcím a Microsoft Entra-azonosítóra utal a bejelentkezni próbáló felhasználói fiókról. Az interaktív hitelesítési kérések során általában megjelenő fiókkijelölési kérés megkerüléséhez adja meg a loginHint
következőt:
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
}
}
Ebben a példában loginHint
a felhasználó e-mail-címét vagy UPN-jét tartalmazza, amelyet az interaktív jogkivonat-kérések során hasznosít. A tipp továbbítható az alkalmazások között a csendes egyszeri bejelentkezés megkönnyítése érdekében, ahol az A alkalmazás bejelentkezhet egy felhasználóba, elolvashatja loginHint
a jogcímet, majd elküldheti a jogcímet és az aktuális bérlői környezetet a B alkalmazásnak. A Microsoft Entra-azonosító megkísérli előre kitölteni a bejelentkezési űrlapot, vagy megkerülni a fiókkijelölési kérést, és közvetlenül folytatja a megadott felhasználó hitelesítési folyamatát.
Ha a login_hint
jogcím adatai nem egyeznek meg egyetlen meglévő felhasználóval sem, a rendszer átirányítja őket a szokásos bejelentkezési felületre, beleértve a fiókválasztást is.
Munkamenet-azonosító használata
Munkamenet-azonosító használatához adjon hozzá sid
opcionális jogcímként az alkalmazás azonosító jogkivonataihoz. A sid
jogcím lehetővé teszi, hogy az alkalmazás a fiók nevével vagy felhasználónevével függetlenül azonosítsa a felhasználó Microsoft Entra-munkamenetét. További információ az opcionális jogcímek sid
hozzáadásáról: Opcionális jogcímek megadása az alkalmazáshoz. Használja a munkamenet-azonosítót (SID) a MSAL.js által küldött ssoSilent
csendes hitelesítési kérelmekben.
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
}
}
Fiókobjektum használata
Ha ismeri a felhasználói fiók adatait, az alábbi getAccountByHomeId()
módszerekkel is lekérheti a getAccountByUsername()
felhasználói fiókot:
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
}
}
Felhasználói tipp nélkül
A metódust anélkül is megpróbálhatja használni ssoSilent
, hogy nem ad át semmit account
, sid
vagy login_hint
az alábbi kódban látható módon:
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
}
}
Előfordulhat azonban, hogy csendes bejelentkezési hibák lépnek fel, ha az alkalmazás több felhasználóval rendelkezik egy böngészős munkamenetben, vagy ha a felhasználó több fiókkal rendelkezik az adott böngésző-munkamenethez. A következő hiba jelenhet meg, ha több fiók is elérhető:
InteractionRequiredAuthError: interaction_required: AADSTS16000: Either multiple user identities are available for the current request or selected account is not supported for the scenario.
A hiba azt jelzi, hogy a kiszolgáló nem tudta meghatározni, hogy melyik fiókba kell bejelentkeznie, és az előző példában szereplő paraméterek egyikét (account
, , login_hint
sid
) vagy egy interaktív bejelentkezést igényel a fiók kiválasztásához.
Megfontolandó szempontok a használat során ssoSilent
Átirányítási URI (válasz URL-címe)
A jobb teljesítmény és a problémák elkerülése érdekében állítson be redirectUri
egy üres lapot vagy más, MSAL-t nem használó lapot.
- Ha az alkalmazás felhasználói csak előugró és csendes metódusokat használnak, állítsa be a
redirectUri
PublicClientApplication
konfigurációs objektumot. - Ha az alkalmazás átirányítási metódusokat is használ, állítsa be a
redirectUri
kérésenkénti értéket.
Külső cookie-k
ssoSilent
megkísérli megnyitni a rejtett iframe-et, és újra felhasználni egy meglévő munkamenetet a Microsoft Entra-azonosítóval. Ez nem működik olyan böngészőkben, amelyek letiltják a külső cookie-kat, például a Safarit, és interakciós hibához vezetnek:
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
A hiba megoldásához a felhasználónak létre kell hoznia egy interaktív hitelesítési kérést az vagy loginRedirect()
a loginPopup()
. Bizonyos esetekben a parancssori érték egyik sem használható egy interaktív MSAL.js metódussal együtt az egyszeri bejelentkezés eléréséhez. További információért tekintse meg az interaktív kéréseket a prompt=none paraméterrel. Ha már rendelkezik a felhasználó bejelentkezési adataival, átadhatja az loginHint
adott fiókba való bejelentkezéshez szükséges vagy sid
nem kötelező paramétereket.
Egyszeri bejelentkezés letiltása prompt=login használatával
Ha azt szeretné, hogy a Microsoft Entra-azonosító arra kérje a felhasználót, hogy adja meg a hitelesítő adatait az engedélyezési kiszolgálóval folytatott aktív munkamenet ellenére, a bejelentkezési kérés paraméterét használhatja a MSAL.js. További információért tekintse meg MSAL.js kérés viselkedését .
Hitelesítési állapot megosztása ADAL.js és MSAL.js között
MSAL.js szolgáltatásparitást biztosít a Microsoft Entra-hitelesítési forgatókönyvek ADAL.js. A ADAL.js-ről MSAL.js való migrálás megkönnyítése és a hitelesítési állapot alkalmazások közötti megosztása érdekében a tár felolvassa a felhasználó munkamenetét jelképező azonosító jogkivonatot ADAL.js gyorsítótárban. A ADAL.js-ból való migrálás során ezt kihasználva gondoskodnia kell arról, hogy a kódtárak gyorsítótárazási jogkivonatokat használjanak localStorage
. Az inicializáláskor a MSAL.js és ADAL.js konfigurációban is állítsa be a cacheLocation
localStorage
beállítást az alábbiak szerint:
// 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);
Következő lépések
További információ az egyszeri bejelentkezésről: