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.
login_hint
, que pode ser recuperado daaccount
propriedade username do objeto ou daupn
declaração no token de ID. Se seu aplicativo estiver autenticando usuários com B2C, consulte: Configurar fluxos de usuário B2C para emitir nome de usuário em tokens de ID- ID de sessão,
sid
, que pode ser recuperado deidTokenClaims
umaccount
objeto. account
, que pode ser recuperado usando um dos métodos de conta
Recomendamos o uso da login_hint
declaração de token de ID opcional fornecida como loginHint
ssoSilent
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 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 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
redirectUri
PublicClientApplication
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: