Jednotné přihlašování s využitím MSAL.js

Jednotné přihlašování (SSO) poskytuje plynulejší prostředí snížením počtu žádostí uživatele o přihlašovací údaje. Uživatelé zadají své přihlašovací údaje jednou a zavedená relace může být znovu použita jinými aplikacemi na stejném zařízení bez další výzvy.

Microsoft Entra ID umožňuje jednotné přihlašování nastavením souboru cookie relace při prvním ověření uživatele. MSAL.js také ukládá tokeny ID a přístupové tokeny uživatele v úložišti prohlížeče na doménu aplikace. Dva mechanismy: Soubor cookie relace Microsoft Entra a mezipaměť KNIHOVNY MSAL (Microsoft Authentication Library) jsou nezávislé na sobě, ale spolupracují na tom, aby poskytovaly chování jednotného přihlašování.

Jednotné přihlašování mezi kartami prohlížeče pro stejnou aplikaci

Když má uživatel otevřenou aplikaci na několika kartách a přihlásí se k jedné z nich, může se přihlásit do stejné aplikace otevřené na jiných kartách, aniž by se zobrazila výzva. K tomu je potřeba nastavit cacheLocation v MSAL.js objekt konfigurace tak, jak localStorage je znázorněno v následujícím příkladu:

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

const msalInstance = new msal.PublicClientApplication(config);

V tomto případě instance aplikací na různých kartách prohlížeče využívají stejnou mezipaměť MSAL, čímž se mezi nimi sdílí stav ověřování. Události MSAL můžete také použít k aktualizaci instancí aplikace, když se uživatel přihlásí z jiné karty nebo okna prohlížeče. Další informace najdete v tématu: Synchronizace přihlášeného stavu napříč kartami a okny

Jednotné přihlašování mezi různými aplikacemi

Když se uživatel ověří, soubor cookie relace se nastaví v doméně Microsoft Entra v prohlížeči. MSAL.js spoléhá na tento soubor cookie relace k poskytování jednotného přihlašování pro uživatele mezi různými aplikacemi. Konkrétně MSAL.js nabízí metodu ssoSilent pro přihlášení uživatele a získání tokenů bez interakce. Pokud ale uživatel má v relaci více uživatelských účtů s ID Microsoft Entra, zobrazí se mu výzva k výběru účtu pro přihlášení. Existují dva způsoby, jak dosáhnout jednotného přihlašování pomocí ssoSilent metody.

S nápovědou pro uživatele

Pokud chcete zvýšit výkon a zajistit, aby autorizační server hledal správnou relaci účtu, můžete předat jednu z následujících možností v objektu ssoSilent požadavku metody k získání tokenu bezobslužně.

Doporučujeme použít deklaraci identity tokenu login_hintID, která ssoSilent je poskytována jako loginHint nejspolehlivější nápověda účtu pro tiché a interaktivní požadavky.

Použití nápovědy pro přihlášení

Volitelná login_hint deklarace identity poskytuje nápovědu k ID Microsoft Entra o uživatelském účtu, který se pokouší přihlásit. Pokud chcete obejít výzvu k výběru účtu, obvykle se zobrazí během interaktivních žádostí o ověření, zadejte loginHint následující:

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
    }
}

V tomto příkladu loginHint obsahuje e-mail uživatele nebo hlavní název uživatele (UPN), který se používá jako nápověda při žádostech o interaktivní token. Nápovědu lze předat mezi aplikacemi, aby bylo možné usnadnit tiché jednotné přihlašování, kde se aplikace A může přihlásit uživatele, přečíst loginHinta pak odeslat deklaraci identity a aktuální kontext tenanta do aplikace B. Microsoft Entra ID se pokusí předem vyplnit přihlašovací formulář nebo obejít výzvu k výběru účtu a přímo pokračovat v procesu ověřování pro zadaného uživatele.

Pokud se informace v login_hint deklaraci identity neshodují s žádným existujícím uživatelem, přesměrují se, aby prošli standardním přihlašovacím prostředím, včetně výběru účtu.

Použití ID relace

Pokud chcete použít ID relace, přidejte sid jako volitelnou deklaraci identity do tokenů ID vaší aplikace. Deklarace sid identity umožňuje aplikaci identifikovat relaci Microsoft Entra uživatele nezávisle na názvu účtu nebo uživatelském jménu. Informace o přidání volitelných deklarací identity, jako je sid, najdete v tématu Zadání volitelných deklarací identity do aplikace. ID relace (SID) použijte v bezobslužných požadavcích na ověřování, které ssoSilent provedete v MSAL.js.

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
    }
}

Použití objektu účtu

Pokud znáte informace o uživatelském účtu, můžete uživatelský účet načíst také pomocí getAccountByUsername()getAccountByHomeId() následujících metod:

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
    }
}

Bez nápovědy pro uživatele

Můžete se pokusit použít metodu ssoSilent bez předání jakéhokoli accountkódu sid nebo login_hint jak je znázorněno v následujícím kódu:

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
    }
}

Existuje však pravděpodobnost chyb tichého přihlášení, pokud má aplikace v jedné relaci prohlížeče více uživatelů nebo pokud má uživatel více účtů pro danou relaci prohlížeče. Pokud je k dispozici více účtů, může se zobrazit následující chyba:

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

Tato chyba značí, že server nemohl určit, ke kterému účtu se má přihlásit, a k výběru účtu bude vyžadovat jeden z parametrů v předchozím příkladu (account, login_hint, sid) nebo interaktivní přihlášení.

Důležité informace o používání ssoSilent

Identifikátor URI přesměrování (adresa URL odpovědi)

Pokud chcete dosáhnout lepšího výkonu a vyhnout se problémům, nastavte redirectUri na prázdnou stránku nebo jinou stránku, která nepoužívá knihovnu MSAL.

  • Pokud uživatelé aplikace pouze automaticky otevírané a tiché metody, nastavte na redirectUriPublicClientApplication objekt konfigurace.
  • Pokud aplikace používá také metody přesměrování, nastavte redirectUri pro jednotlivé požadavky.

Soubory cookie třetích stran

ssoSilent pokusí otevřít skrytý prvek iframe a znovu použít existující relaci s ID Microsoft Entra. To nebude fungovat v prohlížečích, které blokují soubory cookie třetích stran, jako je Safari, a způsobí chybu interakce:

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

K vyřešení chyby musí uživatel vytvořit interaktivní žádost o ověření pomocí loginPopup() příkazu nebo loginRedirect(). V některých případech se žádná hodnota výzvy nedá použít společně s interaktivní metodou MSAL.js k dosažení jednotného přihlašování. Další informace najdete v interaktivních požadavcích s příkazem prompt=none . Pokud už máte přihlašovací údaje uživatele, můžete předat loginHint buď parametry, sid nebo volitelné parametry pro přihlášení ke konkrétnímu účtu.

Negating SSO with prompt=login

Pokud dáváte přednost Microsoft Entra ID k zobrazení výzvy k zadání přihlašovacích údajů uživatele bez ohledu na aktivní relaci s autorizačním serverem, můžete v žádostech s MSAL.js použít parametr výzvy pro přihlášení . Další informace najdete v tématu MSAL.js chování výzvy.

Sdílení stavu ověřování mezi ADAL.js a MSAL.js

MSAL.js přináší paritu funkcí s ADAL.js pro scénáře ověřování Microsoft Entra. Aby se migrace z ADAL.js do MSAL.js snadného a sdílení stavu ověřování mezi aplikacemi, knihovna přečte token ID představující relaci uživatele v mezipaměti ADAL.js. Abyste toho mohli využít při migraci z ADAL.js, budete muset zajistit, aby knihovny používaly localStorage pro ukládání tokenů do mezipaměti. cacheLocation Nastavte hodnotu localStorage v konfiguraci MSAL.js i ADAL.js při inicializaci následujícím způsobem:


// 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);

Další kroky

Další informace o jednotném přihlašování najdete tady: