Share via


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.

Javasoljuk, hogy használja a login_hintvá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 loginHinta 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 sidhozzá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_hintsid) 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 redirectUriPublicClientApplication 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 cacheLocationlocalStorage 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: