Share via


Início de sessão único com MSAL.js

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

O 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 de aplicativo. Os dois mecanismos, cookie de sessão do Microsoft Entra e cache da Biblioteca de Autenticação da Microsoft (MSAL), são independentes um do outro, mas trabalham juntos para fornecer comportamento de SSO.

SSO entre separadores do browser para a mesma aplicação

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, instâncias de aplicativos em diferentes guias do navegador 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 do aplicativo quando um usuário faz login em outra guia ou janela do navegador. Para obter mais informações, consulte: Sincronizando o estado conectado entre guias e janelas

SSO entre diferentes aplicativos

Quando um usuário se autentica, um cookie de sessão é definido no domínio Microsoft Entra no navegador. MSAL.js depende deste cookie de sessão para fornecer SSO para o usuário entre diferentes aplicativos. Em particular, MSAL.js oferece o ssoSilent método para entrar no usuário e obter tokens sem uma interação. No entanto, se o usuário tiver várias contas de usuário em uma sessão com o Microsoft Entra ID, ele será solicitado a escolher uma conta para entrar. Como tal, existem duas maneiras de alcançar o SSO usando ssoSilent o método.

Com dica do 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 o uso da login_hintdeclaração de token de ID opcional fornecida como loginHintssoSilent sendo a dica de conta mais confiável de solicitações silenciosas e interativas.

Usando uma dica de login

A login_hint declaração opcional fornece uma dica para o Microsoft Entra ID sobre a conta de usuário que está tentando entrar. Para ignorar o prompt de seleção de conta normalmente mostrado 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 e-mail ou UPN do usuário, que é usado como uma dica durante solicitações de token interativo. A dica pode ser passada entre aplicativos para facilitar o SSO silencioso, onde o aplicativo A pode entrar em um usuário, ler o loginHinte, 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 entrada 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 não corresponderem a login_hint nenhum usuário existente, eles serão redirecionados para passar pela experiência de entrada padrão, 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 seu aplicativo. A sid declaração permite que um aplicativo identifique a sessão do Microsoft Entra de um usuário independentemente de seu 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 a ID de sessão (SID) em solicitações de autenticação silenciosa feitas com ssoSilent 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 de conta

Se você souber as informações da conta de usuário, também poderá recuperá-la usando os getAccountByUsername() métodos 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 como mostrado no código a seguir:

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á uma probabilidade de erros de entrada silenciosos se o aplicativo tiver vários usuários em uma única sessão do navegador ou se o usuário tiver várias contas para essa única sessão do navegador. O seguinte erro pode 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, sid) ou um login interativo para escolher a conta.

Considerações ao usar ssoSilent

URI de redirecionamento (URL de resposta)

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

  • Se os usuários do aplicativo apenas pop-up e métodos silenciosos, defina o redirectUriPublicClientApplication no objeto de configuração.
  • Se o aplicativo também usa métodos de redirecionamento, defina o redirectUri em uma base por solicitação.

Cookies de terceiros

ssoSilent tenta abrir um iframe oculto e reutilizar uma sessão existente com o 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 junto com um método MSAL.js interativo para obter SSO. Consulte Solicitações interativas com prompt=none para obter mais informações. Se já tiver as informações de início de sessão do utilizador, pode passar os loginHint parâmetros opcionais ou sid os parâmetros opcionais para iniciar sessão numa conta específica.

Negando SSO com prompt=login

Se você preferir que o Microsoft Entra ID solicite que o usuário insira suas credenciais apesar de uma sessão ativa com o servidor de autorização, você pode usar o parâmetro de prompt de login em solicitações com MSAL.js. Consulte MSAL.js comportamento de prompt 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 do Microsoft Entra. Para facilitar a migração do ADAL.js para o 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 ADAL.js. Para aproveitar isso ao migrar do ADAL.js, você precisará garantir que as bibliotecas estejam usando localStorage para armazenar tokens em cache. Defina o cacheLocation para localStorage na configuração MSAL.js e ADAL.js na 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óximos passos

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