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ě.
login_hint
, které lze načíst z vlastnosti uživatelského jména objektuaccount
upn
nebo deklarace identity v tokenu ID. Pokud vaše aplikace ověřuje uživatele pomocí B2C, přečtěte si téma: Konfigurace toků uživatelů B2C pro generování uživatelského jména v tokenech ID- ID relace,
sid
které lze načíst zidTokenClaims
objektuaccount
. account
, které lze načíst z jedné metody účtu
Doporučujeme použít deklaraci identity tokenu login_hint
ID, 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 loginHint
a 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 account
kó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
redirectUri
PublicClientApplication
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: