Enkel inloggning med MSAL.js
Enkel inloggning (SSO) ger en smidigare upplevelse genom att minska antalet gånger en användare uppmanas att ange autentiseringsuppgifter. Användarna anger sina autentiseringsuppgifter en gång och den etablerade sessionen kan återanvändas av andra program på samma enhet utan ytterligare frågor.
Microsoft Entra ID aktiverar enkel inloggning genom att ange en sessionscookie när en användare autentiserar för första gången. MSAL.js cachelagrar även ID-token och åtkomsttoken för användaren i webbläsarlagringen per programdomän. De två mekanismerna, Microsoft Entra-sessionscookie och MSAL-cache (Microsoft Authentication Library), är oberoende av varandra men arbetar tillsammans för att tillhandahålla SSO-beteende.
Enkel inloggning mellan webbläsarflikar för samma app
När en användare har ett program öppet på flera flikar och loggar in på en av dem, kan de loggas in i samma app öppna på andra flikar utan att uppmanas. För att göra det måste du ange cacheLocation i MSAL.js konfigurationsobjekt till localStorage
som du ser i följande exempel:
const config = {
auth: {
clientId: "1111-2222-3333-4444-55555555",
},
cache: {
cacheLocation: "localStorage",
},
};
const msalInstance = new msal.PublicClientApplication(config);
I det här fallet använder programinstanser i olika webbläsarflikar samma MSAL-cache och delar därmed autentiseringstillståndet mellan dem. Du kan också använda MSAL-händelser för att uppdatera programinstanser när en användare loggar in från en annan webbläsarflik eller ett annat fönster. Mer information finns i: Synkronisera loggat i tillstånd mellan flikar och fönster
Enkel inloggning mellan olika appar
När en användare autentiserar ställs en sessionscookie in på Microsoft Entra-domänen i webbläsaren. MSAL.js förlitar sig på den här sessionscookien för att tillhandahålla enkel inloggning för användaren mellan olika program. I synnerhet erbjuder ssoSilent
MSAL.js metoden för att logga in användaren och hämta token utan interaktion. Men om användaren har flera användarkonton i en session med Microsoft Entra-ID uppmanas de sedan att välja ett konto att logga in med. Därför finns det två sätt att uppnå enkel inloggning med hjälp av ssoSilent
metoden.
Med användartips
För att förbättra prestanda och se till att auktoriseringsservern söker efter rätt kontosession kan du skicka något av följande alternativ i begärandeobjektet ssoSilent
för metoden för att få token tyst.
login_hint
, som kan hämtas frånaccount
objektets användarnamnegenskap eller anspråketupn
i ID-token. Om appen autentiserar användare med B2C läser du: Konfigurera B2C-användarflöden för att generera användarnamn i ID-token- Sessions-ID,
sid
, som kan hämtas frånidTokenClaims
ettaccount
objekt. account
, som kan hämtas från med en av kontometoderna
Vi rekommenderar att du använder det login_hint
valfria ID-tokenanspråket som loginHint
tillhandahålls eftersom ssoSilent
det är den mest tillförlitliga kontotipsen för tysta och interaktiva begäranden.
Använda ett inloggningstips
Det login_hint
valfria anspråket ger ett tips till Microsoft Entra-ID om användarkontot som försöker logga in. Om du vill kringgå den fråga om kontoval som vanligtvis visas under interaktiva autentiseringsbegäranden anger du enligt loginHint
följande:
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
}
}
I det här exemplet loginHint
innehåller användarens e-post eller UPN, som används som tips vid interaktiva tokenbegäranden. Tipset kan skickas mellan program för att underlätta tyst enkel inloggning, där program A kan logga in en användare, läsa loginHint
, och sedan skicka anspråket och den aktuella klientkontexten till program B. Microsoft Entra-ID försöker fylla i inloggningsformuläret i förväg eller kringgå kommandotolken för kontoval och fortsätta direkt med autentiseringsprocessen för den angivna användaren.
Om informationen i anspråket login_hint
inte matchar någon befintlig användare omdirigeras de för att gå igenom standardinloggningsupplevelsen, inklusive val av konto.
Använda ett sessions-ID
Om du vill använda ett sessions-ID lägger du till sid
som ett valfritt anspråk på appens ID-token. Med anspråket sid
kan ett program identifiera en användares Microsoft Entra-session oberoende av deras kontonamn eller användarnamn. Information om hur du lägger till valfria anspråk som sid
finns i Ange valfria anspråk i din app. Använd sessions-ID (SID) i tysta autentiseringsförfrågningar som du gör med ssoSilent
i 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
}
}
Använda ett kontoobjekt
Om du känner till användarkontoinformationen kan du också hämta användarkontot med hjälp getAccountByUsername()
av metoderna eller getAccountByHomeId()
:
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
}
}
Utan användartips
Du kan försöka använda ssoSilent
metoden utan att skicka någon account
, sid
eller login_hint
som du ser i följande kod:
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
}
}
Det finns dock en sannolikhet för tyst inloggningsfel om programmet har flera användare i en enda webbläsarsession eller om användaren har flera konton för den enskilda webbläsarsessionen. Följande fel kan visas om flera konton är tillgängliga:
InteractionRequiredAuthError: interaction_required: AADSTS16000: Either multiple user identities are available for the current request or selected account is not supported for the scenario.
Felet anger att servern inte kunde avgöra vilket konto som ska loggas in och kräver antingen någon av parametrarna i föregående exempel (account
, login_hint
, sid
) eller en interaktiv inloggning för att välja kontot.
Saker att tänka på när du använder ssoSilent
Omdirigerings-URI (svars-URL)
För bättre prestanda och för att undvika problem anger du redirectUri
till en tom sida eller annan sida som inte använder MSAL.
- Om programmets användare bara popup- och tystmetoder anger du
redirectUri
på konfigurationsobjektetPublicClientApplication
. - Om programmet också använder omdirigeringsmetoder anger du
redirectUri
per begäran.
Cookies från tredje part
ssoSilent
försöker öppna en dold iframe och återanvända en befintlig session med Microsoft Entra-ID. Detta fungerar inte i webbläsare som blockerar cookies från tredje part, till exempel Safari, och det leder till ett interaktionsfel:
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
För att lösa felet måste användaren skapa en interaktiv autentiseringsbegäran med hjälp av loginPopup()
eller loginRedirect()
. I vissa fall kan inget promptvärde användas tillsammans med en interaktiv MSAL.js metod för att uppnå enkel inloggning. Mer information finns i Interaktiva begäranden med prompt=none . Om du redan har användarens inloggningsinformation kan du skicka antingen eller loginHint
sid
valfria parametrar för att logga in på ett specifikt konto.
Negera enkel inloggning med prompt=login
Om du föredrar att Microsoft Entra-ID:t uppmanar användaren att ange sina autentiseringsuppgifter trots en aktiv session med auktoriseringsservern kan du använda parametern för inloggningsprompt i begäranden med MSAL.js. Mer information finns i MSAL.js fråga om beteende .
Dela autentiseringstillstånd mellan ADAL.js och MSAL.js
MSAL.js ger funktionsparitet med ADAL.js för Microsoft Entra-autentiseringsscenarier. För att göra migreringen från ADAL.js till MSAL.js enkelt och dela autentiseringstillståndet mellan appar läser biblioteket ID-token som representerar användarens session i ADAL.js cacheminnet. Om du vill dra nytta av detta när du migrerar från ADAL.js måste du se till att biblioteken använder localStorage
för cachelagringstoken. cacheLocation
Ange till localStorage
i både MSAL.js och ADAL.js konfiguration vid initiering enligt följande:
// 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);
Nästa steg
Mer information om enkel inloggning finns i: