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.

Vi rekommenderar att du använder det login_hintvalfria 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 sidfinns 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å konfigurationsobjektet PublicClientApplication .
  • 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 loginHintsid 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: