Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Migrar as suas aplicações de ADAL para MSAL traz benefícios de segurança e resiliência. Este artigo descreve as diferenças entre MSAL.NET e ADAL.NET. Todas as novas aplicações devem utilizar o MSAL.NET e a plataforma de identidades da Microsoft, que é a geração mais recente de Bibliotecas de Autenticação Microsoft. Usando o MSAL.NET, adquire tokens para os utilizadores que iniciam sessão na sua aplicação com Microsoft Entra ID (contas de trabalho e escola), contas Microsoft (pessoais) (MSA) ou Azure AD B2C. Se tiver uma aplicação existente que está a usar ADAL.NET, migre-a para o MSAL.NET.
Ainda precisa de usar ADAL.NET se a sua aplicação precisar de iniciar sessão com utilizadores com versões anteriores do Serviços de Federação do Active Directory (AD FS) (ADFS). Para mais informações, consulte o apoio ADFS.
Pré-requisitos
Consulte a visão geral da MSAL para saber mais sobre a MSAL.
Diferenças
| REDE ADAL | MSAL NET | |
|---|---|---|
| Pacotes NuGet e Namespaces | O ADAL foi consumido pela Microsoft. IdentityModel.Clients.ActiveDirectory pacote NuGet. O espaço de nomes era Microsoft.IdentityModel.Clients.ActiveDirectory. |
Adiciona a Microsoft. Identity.Client NuGet e usar o Microsoft.Identity.Client namespace. Se estás a construir uma aplicação cliente confidencial, experimenta a Microsoft. Identidade.Web. |
| Âmbito e recursos | O ADAL.NET adquire tokens para recursos. | A MSAL.NET adquire tokens para os escopos. Vários overrides MSAL.NET AcquireTokenXXX requerem um parâmetro chamado scopes(IEnumerable<string> scopes). Este parâmetro é uma lista simples de cadeias que declaram as permissões e recursos solicitados. Os osciloscópios bem conhecidos são os do Microsoft Graph. Também pode aceder a recursos v1.0 usando o MSAL.NET. |
| Disciplinas obrigatórias | O ADAL.NET usava o AuthenticationContext como representação da sua ligação ao Serviço de Token de Segurança (STS) ou servidor de autorização, através de uma Autoridade. | O MSAL.NET foi concebido em torno de aplicações cliente. Define IPublicClientApplication interfaces para aplicações clientes públicas e IConfidentialClientApplication para aplicações cliente confidenciais, bem como uma interface IClientApplicationBase base para o contrato comum a ambos os tipos de aplicações. |
| Aquisição de tokens | Em clientes públicos, a ADAL utiliza AcquireTokenAsync e AcquireTokenSilentAsync para chamadas de autenticação. |
Em clientes públicos, o MSAL utiliza AcquireTokenInteractive e AcquireTokenSilent para as mesmas chamadas de autenticação. Os parâmetros são diferentes dos do ADAL. Em aplicações cliente Confidenciais, existem métodos de aquisição de tokens com um nome explícito dependendo do cenário. Outra diferença é que, no MSAL.NET, já não é necessário passar a ClientID entrada da sua aplicação em cada chamada AcquireTokenXX. O ClientID é definido apenas uma vez ao construir IPublicClientApplication ou IConfidentialClientApplication. |
| IAccount e IUser | O ADAL define a noção de utilizador através da interface IUser. No entanto, um utilizador é um humano ou um agente de software. Assim, um utilizador pode possuir uma ou mais contas na plataforma de identidades da Microsoft (várias contas Microsoft Entra, Azure AD B2C, contas pessoais da Microsoft). O utilizador pode também ser responsável por uma ou mais contas da plataforma de identidades da Microsoft. | O MSAL.NET define o conceito de conta (através da interface IAccount). A interface IAccount representa informação sobre uma única conta. O utilizador pode ter várias contas em diferentes inquilinos. O MSAL.NET fornece melhor informação em cenários de hóspedes, assim como a informação da conta residencial é fornecida. Pode ler mais sobre as diferenças entre IUser e IAccount. |
| Persistência da cache | O ADAL.NET permite expandir a TokenCache classe para implementar a funcionalidade de persistência desejada em plataformas sem armazenamento seguro (.NET Framework e núcleo .NET) usando os BeforeAccessmétodos , and BeforeWrite . Para mais detalhes, veja serialização da cache de token no ADAL.NET. |
O MSAL.NET torna a cache de tokens uma classe selada, removendo a possibilidade de a expandir. Assim, a sua implementação da persistência da cache de tokens deve ser sob a forma de uma classe helper que interaja com a cache de tokens selada. Esta interação é descrita na serialização da cache de tokens no artigo do MSAL.NET. A serialização para uma aplicação cliente pública (ver cache de token para uma aplicação cliente pública) é diferente da de uma aplicação cliente confidencial (ver cache de token para uma aplicação web ou API web). |
| Autoridade comum | O ADAL utiliza o Azure AD v1.0.
https://login.microsoftonline.com/commona autoridade no Azure AD v1.0 (que a ADAL utiliza) permite aos utilizadores iniciar sessão usando qualquer conta da organização Microsoft Entra (de trabalho ou de escola). O Azure AD v1.0 não permite iniciar sessão com contas pessoais da Microsoft. Para mais informações, consulte validação de autoridade em ADAL.NET. |
O MSAL usa o Azure AD v2.0.
https://login.microsoftonline.com/commonautoridade no Azure AD v2.0 (que a MSAL utiliza) permite aos utilizadores iniciar sessão com qualquer conta da organização Microsoft Entra (de trabalho ou escolar) ou com uma conta pessoal da Microsoft. Para restringir o início de sessão usando apenas contas da organização (de trabalho ou de escola) no MSAL, terá de usar o https://login.microsoftonline.com/organizations endpoint. Para mais detalhes, consulte o authority parâmetro na aplicação cliente pública. |
Subsídios apoiados
Segue-se um resumo que compara subsídios apoiados pelo MSAL.NET e ADAL.NET para candidaturas públicas e confidenciais de clientes.
Aplicações para clientes públicos
A imagem seguinte resume algumas das diferenças entre ADAL.NET e MSAL.NET para uma aplicação cliente pública.
Aqui estão os subsídios apoiados no ADAL.NET e MSAL.NET para aplicações de desktop e móveis.
| Subvenção | MSAL.NET | ADAL.NET |
|---|---|---|
| Interactive | Aquisição interativa de tokens no MSAL.NET | Autenticação Interativa |
| Autenticação integrada do Windows | Autenticação integrada do Windows | Autenticação integrada no Windows (Kerberos) |
| Nome de utilizador / Palavra-passe | Autenticação por nome de utilizador e palavra-passe | Aquisição de tokens com nome de utilizador e palavra-passe |
| Fluxo de código do dispositivo | Fluxo de código do dispositivo | Perfil de dispositivo para dispositivos sem navegadores web |
Aplicações confidenciais para clientes
A imagem seguinte resume algumas das diferenças entre ADAL.NET e MSAL.NET para uma aplicação cliente confidencial.
Aqui estão as bolsas apoiadas no ADAL.NET, MSAL.NET e Microsoft. Identity.Web para aplicações web, APIs web e aplicações daemon.
| Tipo de Aplicação | Subvenção | MSAL.NET | ADAL.NET |
|---|---|---|---|
| Web app, web API, daemon | Credenciais do cliente | Fluxos de credenciais de clientes no MSAL.NET | Fluxos de credenciais do cliente em ADAL.NET |
| API Web | Em nome de | Em nome do in MSAL.NET | Chamadas de serviço para serviço em nome do utilizador com ADAL.NET |
| Aplicação Web | Código de Autenticação | Aquisição de tokens com códigos de autorização em aplicações web com A MSAL.NET | Aquisição de tokens com códigos de autorização em aplicações web com ADAL.NET |
Migração do ADAL 2.x com tokens de atualização
No ADAL.NET v2. X, os tokens de refresh foram expostos, permitindo-lhe desenvolver soluções para o uso destes tokens, armazenando-os em cache e utilizando os AcquireTokenByRefreshToken métodos fornecidos pelo ADAL 2.x.
Algumas dessas soluções foram usadas em cenários como:
- Serviços de longa duração que realizam ações, incluindo a atualização dos painéis de controlo para os utilizadores quando estes já não estão ligados/iniciados sessão na aplicação.
- Cenários WebFarm para permitir que o cliente traga o token de atualização para o serviço web (a cache é feita do lado do cliente, do cookie encriptado e não do lado do servidor).
O MSAL.NET não expõe tokens de atualização por razões de segurança. A MSAL trata de tokens refrescantes para ti.
Felizmente, o MSAL.NET tem uma API que permite migrar os seus tokens de atualização anteriores (adquiridos com ADAL) para o IConfidentialClientApplication:
/// <summary>
/// Acquires an access token from an existing refresh token and stores it and the refresh token into
/// the application user token cache, where it will be available for further AcquireTokenSilent calls.
/// This method can be used in migration to MSAL from ADAL v2 and in various integration
/// scenarios where you have a RefreshToken available.
/// (see https://aka.ms/msal-net-migration-adal2-msal2)
/// </summary>
/// <param name="scopes">Scope to request from the token endpoint.
/// Setting this to null or empty will request an access token, refresh token and ID token with default scopes</param>
/// <param name="refreshToken">The refresh token from ADAL 2.x</param>
IByRefreshToken.AcquireTokenByRefreshToken(IEnumerable<string> scopes, string refreshToken);
Com este método, podes fornecer o token de atualização usado anteriormente juntamente com quaisquer escopos (recursos) que queiras. O token de atualização será trocado por um novo e armazenado em cache na sua aplicação.
Como este método é pensado para cenários que não são típicos, não é facilmente acessível com o IConfidentialClientApplication sem primeiro o lançar para IByRefreshToken.
O excerto de código abaixo mostra algum código de migração numa aplicação cliente confidencial.
TokenCache userCache = GetTokenCacheForSignedInUser();
string rt = GetCachedRefreshTokenForSignedInUser();
IConfidentialClientApplication app;
app = ConfidentialClientApplicationBuilder.Create(clientId)
.WithAuthority(Authority)
.WithRedirectUri(RedirectUri)
.WithClientSecret(ClientSecret)
.Build();
IByRefreshToken appRt = app as IByRefreshToken;
AuthenticationResult result = await appRt.AcquireTokenByRefreshToken(null, rt)
.ExecuteAsync()
.ConfigureAwait(false);
GetCachedRefreshTokenForSignedInUser recupera o token de atualização que estava armazenado em algum armazenamento por uma versão anterior da aplicação que costumava usar ADAL 2.x.
GetTokenCacheForSignedInUser desserializa uma cache para o utilizador iniciado sessão (pois as aplicações clientes confidenciais devem ter uma cache por utilizador).
Um token de acesso e um token ID são devolvidos no AuthenticationResult valor enquanto o novo token de atualização é armazenado na cache. Também pode usar este método em vários cenários de integração onde tem um token de atualização disponível.
Tokens v1.0 e v2.0
Existem duas versões de tokens: tokens v1.0 e tokens v2.0. O endpoint v1.0 (usado pela ADAL) emite tokens ID v1.0, enquanto o endpoint v2.0 (usado pela MSAL) emite tokens ID v2.0. No entanto, ambos os endpoints emitem tokens de acesso da versão do token que a API web aceita. Uma propriedade do manifesto da aplicação da API web permite aos programadores escolher qual a versão do token aceite. Consulte accessTokenAcceptedVersion a documentação de referência do manifesto da candidatura .
Para mais informações sobre tokens de acesso v1.0 e v2.0, consulte tokens de acesso Microsoft Entra.
Exceptions
Interação exigia exceções
Usando o MSAL.NET, apanha MsalUiRequiredException conforme descrito no AcquireTokenSilent
catch(MsalUiRequiredException exception)
{
try {"try to authenticate interactively"}
}
Para detalhes, veja Lidar com erros e exceções no MSAL.NET
O ADAL.NET tinha exceções menos explícitas. Por exemplo, quando a autenticação silenciosa falhava no ADAL, o procedimento era apanhar a exceção e procurar o user_interaction_required código de erro:
catch(AdalException exception)
{
if (exception.ErrorCode == "user_interaction_required")
{
try
{“try to authenticate interactively”}}
}
}
Para mais detalhes, consulte o padrão recomendado para adquirir um token em aplicações clientes públicas com ADAL.NET.
Comportamento rápido
O comportamento dos prompts no MSAL.NET é equivalente ao comportamento dos prompts no ADAL.NET:
| ADAL.NET | MSAL.NET | Description |
|---|---|---|
PromptBehavior.Auto |
NoPrompt |
O Microsoft Entra ID escolhe o melhor comportamento (iniciar sessão silenciosa dos utilizadores se estiverem com apenas uma conta, ou mostrar o seletor de contas se estiverem iniciados com várias contas). |
PromptBehavior.Always |
ForceLogin |
Reinicia a caixa de login e força o utilizador a voltar a introduzir as suas credenciais. |
PromptBehavior.RefreshSession |
Consent |
Obriga o utilizador a consentir novamente todas as permissões. |
PromptBehavior.Never |
Never |
Não uses; Em vez disso, utilize o padrão recomendado para aplicações clientes públicas. |
PromptBehavior.SelectAccount |
SelectAccount |
Mostra o seletor de contas e força o utilizador a selecionar uma conta. |
Gestão de exceções a contestação de reclamações
Por vezes, ao adquirir um token, o Microsoft Entra ID lança uma exceção caso um recurso exija mais reivindicações do utilizador (por exemplo, autenticação de dois fatores).
No MSAL.NET, as exceções de contestação de reivindicações são tratadas da seguinte forma:
- Os
Claimsestão à superfície noMsalServiceException. - Há um WithClaims(String) método que pode aplicar-se aos
AcquireTokenXXXconstrutores.
Para mais detalhes, veja Handling MsalUiRequiredException.
No ADAL.NET, as exceções de contestação de reivindicações eram tratadas da seguinte forma:
-
AdalClaimChallengeExceptioné uma exceção (derivando deAdalServiceException). OClaimsmembro contém algum fragmento JSON com as reivindicações, que são esperadas. - A aplicação pública do cliente que recebia esta exceção precisava de chamar a
AcquireTokenInteractivesobreposição como tendo um parâmetro de reclamações. Este override nemAcquireTokenInteractivesequer tenta aceder à cache porque não é necessário. A razão é que o token na cache não tem as reivindicações corretas (caso contrárioAdalClaimChallengeException, não teria sido descartado). Assim, não há necessidade de olhar para a cache. PodemClaimChallengeExceptionser recebidos numa WebAPI a fazer OBO, masAcquireTokenInteractiveprecisam de ser chamados numa aplicação cliente pública que chama esta API web.
Para detalhes, incluindo exemplos, consulte tratamento AdalClaimChallengeException.
Scopes
O ADAL utiliza o conceito de recursos com resourceId string, enquanto o MSAL.NET, no entanto, usa escopos. A lógica usada pelo Microsoft Entra ID é a seguinte:
- Para o endpoint ADAL (v1.0) com um token de acesso v1.0 (o único possível),
aud=resource. - Para MSAL (endpoint v2.0) que pede um token de acesso para um recurso que aceita tokens v2.0,
aud=resource.AppId. - Para MSAL (endpoint v2.0) que pede um token de acesso para um recurso que aceita um token de acesso v1.0, o Microsoft Entra ID analisa o público desejado a partir do âmbito solicitado. Isto faz-se pegando em tudo o que há antes da última barra e usando-o como identificador de recurso. Assim, se
https://database.windows.netesperar uma audiência dehttps://database.windows.net/, terá de pedir um âmbito dehttps://database.windows.net//.default(repare na barra dupla antes de ./default). Isto é ilustrado pelos exemplos 1 e 2 abaixo.
Exemplo 1
Se quiser adquirir tokens para uma aplicação que aceite tokens v1.0 (por exemplo, a Microsoft Graph API, que é https://graph.microsoft.com), terá de criar scopes concatenando um identificador de recurso desejado com uma permissão OAuth2 desejada para esse recurso.
Por exemplo, para aceder ao nome do utilizador através de uma API web v1.0 cujo URI de ID de Aplicação é ResourceId, deveria usar:
var scopes = new [] { ResourceId+"/user_impersonation" };
Se quiseres ler e escrever com MSAL.NET Microsoft Entra ID usando o Microsoft Graph API (),https://graph.microsoft.com/ deves criar uma lista de escopos como no excerto de código abaixo:
string ResourceId = "https://graph.microsoft.com/";
string[] scopes = { ResourceId + "Directory.Read", ResourceId + "Directory.Write" }
Exemplo 2
Se o resourceId terminar com '/', vais precisar de ter um duplo '/' ao escrever o valor do escopo. Por exemplo, se quiser escrever o âmbito correspondente à API do Azure Resource Manager (https://management.core.windows.net/), peça o seguinte âmbito (note as duas barras).
var resource = "https://management.core.windows.net/"
var scopes = new[] {"https://management.core.windows.net//user_impersonation"};
var result = await app.AcquireTokenInteractive(scopes).ExecuteAsync();
// then call the API: https://management.azure.com/subscriptions?api-version=2016-09-01
Isto acontece porque a API do Resource Manager espera uma barra na sua reivindicação de audiência (aud), e depois há uma barra para separar o nome da API do âmbito.
Se quiser adquirir um token para todos os escopos estáticos de uma aplicação v1.0, deve criar a sua lista de escopos conforme mostrado no excerto de código abaixo:
ResourceId = "someAppIDURI";
var scopes = new [] { ResourceId+"/.default" };
Para um fluxo de credenciais de cliente, o âmbito a passar também seria /.default. Este âmbito diz ao Microsoft Entra ID: "todas as permissões ao nível da aplicação que o administrador consentiu no registo da aplicação.
Passos seguintes
Migre as suas aplicações de ADAL para MSALMigre as suas aplicações clientes confidenciais ADAL.NET para usar MSAL.NET