Migreringsguide för ADAL till MSAL för Android
Den här artikeln belyser ändringar som du behöver göra för att migrera en app som använder Azure Active Directory Authentication Library (ADAL) för att använda Microsoft Authentication Library (MSAL).
Skillnadshöjdpunkter
ADAL fungerar med Azure AD v1.0-slutpunkten. Microsoft Authentication Library (MSAL) fungerar med Microsofts identitetsplattform, som tidigare kallades Azure AD v2.0-slutpunkten. Den Microsofts identitetsplattform skiljer sig från Azure AD v1.0 på så sätt:
Stöder:
Organisationsidentitet (Microsoft Entra-ID)
Icke-organisatoriska identiteter som Outlook.com, Xbox Live och så vidare
(Endast Azure AD B2C) Federerad inloggning med Google, Facebook, X och Amazon
Är standarder kompatibla med:
- OAuth v2.0
- OpenID Connect (OIDC)
Det offentliga MSAL-API:et introducerar viktiga ändringar, inklusive:
- En ny modell för åtkomst till token:
- ADAL ger åtkomst till token via ,
AuthenticationContext
som representerar servern. MSAL ger åtkomst till token via ,PublicClientApplication
som representerar klienten. Klientutvecklare behöver inte skapa en nyPublicClientApplication
instans för varje utfärdare de behöver interagera med. Endast enPublicClientApplication
konfiguration krävs. - Stöd för att begära åtkomsttoken med hjälp av omfång utöver resursidentifierare.
- Stöd för inkrementellt medgivande. Utvecklare kan begära omfång när användaren får åtkomst till fler och fler funktioner i appen, inklusive de som inte ingår under appregistreringen.
- Myndigheterna verifieras inte längre vid körning. I stället deklarerar utvecklaren en lista över "kända myndigheter" under utvecklingen.
- ADAL ger åtkomst till token via ,
- Api-ändringar för token:
- I ADAL
AcquireToken()
gör du först en tyst begäran. Annars görs en interaktiv begäran. Det här beteendet resulterade i att vissa utvecklare bara förlitade sig påAcquireToken
, vilket resulterade i att användaren oväntat tillfrågades om autentiseringsuppgifter ibland. MSAL kräver att utvecklare är avsiktliga när användaren tar emot en användargränssnittsprompt.AcquireTokenSilent
resulterar alltid i en tyst begäran som antingen lyckas eller misslyckas.AcquireToken
resulterar alltid i en begäran som uppmanar användaren via användargränssnittet.
- I ADAL
- MSAL stöder inloggning från antingen en standardwebbläsare eller en inbäddad webbvy:
- Som standard används standardwebbläsaren på enheten. Detta gör att MSAL kan använda autentiseringstillstånd (cookies) som kanske redan finns för ett eller flera inloggade konton. Om det inte finns något autentiseringstillstånd skapas autentiseringstillståndet (cookies) under auktoriseringen via MSAL till förmån för andra webbprogram som ska användas i samma webbläsare.
- Ny undantagsmodell:
- Undantag definierar tydligare vilken typ av fel som inträffade och vad utvecklaren behöver göra för att lösa det.
- MSAL stöder parameterobjekt för
AcquireToken
ochAcquireTokenSilent
anrop. - MSAL stöder deklarativ konfiguration för:
- Klient-ID, omdirigerings-URI.
- Inbäddad kontra standardwebbläsare
- Myndigheterna
- HTTP-inställningar som läs- och anslutningstimeout
Din appregistrering och migrering till MSAL
Du behöver inte ändra din befintliga appregistrering för att använda MSAL. Om du vill dra nytta av inkrementellt/progressivt medgivande kan du behöva granska registreringen för att identifiera de specifika omfång som du vill begära stegvis. Mer information om omfång och inkrementellt medgivande finns här.
I din appregistrering i portalen visas fliken API-behörigheter . Detta ger en lista över API:er och behörigheter (omfång) som appen för närvarande är konfigurerad för att begära åtkomst till. Den visar också en lista över de omfångsnamn som är associerade med varje API-behörighet.
Användarmedgivande
Med ADAL och Azure AD v1.0-slutpunkten beviljades användarens medgivande till resurser som de äger vid första användningen. Med MSAL och Microsofts identitetsplattform kan medgivande begäras stegvis. Inkrementellt medgivande är användbart för behörigheter som en användare kan överväga med hög behörighet, eller kan på annat sätt ifrågasätta om det inte ges en tydlig förklaring av varför behörigheten krävs. I ADAL kan dessa behörigheter ha resulterat i att användaren övergav inloggningen till din app.
Dricks
Använd inkrementellt medgivande för att ge användarna ytterligare kontext om varför din app behöver en behörighet.
Administratörsmedgivande
Organisationsadministratörer kan samtycka till behörigheter som ditt program kräver för alla medlemmar i organisationen. Vissa organisationer tillåter endast administratörer att godkänna program. Administratörsmedgivande kräver att du inkluderar alla API-behörigheter och omfång som används av ditt program i din appregistrering.
Dricks
Även om du kan begära ett omfång med HJÄLP av MSAL för något som inte ingår i appregistreringen rekommenderar vi att du uppdaterar appregistreringen så att den inkluderar alla resurser och omfång som en användare någonsin kan bevilja behörighet till.
Migrera från resurs-ID:t till omfång
Autentisera och begära auktorisering för alla behörigheter vid första användning
Om du för närvarande använder ADAL och inte behöver använda inkrementellt medgivande är det enklaste sättet att börja använda MSAL att göra en acquireToken
begäran med det nya AcquireTokenParameter
objektet och ange resurs-ID-värdet.
Varning
Det går inte att ange både omfång och ett resurs-ID. Om du försöker ange båda resulterar det i en IllegalArgumentException
.
Detta resulterar i samma v1-beteende som du använder. Alla behörigheter som begärs i din appregistrering begärs från användaren under deras första interaktion.
Autentisera och begär endast behörigheter efter behov
Om du vill dra nytta av inkrementellt medgivande skapar du en lista över behörigheter (omfång) som appen använder från appregistreringen och organiserar dem i två listor baserat på:
- Vilka omfång du vill begära under användarens första interaktion med din app under inloggningen.
- De behörigheter som är associerade med en viktig funktion i din app som du också behöver förklara för användaren.
När du har organiserat omfången ordnar du varje lista med vilken resurs (API) du vill begära en token för. Förutom andra omfång som du vill att användaren ska auktorisera samtidigt.
Parameterobjektet som används för att göra din begäran till MSAL stöder:
Scope
: Listan över omfång som du vill begära auktorisering för och ta emot en åtkomsttoken.ExtraScopesToConsent
: En ytterligare lista över omfång som du vill begära auktorisering för när du begär en åtkomsttoken för en annan resurs. Med den här listan med omfång kan du minimera antalet gånger som du behöver begära användarauktorisering. Vilket innebär färre uppmaningar om användarauktorisering eller medgivande.
Migrera från AuthenticationContext till PublicClientApplications
Konstruera PublicClientApplication
När du använder MSAL instansierar du en PublicClientApplication
. Det här objektet modellerar din appidentitet och används för att göra begäranden till en eller flera myndigheter. Med det här objektet konfigurerar du din klientidentitet, omdirigerings-URI, standardutfärdare, om du vill använda enhetswebbläsaren eller den inbäddade webbvyn, loggnivån med mera.
Du kan deklarativt konfigurera det här objektet med JSON, som du antingen anger som en fil eller lagrar som en resurs i din APK.
Även om det här objektet inte är en singleton används Executors
det internt för både interaktiva och tysta begäranden.
Företag till företag
I ADAL kräver varje organisation som du begär åtkomsttoken från en separat instans av AuthenticationContext
. I MSAL är detta inte längre ett krav. Du kan ange från vilken utfärdare du vill begära en token som en del av din tysta eller interaktiva begäran.
Migrera från utfärdarvalidering till kända myndigheter
MSAL har ingen flagga för att aktivera eller inaktivera verifiering av utfärdare. Utfärdarvalidering är en funktion i ADAL och i de tidiga versionerna av MSAL förhindrar det att din kod begär token från en potentiellt skadlig utfärdare. MSAL hämtar nu en lista över myndigheter som är kända för Microsoft och sammanfogar listan med de myndigheter som du har angett i konfigurationen.
Dricks
Om du är en Azure Business to Consumer-användare (B2C) innebär det att du inte längre behöver inaktivera verifiering av utfärdare. Inkludera i stället var och en av de Azure AD B2C-principer som stöds som myndigheter i DIN MSAL-konfiguration.
Om du försöker använda en utfärdare som inte är känd för Microsoft och inte ingår i konfigurationen får du en UnknownAuthorityException
.
Loggning
Nu kan du deklarativt konfigurera loggning som en del av konfigurationen, så här:
"logging": {
"pii_enabled": false,
"log_level": "WARNING",
"logcat_enabled": true
}
Migrera från UserInfo till konto
I ADAL AuthenticationResult
tillhandahåller det ett UserInfo
objekt som används för att hämta information om det autentiserade kontot. Termen "användare", som innebar en mänsklig agent eller programvaruagent, tillämpades på ett sätt som gjorde det svårt att kommunicera att vissa appar stöder en enskild användare (oavsett om det är en mänsklig agent eller programvaruagent) som har flera konton.
Överväg ett bankkonto. Du kan ha fler än ett konto på mer än ett finansinstitut. När du öppnar ett konto utfärdas du (användaren) autentiseringsuppgifter, till exempel ett uttagsautomat kort och PIN-kod, som används för att komma åt ditt saldo, fakturera betalningar och så vidare för varje konto. Dessa autentiseringsuppgifter kan endast användas hos det finansinstitut som utfärdade dem.
I likhet med konton på ett finansinstitut används konton i Microsofts identitetsplattform med hjälp av autentiseringsuppgifter. Dessa autentiseringsuppgifter är antingen registrerade med eller utfärdade av Microsoft. Eller av Microsoft på uppdrag av en organisation.
Om Microsofts identitetsplattform skiljer sig från ett finansinstitut, i den här analogin, är att Microsofts identitetsplattform tillhandahåller ett ramverk som gör det möjligt för en användare att använda ett konto och dess associerade autentiseringsuppgifter för att få åtkomst till resurser som tillhör flera individer och organisationer. Detta är som att kunna använda ett kort utfärdat av en bank, på ännu ett finansinstitut. Detta fungerar eftersom alla organisationer i fråga använder Microsofts identitetsplattform, vilket gör att ett konto kan användas i flera organisationer. Här är ett exempel:
Sam arbetar för Contoso.com men hanterar virtuella Azure-datorer som tillhör Fabrikam.com. För att Sam ska kunna hantera Fabrikams virtuella datorer måste han ha behörighet att komma åt dem. Den här åtkomsten kan beviljas genom att lägga till Sams konto i Fabrikam.com och ge hans konto en roll som gör att han kan arbeta med de virtuella datorerna. Detta skulle göras med Azure Portal.
Om sams Contoso.com-konto läggs till som medlem i Fabrikam.com skapas en ny post i Fabrikam.com Microsoft Entra-ID för Sam. Sams post i Microsoft Entra-ID kallas för ett användarobjekt. I det här fallet pekar användarobjektet tillbaka på Sams användarobjekt i Contoso.com. Sams Fabrikam-användarobjekt är den lokala representationen av Sam och används för att lagra information om kontot som är associerat med Sam i kontexten för Fabrikam.com. I Contoso.com är Sams titel Senior DevOps Consultant. I Fabrikam är Sams titel Contractor-Virtual Machines. I Contoso.com är Sam inte ansvarig eller auktoriserad för att hantera virtuella datorer. I Fabrikam.com är det hans enda jobbfunktion. Ändå har Sam fortfarande bara en uppsättning autentiseringsuppgifter att hålla reda på, vilket är autentiseringsuppgifterna som utfärdas av Contoso.com.
När ett lyckat acquireToken
anrop har gjorts visas en referens till ett IAccount
objekt som kan användas i senare acquireTokenSilent
begäranden.
IMultiTenantAccount
Om du har en app som har åtkomst till anspråk om ett konto från var och en av de klienter där kontot representeras kan du omvandla IAccount
objekt till IMultiTenantAccount
. Det här gränssnittet innehåller en karta över ITenantProfiles
, som styrs av klientorganisations-ID, som gör att du kan komma åt anspråken som tillhör kontot i var och en av de klienter som du har begärt en token från i förhållande till det aktuella kontot.
Anspråken i roten av IAccount
och IMultiTenantAccount
innehåller alltid anspråken från hemklientorganisationen. Om du ännu inte har gjort en begäran om en token i hemklientorganisationen är den här samlingen tom.
Andra förändringar
Använda den nya AuthenticationCallback
// Existing ADAL Interface
public interface AuthenticationCallback<T> {
/**
* This will have the token info.
*
* @param result returns <T>
*/
void onSuccess(T result);
/**
* Sends error information. This can be user related error or server error.
* Cancellation error is AuthenticationCancelError.
*
* @param exc return {@link Exception}
*/
void onError(Exception exc);
}
// New Interface for Interactive AcquireToken
public interface AuthenticationCallback {
/**
* Authentication finishes successfully.
*
* @param authenticationResult {@link IAuthenticationResult} that contains the success response.
*/
void onSuccess(final IAuthenticationResult authenticationResult);
/**
* Error occurs during the authentication.
*
* @param exception The {@link MsalException} contains the error code, error message and cause if applicable. The exception
* returned in the callback could be {@link MsalClientException}, {@link MsalServiceException}
*/
void onError(final MsalException exception);
/**
* Will be called if user cancels the flow.
*/
void onCancel();
}
// New Interface for Silent AcquireToken
public interface SilentAuthenticationCallback {
/**
* Authentication finishes successfully.
*
* @param authenticationResult {@link IAuthenticationResult} that contains the success response.
*/
void onSuccess(final IAuthenticationResult authenticationResult);
/**
* Error occurs during the authentication.
*
* @param exception The {@link MsalException} contains the error code, error message and cause if applicable. The exception
* returned in the callback could be {@link MsalClientException}, {@link MsalServiceException} or
* {@link MsalUiRequiredException}.
*/
void onError(final MsalException exception);
}
Migrera till de nya undantagen
I ADAL finns det en typ av undantag, AuthenticationException
, som innehåller en metod för att ADALError
hämta uppräkningsvärdet.
I MSAL finns det en hierarki med undantag och var och en har en egen uppsättning associerade specifika felkoder.
Undantag | beskrivning |
---|---|
MsalArgumentException |
Utlöses om ett eller flera indataargument är ogiltiga. |
MsalClientException |
Utlöses om felet är klientsidan. |
MsalDeclinedScopeException |
Utlöses om en eller flera begärda omfång avvisades av servern. |
MsalException |
Standardkontrollerat undantag som genereras av MSAL. |
MsalIntuneAppProtectionPolicyRequiredException |
Utlöses om resursen har MAMCA-skyddsprincip aktiverad. |
MsalServiceException |
Utlöses om felet är serversidan. |
MsalUiRequiredException |
Utlöses om token inte kan uppdateras tyst. |
MsalUserCancelException |
Utlöses om användaren avbröt autentiseringsflödet. |
ADALError till MsalException-översättning
Om du får dessa fel i ADAL... | ... fånga dessa MSAL-undantag: |
---|---|
Ingen motsvarande ADALError | MsalArgumentException |
|
MsalClientException |
Ingen motsvarande ADALError | MsalDeclinedScopeException |
|
MsalException |
Ingen motsvarande ADALError | MsalIntuneAppProtectionPolicyRequiredException |
|
MsalServiceException |
|
MsalUiRequiredException |
Ingen motsvarande ADALError | MsalUserCancelException |
ADAL-loggning till MSAL-loggning
// Legacy Interface
StringBuilder logs = new StringBuilder();
Logger.getInstance().setExternalLogger(new ILogger() {
@Override
public void Log(String tag, String message, String additionalMessage, LogLevel logLevel, ADALError errorCode) {
logs.append(message).append('\n');
}
});
// New interface
StringBuilder logs = new StringBuilder();
Logger.getInstance().setExternalLogger(new ILoggerCallback() {
@Override
public void log(String tag, Logger.LogLevel logLevel, String message, boolean containsPII) {
logs.append(message).append('\n');
}
});
// New Log Levels:
public enum LogLevel
{
/**
* Error level logging.
*/
ERROR,
/**
* Warning level logging.
*/
WARNING,
/**
* Info level logging.
*/
INFO,
/**
* Verbose level logging.
*/
VERBOSE
}