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 cookie relace, když se uživatel poprvé ověří. MSAL.js také ukládá tokeny ID a přístupové tokeny uživatele do úložiště prohlížeče pro každou doménu aplikace. Tyto dva mechanismy, relační soubor cookie služby Microsoft Entra a mezipaměť Identity a ověřování Microsoftu (MSAL), jsou na sobě nezávislé, ale společně zajišťují funkci jednotného přihlašování (SSO).

SSO mezi panely 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 v konfiguračním objektu MSAL.js nastavit cacheLocation na localStorage, jak 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ž je uživatel ověřen, v prohlížeči je v doméně Microsoft Entra nastaven soubor cookie relace. MSAL.js využívá tuto cookie relace k zajištění jednotného přihlašování (SSO) uživateli 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 s Microsoft Entra ID více uživatelských účtů, 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 vyhledal správnou relaci účtu, můžete v objektu požadavku metody ssoSilent předat jednu z následujících možností pro tiché získání tokenu.

Doporučujeme použít login_hintvolitelný atribut tokenu ID poskytovaný pro ssoSilent jako loginHint, protože je to nejspolehlivější vodítko účtu pro tiché a interaktivní požadavky.

Použití pokynu pro přihlášení

Volitelná login_hint deklarace identity poskytuje nápovědu k Microsoft Entra ID 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ědný údaj lze předávat mezi aplikacemi pro usnadnění tichého jednotného přihlašování, kdy aplikace A může uživatele přihlásit, přečíst loginHint a poté odeslat claim a aktuální kontext tenanta do aplikace B. Microsoft Entra ID se pokusí předvyplnit 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 dané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. Atribut sid umožňuje aplikaci identifikovat relaci uživatele Microsoft Entra nezávisle na názvu jeho úč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. Použijte identifikátor relace (SID) v požadavcích na tiché ověřování, které provádíte pomocí ssoSilent 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 zkusit použít metodu ssoSilent bez předání jakýchkoli account, 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 aplikace používá pouze metody popup a silent, nastavte redirectUri v konfiguračním objektu PublicClientApplication.
  • Pokud aplikace používá také metody přesměrování, nastavte redirectUri pro jednotlivé požadavky.

Soubory cookie třetích stran

ssoSilent se pokusí otevřít skrytý iframe a znovu použít existující relaci s Microsoft Entra ID. 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 lze hodnotu parametru none použít společně s interaktivní metodou MSAL.js k dosažení jednotného přihlášení. Další informace najdete v článku Interaktivní požadavky s parametrem prompt=none. Pokud už máte přihlašovací údaje uživatele, můžete k přihlášení ke konkrétnímu účtu předat jeden z volitelných parametrů loginHint nebo sid.

Zakázání jednotného přihlášení (SSO) pomocí prompt=login

Pokud chcete, aby Microsoft Entra ID vyzvala uživatele k zadání přihlašovacích údajů navzdory aktivní relaci s autorizačním serverem, můžete v požadavcích s MSAL.js použít parametr login. Další informace najdete v tématu chování výzvy v MSAL.js.

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 byla migrace z ADAL.js do MSAL.js snadná a bylo možné sdílet stav ověřování mezi aplikacemi, knihovna načítá ID token představující relaci uživatele z 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. Nastavte cacheLocation na localStorage v konfiguraci knihoven MSAL.js i ADAL.js při inicializaci takto:


// 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 SSO naleznete zde: