Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Eenmalige aanmelding (SSO) biedt een naadlozere ervaring doordat een gebruiker minder vaak om referenties wordt gevraagd. Gebruikers voeren hun referenties eenmaal in en de tot stand gebrachte sessie kan opnieuw worden gebruikt door andere toepassingen op hetzelfde apparaat zonder verdere prompts.
Microsoft Entra ID schakelt eenmalige aanmelding in door een sessiecookie in te stellen wanneer een gebruiker zich voor het eerst authenticeert. MSAL.js slaat ook de id-tokens en toegangstokens van de gebruiker op in de browseropslag per toepassingsdomein. De twee mechanismen, Microsoft Entra sessiecookies en Microsoft Authentication Library (MSAL)-cache, zijn onafhankelijk van elkaar, maar werken samen om SSO-gedrag te bieden.
Single Sign-On tussen tabbladen in de browser voor dezelfde app
Wanneer een gebruiker een toepassing heeft geopend op verschillende tabbladen en zich aanmeldt bij een van deze tabbladen, kunnen ze worden aangemeld bij dezelfde app die op andere tabbladen wordt geopend zonder dat hierom wordt gevraagd. Hiervoor moet u cacheLocation instellen in MSAL.js configuratieobject localStorage , zoals wordt weergegeven in het volgende voorbeeld:
const config = {
auth: {
clientId: "1111-2222-3333-4444-55555555",
},
cache: {
cacheLocation: "localStorage",
},
};
const msalInstance = new msal.PublicClientApplication(config);
In dit geval maken toepassingsexemplaren op verschillende browsertabbladen gebruik van dezelfde MSAL-cache, waardoor de verificatiestatus ertussen wordt gedeeld. U kunt ook MSAL-gebeurtenissen gebruiken voor het bijwerken van toepassingsexemplaren wanneer een gebruiker zich aanmeldt vanuit een ander browsertabblad of -venster. Zie voor meer informatie: Inlogstatus synchroniseren tussen tabbladen en vensters
SSO tussen verschillende apps
Wanneer een gebruiker wordt geverifieerd, wordt een sessiecooky ingesteld op het Microsoft Entra domein in de browser. MSAL.js vertrouwt op deze sessiecookie om single sign-on (SSO) voor de gebruiker tussen verschillende applicaties te bieden. Met name biedt MSAL.js de ssoSilent methode om de gebruiker aan te melden en tokens te verkrijgen zonder tussenkomst. Als de gebruiker echter meerdere gebruikersaccounts in een sessie met Microsoft Entra ID heeft, wordt de gebruiker gevraagd een account te kiezen waarmee hij of zij zich aanmeldt. Daarom zijn er twee manieren om SSO te realiseren met de methode ssoSilent.
Met gebruikerstip
Om de prestaties te verbeteren en ervoor te zorgen dat de autorisatieserver naar de juiste accountsessie zoekt, kunt u een van de volgende opties doorgeven in het aanvraagobject van de ssoSilent methode om het token op de achtergrond te verkrijgen.
-
login_hint, die kan worden opgehaald uit de gebruikersnaamseigenschap van het objectaccountof uit de claimupnin het ID-token. Als uw app gebruikers aanmeldt met B2C, zie: B2C-gebruikersstromen configureren om een gebruikersnaam in ID-tokens te verzenden - Sessie-id,
siddie kan worden opgehaald uitidTokenClaimseenaccountobject. -
account, die kan worden opgehaald met een van de accountmethoden
We raden u aan de login_hintoptionele ID-tokenclaim te gebruiken die aan ssoSilent wordt verstrekt als loginHint, omdat dit de meest betrouwbare accountaanwijzing is voor stille en interactieve aanvragen.
Een aanmeldingshint gebruiken
De login_hint optionele claim biedt een hint voor Microsoft Entra ID over het gebruikersaccount dat zich probeert aan te melden. Als u de accountselectieprompt wilt omzeilen die doorgaans wordt weergegeven tijdens interactieve verificatieaanvragen, geeft u de loginHint volgende informatie op:
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
}
}
In dit voorbeeld loginHint bevat de e-mail of UPN van de gebruiker, die wordt gebruikt als een hint tijdens interactieve tokenaanvragen. De hint kan tussen toepassingen worden doorgegeven om stille eenmalige aanmelding mogelijk te maken, waarbij toepassing A een gebruiker kan aanmelden, de claim loginHint kan lezen en vervolgens de claim en de huidige tenantcontext naar toepassing B kan verzenden. Microsoft Entra ID zal proberen het aanmeldingsformulier vooraf in te vullen of de prompt voor accountselectie te omzeilen en direct door te gaan met het authenticatieproces voor de opgegeven gebruiker.
Als de gegevens in de login_hint claim niet overeenkomen met een bestaande gebruiker, worden ze omgeleid om de standaardaanmeldingservaring te doorlopen, inclusief accountselectie.
Een sessie-id gebruiken
Als u een sessie-id wilt gebruiken, voegt sid u deze toe als een optionele claim aan de id-tokens van uw app. Met sid de claim kan een toepassing de Microsoft Entra sessie van een gebruiker identificeren, onafhankelijk van de accountnaam of gebruikersnaam. Zie Optionele claims opgeven voor uw app voor informatie over het toevoegen van optionele claims zoals sid. Gebruik de sessie-id (SID) in aanvragen voor stille verificatie die u met ssoSilent in MSAL.js doet.
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
}
}
Een accountobject gebruiken
Als u de gebruikersaccountgegevens kent, kunt u het gebruikersaccount ook ophalen met behulp van de getAccountByUsername() of getAccountByHomeId() methoden:
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
}
}
Zonder hint van de gebruiker
U kunt proberen de ssoSilent methode te gebruiken zonder dat er een accountwordt doorgegeven, sid of login_hint zoals wordt weergegeven in de volgende code:
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
}
}
Er is echter een kans op stille aanmeldingsfouten als de toepassing meerdere gebruikers in één browsersessie heeft of als de gebruiker meerdere accounts voor die sessie met één browser heeft. De volgende fout kan worden weergegeven als er meerdere accounts beschikbaar zijn:
InteractionRequiredAuthError: interaction_required: AADSTS16000: Either multiple user identities are available for the current request or selected account is not supported for the scenario.
De fout geeft aan dat de server niet kan bepalen welk account moet worden aangemeld en dat een van de parameters in het vorige voorbeeld (account, login_hint, sid) of een interactieve aanmelding nodig is om het account te kiezen.
Overwegingen bij gebruik ssoSilent
Omleidings-URI (antwoord-URL)
Voor betere prestaties en om problemen te helpen voorkomen, stelt u redirectUri in op een lege pagina of een andere pagina die geen MSAL gebruikt.
- Als de toepassingsgebruikers alleen pop-up- en stille methoden gebruiken, stelt u het
redirectUriin op hetPublicClientApplicationconfiguratieobject. - Als de toepassing ook omleidingsmethoden gebruikt, stelt u de
redirectUrioptie per aanvraag in.
Cookies van derden
ssoSilentprobeert een verborgen iframe te openen en een bestaande sessie opnieuw te gebruiken met Microsoft Entra ID. Dit werkt niet in browsers die cookies van derden zoals Safari blokkeren en leiden tot een interactiefout:
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
Om de fout op te lossen, moet de gebruiker een interactieve verificatieaanvraag maken met behulp van de loginPopup() of loginRedirect(). In sommige gevallen kan de promptwaarde none samen met een interactieve methode van MSAL.js worden gebruikt om single sign-on te realiseren. Zie interactieve aanvragen met prompt=geen voor meer. Als u de aanmeldingsgegevens van de gebruiker al hebt, kunt u de loginHint of sid optionele parameters doorgeven om een specifiek account aan te melden.
SSO uitschakelen met prompt=login
Als u liever hebt dat Microsoft Entra ID de gebruiker vraagt hun aanmeldingsgegevens in te voeren, ondanks een actieve sessie bij de autorisatieserver, kunt u in aanvragen met MSAL.js de promptparameter login gebruiken. Zie MSAL.js promptgedrag voor meer informatie.
Verificatiestatus delen tussen ADAL.js en MSAL.js
MSAL.js biedt functiepariteit met ADAL.js voor Microsoft Entra verificatiescenario's. Om de migratie van ADAL.js naar MSAL.js eenvoudig te maken en de verificatiestatus tussen apps te delen, leest de bibliotheek het id-token voor dat de sessie van de gebruiker in ADAL.js cache vertegenwoordigt. Om hiervan te profiteren wanneer u migreert vanaf ADAL.js, moet u ervoor zorgen dat de bibliotheken localStorage gebruiken voor het cachen van tokens. Stel de cacheLocation op localStorage in de MSAL.js- en ADAL.js-configuratie als volgt in bij de initialisatie:
// 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);
Volgende stappen
Zie voor meer informatie over SSO: