Autenticação única com o MSAL.js

O SSO (logon único) fornece uma experiência mais perfeita, reduzindo o número de vezes que um usuário é solicitado a obter credenciais. Os usuários inserem suas credenciais uma vez, e a sessão estabelecida pode ser reutilizada por outros aplicativos no mesmo dispositivo sem solicitar novamente as credenciais.

Microsoft Entra ID habilita o SSO definindo um cookie de sessão quando um usuário se autentica pela primeira vez. MSAL.js também armazena em cache os tokens de ID e os tokens de acesso do usuário no armazenamento do navegador por domínio do aplicativo. Os dois mecanismos, Microsoft Entra cookie de sessão e cache de Biblioteca do Microsoft Authenticator (MSAL), são independentes uns dos outros, mas trabalham juntos para fornecer comportamento de SSO.

SSO entre as abas do navegador para o mesmo aplicativo

Quando um usuário tem um aplicativo aberto em várias guias e entra em uma delas, ele pode ser conectado ao mesmo aplicativo aberto em outras guias sem ser solicitado. Para fazer isso, você precisa definir o cacheLocation em MSAL.js objeto de configuração como localStorage mostrado no exemplo a seguir:

const config = {
  auth: {
    clientId: "1111-2222-3333-4444-55555555",
  },
  cache: {
    cacheLocation: "localStorage",
  },
};

const msalInstance = new msal.PublicClientApplication(config);

Nesse caso, as instâncias de aplicativo em guias de navegador diferentes usam o mesmo cache MSAL, compartilhando assim o estado de autenticação entre elas. Você também pode usar eventos MSAL para atualizar instâncias de aplicativo quando um usuário faz logon de outra guia ou janela do navegador. Para obter mais informações, consulte: Sincronização do estado de login entre guias e janelas

SSO entre aplicativos diferentes

Quando um usuário é autenticado, um cookie de sessão é definido no domínio Microsoft Entra no navegador. MSAL.js depende desse cookie de sessão para fornecer SSO para o usuário entre diferentes aplicativos. Especificamente, o MSAL.js oferece o método ssoSilent para autenticar o usuário e obter tokens sem necessidade de interação. No entanto, se o usuário tiver várias contas de usuário em uma sessão com Microsoft Entra ID, ele será solicitado a escolher uma conta com a qual entrar. Dessa forma, há duas maneiras de alcançar o SSO usando ssoSilent o método.

Com dica de usuário

Para melhorar o desempenho e garantir que o servidor de autorização procure a sessão de conta correta, você pode passar uma das seguintes opções no objeto de solicitação do ssoSilent método para obter o token silenciosamente.

Recomendamos usar a login_hintdeclaração opcional do token de ID fornecida para ssoSilent como loginHint, pois ela é a indicação de conta mais confiável para solicitações silenciosas e interativas.

Usando uma sugestão de login

A login_hint declaração opcional fornece ao Microsoft Entra ID uma indicação sobre a conta de usuário que está tentando fazer logon. Para contornar o prompt de seleção de conta normalmente exibido durante solicitações de autenticação interativas, forneça o loginHint, conforme mostrado:

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
    }
}

Neste exemplo, loginHint contém o email ou UPN do usuário, que é usado como uma dica durante solicitações interativas de token. A indicação pode ser passada entre aplicativos para facilitar o SSO silencioso, em que o aplicativo A pode conectar um usuário, ler loginHint e, em seguida, enviar a declaração e o contexto do locatário atual para o aplicativo B. O Microsoft Entra ID tentará preencher previamente o formulário de logon ou ignorar o prompt de seleção de conta e prosseguir diretamente com o processo de autenticação para o usuário especificado.

Se as informações na declaração login_hint não corresponderem a nenhum usuário existente, haverá redirecionamento para o processo padrão de entrada, incluindo a seleção de conta.

Usando uma ID de sessão

Para usar uma ID de sessão, adicione sid como uma declaração opcional aos tokens de ID do aplicativo. A sid declaração permite que um aplicativo identifique a sessão de Microsoft Entra de um usuário independentemente do nome de conta ou nome de usuário. Para saber como adicionar declarações opcionais como sid, consulte Fornecer declarações opcionais ao seu aplicativo. Use o ID da sessão (SID) em solicitações de autenticação silenciosa feitas com ssoSilent no 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
    }
}

Usando um objeto da conta

Se você souber as informações da conta do usuário, também poderá recuperar a conta do usuário usando os métodos getAccountByUsername() ou 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
    }
}

Sem dica do usuário

Você pode tentar usar o ssoSilent método sem passar nenhum account, sid ou login_hint conforme mostrado no seguinte código:

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
    }
}

No entanto, há a possibilidade de erros de login silencioso se o aplicativo tiver vários usuários em uma única sessão do navegador ou se o usuário tiver várias contas nessa mesma sessão do navegador. O seguinte erro poderá ser exibido se várias contas estiverem disponíveis:

InteractionRequiredAuthError: interaction_required: AADSTS16000: Either multiple user identities are available for the current request or selected account is not supported for the scenario.

O erro indica que o servidor não pôde determinar em qual conta entrar e exigirá um dos parâmetros no exemplo anterior (account, login_hint, ) sidou uma entrada interativa para escolher a conta.

Considerações ao usar ssoSilent

URI de redirecionamento (URL de resposta)

Para melhorar o desempenho e ajudar a evitar problemas, defina redirectUri como uma página em branco ou outra página que não utilize o MSAL.

  • Se o aplicativo usar apenas os métodos pop-up e silencioso, defina o redirectUri no objeto de configuração PublicClientApplication.
  • Se o aplicativo também usa métodos de redirecionamento, defina redirectUri para cada solicitação.

Cookies de terceiros

ssoSilenttenta abrir um iframe oculto e reutilizar uma sessão existente com Microsoft Entra ID. Isso não funcionará em navegadores que bloqueiam cookies de terceiros, como o Safari, e levará a um erro de interação:

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

Para resolver o erro, o usuário deve criar uma solicitação de autenticação interativa usando o loginPopup() ou loginRedirect(). Em alguns casos, o valor de prompt none pode ser usado em conjunto com um método interativo do MSAL.js para obter SSO. Consulte requisições interativas com prompt=none para saber mais. Se você já tiver as informações de login do usuário, poderá passar qualquer um dos parâmetros opcionais loginHint ou sid para fazer login em uma conta específica.

Desabilitando o SSO com prompt=login

Se preferir que o Microsoft Entra ID solicite ao usuário que insira suas credenciais, mesmo com uma sessão ativa no servidor de autorização, você pode usar o parâmetro de prompt login em solicitações com o MSAL.js. Consulte o comportamento do prompt no MSAL.js para saber mais.

Compartilhando o estado de autenticação entre ADAL.js e MSAL.js

MSAL.js traz paridade de recursos com ADAL.js para cenários de autenticação Microsoft Entra. Para facilitar a migração de ADAL.js para MSAL.js e compartilhar o estado de autenticação entre aplicativos, a biblioteca lê o token de ID que representa a sessão do usuário no cache do ADAL.js. Para aproveitar isso ao migrar do ADAL.js, você precisará garantir que as bibliotecas usem localStorage para armazenar tokens em cache. Defina cacheLocation como localStorage em ambas as configurações do MSAL.js e do ADAL.js durante a inicialização, da seguinte maneira:


// 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);

Próximas Etapas 

Para obter mais informações sobre o SSO, consulte: