Op 15 december 2025 haalt Microsoft de ADAL to MSAL Recommendations API weg, het Graph-endpoint achter de aanbeveling "Migrate from ADAL to MSAL" in Entra ID. ADAL wordt sinds juni 2023 niet meer ondersteund en apps die het nog gebruiken blijven gewoon werken, dus in veel tenants was die aanbeveling het enige dat nog naar ze wees. In deze blog: wat er verdwijnt, hoe je dezelfde lijst uit de sign-in logs haalt met KQL of Graph PowerShell, en hoe ik de resultaten verdeel over je eigen ontwikkelaars, een leverancier of degene die de client beheert.
Foto: Curated Lifestyle via Unsplash
Wat er op 15 december stopt
In Graph heet de aanbeveling adalToMsalMigration. Alles wat je hebt gebouwd op
GET https://graph.microsoft.com/beta/directory/recommendations/{tenantId}_adalToMsalMigration/impactedResources, bijvoorbeeld een dashboard of een job die tickets aanmaakt voor app-eigenaren, verliest zijn bron. De entry heeft het alleen over de API. Wat er met de aanbeveling in het admin center gebeurt staat er niet in, en de Learn-pagina van de aanbeveling zelf noemt de retirement helemaal niet. Ik zou er dus ook niet op rekenen dat de weergave in de portal blijft bestaan.Hoe de aanbeveling werkte is nuttig om te weten, want dat is de logica die je zelf gaat nabouwen. Hij keek dagelijks naar ADAL-tokenaanvragen over de afgelopen 30 dagen en markeerde elke app die via ADAL een token aanvroeg als ADAL-applicatie, ook apps die ADAL en MSAL naast elkaar gebruiken. Een app ging op completed na 30 dagen zonder ADAL-aanvraag en kwam terug op active zodra er weer een binnenkwam.
Waarom ADAL-apps nog steeds aandacht verdienen
Het praktische probleem zit in de vergelijkingstabel verderop op die pagina. ADAL ondersteunt geen continuous access evaluation, geen token protection en niet de authentication broker waar device-based Conditional Access op leunt. Dat zijn juist de maatregelen die de meeste identity-teams nu uitrollen, en een ADAL-client voor een resource is wat doorgaans eindigt als permanente uitzondering in de policy die ze had moeten afdwingen. Het identity-team heeft die lijst, met een eigenaar per app, dus nodig voor zijn eigen Conditional Access-plannen, wat de ontwikkelaars er verder ook mee doen.
Waar de bibliotheek in de sign-in logs staat
Een paar dingen die de What's new-entry niet vermeldt. De property bestaat alleen op de beta signIn-resource; de v1.0-resource heeft hem niet, dus in PowerShell heb je Get-MgBetaAuditLogSignIn uit Microsoft.Graph.Beta.Reports nodig in plaats van Get-MgAuditLogSignIn. List signIns geeft bovendien alleen interactieve sign-ins terug, tenzij je filtert op signInEventTypes. ADAL-clients vernieuwen tokens meestal stil en daemons gebruiken client credentials, dus het grootste deel van wat je zoekt staat bij de non-interactive en service principal sign-ins. Het workbook kijkt naar alle drie, en voor zover ik kan zien deed de aanbeveling dat ook.
Beide routes hieronder vereisen Entra ID P1 of P2: Graph heeft dat nodig om sign-in logs te lezen, en de diagnostic setting die ze naar Log Analytics stuurt ook. Entra bewaart sign-ins 30 dagen bij P1 en P2 volgens de referentie voor dataretentie, wat overeenkomt met het venster van de aanbeveling. Een app die alleen aan het eind van de maand of het kwartaal draait heeft meer historie nodig, nog een reden om de logs in een workspace te hebben.
KQL voor Log Analytics of Sentinel
let lookback = 30d;
let myTenantId = "<your tenant ID>";
union
(SigninLogs
| where TimeGenerated > ago(lookback)
| extend AppName = AppDisplayName, SignInType = "interactive"),
(AADNonInteractiveUserSignInLogs
| where TimeGenerated > ago(lookback)
| extend AppName = AppDisplayName, SignInType = "nonInteractive"),
(AADServicePrincipalSignInLogs
| where TimeGenerated > ago(lookback)
| extend AppName = ServicePrincipalName, SignInType = "servicePrincipal")
| mv-expand Detail = parse_json(AuthenticationProcessingDetails)
| where tostring(Detail.key) == "Azure AD App Authentication Library"
| extend Library = tostring(Detail.value)
| where Library has "ADAL"
| summarize SignIns = count(), Users = dcountif(UserPrincipalName, isnotempty(UserPrincipalName)), LastSeen = max(TimeGenerated),
SignInTypes = make_set(SignInType), Libraries = make_set(Library, 10)
by AppId, AppName, AppOwnerTenantId
| extend Owner = case(
AppOwnerTenantId in ("f8cdef31-a31e-4b4a-93e4-5f571e91255a", "72f988bf-86f1-41af-91ab-2d7cd011db47"), "Microsoft",
AppOwnerTenantId == myTenantId, "Own tenant",
isempty(AppOwnerTenantId), "Unknown",
"Other tenant")
| order by SignIns desc
Graph PowerShell zonder Log Analytics
Connect-MgGraph -Scopes "AuditLog.Read.All"
# authenticationProcessingDetails is only on the beta signIn resource (Microsoft.Graph.Beta.Reports)
$since = (Get-Date).ToUniversalTime().AddDays(-7).ToString("yyyy-MM-ddTHH:mm:ssZ", [cultureinfo]::InvariantCulture)
$adal = foreach ($type in 'interactiveUser', 'nonInteractiveUser', 'servicePrincipal') {
$filter = "createdDateTime ge $since and signInEventTypes/any(t: t eq '$type')"
Get-MgBetaAuditLogSignIn -Filter $filter -All | ForEach-Object {
$lib = ($_.AuthenticationProcessingDetails |
Where-Object Key -eq 'Azure AD App Authentication Library').Value
if ($lib -match 'ADAL') {
[pscustomobject]@{
AppId = $_.AppId
AppName = if ($_.AppDisplayName) { $_.AppDisplayName } else { $_.ServicePrincipalName }
AppOwnerTenantId = $_.AppOwnerTenantId
Library = $lib
SignInType = $type
User = $_.UserPrincipalName
}
}
}
}
$adal | Group-Object AppId | ForEach-Object {
[pscustomobject]@{
AppId = $_.Name
AppName = $_.Group[0].AppName
AppOwnerTenantId = $_.Group[0].AppOwnerTenantId
SignIns = $_.Count
Users = @($_.Group.User | Where-Object { $_ } | Sort-Object -Unique).Count
SignInTypes = ($_.Group.SignInType | Sort-Object -Unique) -join ', '
Libraries = ($_.Group.Library | Sort-Object -Unique) -join '; '
}
} | Sort-Object SignIns -Descending | Format-Table -AutoSize
Zolang de API nog antwoordt, zou ik ook exporteren wat de aanbeveling vandaag weet, zodat je je eigen resultaten ergens tegen kunt leggen. Het ID-formaat komt van de Learn-pagina van de aanbeveling, en List impactedResources vraagt DirectoryRecommendations.Read.All.
Connect-MgGraph -Scopes "DirectoryRecommendations.Read.All"
$tenantId = (Get-MgContext).TenantId
Get-MgBetaDirectoryRecommendationImpactedResource -RecommendationId "${tenantId}_adalToMsalMigration" -All |
Select-Object DisplayName, SubjectId, Status, AddedDateTime,
@{ n = 'Library'; e = { ($_.AdditionalDetails | Where-Object Key -eq 'Library').Value } } |
Export-Csv -Path .\adal-recommendation-export.csv -NoTypeInformation
De resultaten verdelen naar eigenaar
Is Microsoft de eigenaar, dan is er voor jou geen code om te migreren. De ADAL-code zit in een client of tool van Microsoft, en de oplossing is die client bijwerken of vervangen. De kolommen met gebruikers en soorten sign-ins laten zien wie de oude versie nog draait, en de apparaatgegevens in de onderliggende sign-ins laten zien waarop.
Staat de app geregistreerd in je eigen tenant, dan is het een klus voor de eigen ontwikkeling. De eigenaren staan op de app registration onder Owners, en de bibliotheekwaarde vertelt de ontwikkelaars welke migratiegids van toepassing is (ADAL.NET, ADAL.js, Java enzovoort, allemaal gelinkt vanaf de MSAL-migratiepagina). Is er geen actuele eigenaar, dan zijn de gebruikerskolom en de IP-adressen in de sign-ins het beste spoor naar wie de app nog gebruikt.
Hoort de app bij een andere tenant, dan is het een product van een leverancier. Zelf repareren kan niet, maar je kunt de leverancier vragen om een versie op basis van MSAL en een datum, het antwoord vastleggen en bepalen wat er gebeurt als die versie er niet komt, bijvoorbeeld door met assignment required op de enterprise app te beperken wie hem mag gebruiken terwijl je een vervanger zoekt.
Apps met een lege AppOwnerTenantId zou ik eerst op AppId opzoeken onder Enterprise applications, voordat ik ze in een van deze groepen indeel.
Blijven monitoren als de API weg is
Exporteer vóór de 15e de impactedResources-lijst, draai de query of het script over dezelfde periode en zet bij elke app die in een van beide resultaten opduikt een eigenaar en een streefdatum.
Bronnen
- What's new for Microsoft Entra (september 2025: retirement van de ADAL to MSAL Recommendations API)
- Microsoft Entra recommendation: Migrate from ADAL to MSAL
- Get a complete list of apps using ADAL in your tenant (Sign-ins workbook)
- Broncode van het Sign-ins workbook op GitHub (ADAL-queries)
- Migrate applications to the Microsoft Authentication Library (MSAL)
- Microsoft Graph beta: signIn resource type (authenticationProcessingDetails)
- Microsoft Graph beta: List signIns (filter op signInEventTypes, rechten)
- Get-MgBetaAuditLogSignIn
- Microsoft Graph beta: List impactedResources
- Azure Monitor-tabelreferentie: SigninLogs
- Integrate Microsoft Entra logs with Azure Monitor logs (P1 of P2 vereist)
- Microsoft Entra data retention
- Verify first-party Microsoft applications in sign-in reports
- Microsoft Entra blog: Migrate ADAL apps to MSAL with enhanced insights (juli 2024)