Vertrouwelijke clienttoepassingen migreren van ADAL.NET naar MSAL.NET

In deze instructies migreert u een vertrouwelijke clienttoepassing van Azure Active Directory Authentication Library voor .NET (ADAL.NET) naar Microsoft Authentication Library voor .NET (MSAL.NET). Vertrouwelijke clienttoepassingen omvatten web-apps, web-API's en daemon-toepassingen die namens hen een andere service aanroepen. Zie Verificatiestromen en toepassingsscenario's voor meer informatie over vertrouwelijke apps. Als uw app is gebaseerd op ASP.NET Core, raadpleeg dan Microsoft.Identity.Web.

Voor app-registraties:

  • U hoeft geen nieuwe app-registratie te maken. (U behoudt dezelfde client-id.)
  • U hoeft de verificatie vooraf niet te wijzigen (api-machtigingen met beheerderstoestemming).

Migratiestappen

  1. Zoek de code die gebruikmaakt van ADAL.NET in uw app.

    De code die ADAL gebruikt in een vertrouwelijke client-app instantieert AuthenticationContext en roept ofwel AcquireTokenByAuthorizationCode of een override van AcquireTokenAsync aan met de volgende parameters:

    • Een resourceId tekenreeks. Deze variabele is de app-id-URI van de web-API die u wilt aanroepen.
    • Een exemplaar van IClientAssertionCertificate of ClientAssertion. Dit exemplaar biedt de clientreferenties voor uw app om de identiteit van uw app te bewijzen.
  2. Nadat u hebt vastgesteld dat u apps hebt die gebruikmaken van ADAL.NET installeert u het MSAL.NET NuGet-pakket Microsoft. Identity.Client en werk uw projectbibliotheekverwijzingen bij. Zie Een NuGet-pakket installeren voor meer informatie. Als u serializers voor tokencache wilt gebruiken, installeert u Microsoft. Identity.Web.TokenCache.

  3. Werk de code bij volgens het vertrouwelijke clientscenario. Sommige stappen zijn gebruikelijk en zijn van toepassing op alle vertrouwelijke clientscenario's. Andere stappen zijn uniek voor elk scenario.

    Vertrouwelijke cliëntscenario's:

Mogelijk hebt u een wrapper om ADAL.NET heen gemaakt voor het afhandelen van certificaten en caching. In deze handleiding wordt dezelfde benadering gebruikt om het migratieproces van ADAL.NET naar MSAL.NET te illustreren. Deze code is echter alleen voor demonstratiedoeleinden. Kopieer en plak deze wrappers niet of integreer ze niet in uw code zoals ze zijn.

Daemon-apps migreren

Daemon-scenario's maken gebruik van de OAuth2.0-clientreferentiestroom. Ze worden ook wel service-naar-service-aanroepen genoemd. Uw app verwerft zelf een token, niet namens een gebruiker.

Ontdek of uw code daemon-scenario's gebruikt

De ADAL-code voor uw app maakt gebruik van daemon-scenario's als deze een aanroep bevat AuthenticationContext.AcquireTokenAsync met de volgende parameters:

  • Een resource (app-id-URI) als eerste parameter
  • IClientAssertionCertificate of ClientAssertion als de tweede parameter

AuthenticationContext.AcquireTokenAsync heeft geen parameter van het type UserAssertion. Als dit het geval is, is uw app een web-API en wordt het scenario voor het aanroepen van downstream-web-API's gebruikt.

De code van daemon-scenario's bijwerken

De volgende stappen voor het bijwerken van code zijn van toepassing op alle vertrouwelijke clientscenario's:

  1. Voeg de MSAL.NET naamruimte toe in de broncode: using Microsoft.Identity.Client;.
  2. Gebruik ConfidentialClientApplicationBuilder.Create om IConfidentialClientApplication te instantiëren in plaats van AuthenticationContext.
  3. In plaats van de tekenreeks resourceId gebruikt MSAL.NET scopes. Omdat toepassingen die ADAL.NET gebruiken vooraf zijn geautoriseerd, kunt u altijd de volgende machtigingen gebruiken: new string[] { $"{resourceId}/.default" }
  4. Vervang de aanroep naar AuthenticationContext.AcquireTokenAsync door een aanroep naar IConfidentialClientApplication.AcquireTokenXXX, waarbij XXX afhankelijk is van uw scenario.

Vervang in dit geval de aanroep naar AuthenticationContext.AcquireTokenAsync een aanroep naar IConfidentialClientApplication.AcquireTokenClient.

Hier volgt een vergelijking van ADAL.NET en MSAL.NET code voor daemon-scenario's:

ADAL

MSAL

using Microsoft.IdentityModel.Clients.ActiveDirectory;
using System.Security.Cryptography.X509Certificates;
using System.Threading.Tasks;

public partial class AuthWrapper
{
const string ClientId = "Guid (AppID)";
const string authority 
= "https://login.microsoftonline.com/{tenant}";
// App ID URI of web API to call
const string resourceId = "https://target-api.domain.com";
X509Certificate2 certificate = LoadCertificate();



public async Task<AuthenticationResult> GetAuthenticationResult()
{


var authContext = new AuthenticationContext(authority);
var clientAssertionCert = new ClientAssertionCertificate(
ClientId,
certificate);


var authResult = await authContext.AcquireTokenAsync(
resourceId,
clientAssertionCert,
);

return authResult;
}
}
using Microsoft.Identity.Client;
using System.Security.Cryptography.X509Certificates;
using System.Threading.Tasks;

public partial class AuthWrapper
{
const string ClientId = "Guid (Application ID)";
const string authority 
= "https://login.microsoftonline.com/{tenant}";
// App ID URI of web API to call
const string resourceId = "https://target-api.domain.com";
X509Certificate2 certificate = LoadCertificate();

IConfidentialClientApplication app;

public async Task<AuthenticationResult> GetAuthenticationResult()
{

var app = ConfidentialClientApplicationBuilder.Create(ClientId)
.WithCertificate(certificate)
.WithAuthority(authority)
.Build();

// Setup token caching https://learn.microsoft.com/azure/active-directory/develop/msal-net-token-cache-serialization?tabs=aspnet
// For example, for an in-memory cache with 1GB limit, use  
app.AddInMemoryTokenCache(services =>
{
// Configure the memory cache options
services.Configure<MemoryCacheOptions>(options =>
{
options.SizeLimit = 1024 * 1024 * 1024; // in bytes (1 GB of memory)
});
}

var authResult = await app.AcquireTokenForClient(
new [] { $"{resourceId}/.default" })
// .WithTenantId(specificTenant)
// See https://aka.ms/msal.net/withTenantId
.ExecuteAsync()
.ConfigureAwait(false);

return authResult;
}
}

Profiteer van token-caching

Als u geen tokencaching instelt, wordt u door de tokenverlener beperkt, wat resulteert in fouten. Het kost ook veel minder om een token op te halen uit de cache (10-20 ms) dan van ESTS (500-30000ms).

Als u een gedistribueerde tokencache wilt implementeren, raadpleegt u tokencache voor een web-app of web-API (vertrouwelijke clienttoepassing).

Meer informatie over het daemon-scenario en hoe het wordt geïmplementeerd met MSAL.NET of Microsoft. Identity.Web in nieuwe toepassingen.

MSAL-voordelen

Belangrijke voordelen van MSAL.NET voor uw app zijn:

  • Flexibiliteit. MSAL.NET helpt uw app tolerant te maken via:

    • Microsoft Entra ID CCS-voordelen (Cached Credential Service). CCS werkt als een Microsoft Entra back-up.
    • Proactieve verlenging van tokens als de API die u aanroept, tokens met een lange levensduur mogelijk maakt via continue toegangsevaluatie.
  • Beveiliging. U kunt PoP-tokens (Proof of Possession) verkrijgen als de web-API die u wilt aanroepen, dit vereist. Zie Bewijs van bezit in MSAL.NET voor meer informatie

  • Prestaties en schaalbaarheid. Als u uw cache niet hoeft te delen met ADAL.NET schakelt u de compatibiliteit van de verouderde cache uit wanneer u de vertrouwelijke clienttoepassing maakt (.WithLegacyCacheCompatibility(false)) om de prestaties aanzienlijk te verbeteren.

    app = ConfidentialClientApplicationBuilder.Create(ClientId)
            .WithCertificate(certificate)
            .WithAuthority(authority)
            .WithLegacyCacheCompatibility(false)
            .Build();
    

Troubleshooting

MsalServiceException

De volgende informatie over probleemoplossing maakt twee aannames:

  • Uw ADAL.NET code werkte.
  • U bent gemigreerd naar MSAL door dezelfde client-id te behouden.

Als u een foutmelding krijgt met een van de volgende berichten:

AADSTS700027: Client assertion contains an invalid signature. [Reason - The key was not found.]

AADSTS90002: Tenant 'aaaabbbb-0000-cccc-1111-dddd2222eeee' not found. This may happen if there are no active subscriptions for the tenant. Check to make sure you have the correct tenant ID. Check with your subscription administrator.

Los de uitzondering op met behulp van deze stappen:

  1. Controleer of u de nieuwste versie van MSAL.NET gebruikt.
  2. Controleer of de instantiehost die u hebt ingesteld bij het bouwen van de vertrouwelijke client-app en de instantiehost die u met ADAL hebt gebruikt, vergelijkbaar zijn. Is het met name dezelfde cloud (Azure Government, Microsoft Azure beheerd door 21Vianet of Azure Duitsland)?

MsalClientException

Geef in apps met meerdere tenants een algemene instantie op bij het bouwen van de app om een specifieke tenant te targeten, zoals de tenant van de gebruiker bij het aanroepen van een web-API. Sinds MSAL.NET 4.37.0 kunt u, wanneer u .WithAzureRegion opgeeft bij het maken van de toepassing, de Authority tijdens tokenaanvragen niet langer opgeven met .WithAuthority. Als u dit doet, krijgt u de volgende foutmelding bij het bijwerken van eerdere versies van MSAL.NET:

MsalClientException - "You configured WithAuthority at the request level, and also WithAzureRegion. This is not supported when the environment changes from application to request. Use WithTenantId at the request level instead."

Om dit probleem op te lossen, vervangt u .WithAuthority in de AcquireTokenXXX-expressie door .WithTenantId. Geef de tenant op met behulp van een GUID of een domeinnaam.

Volgende stappen 

Meer informatie over: