Průvodce migrací ADAL na MSAL pro Android
Tento článek popisuje změny, které je potřeba provést při migraci aplikace, která používá knihovnu ADAL (Azure Active Directory Authentication Library) k používání knihovny Microsoft Authentication Library (MSAL).
Zvýraznění rozdílů
ADAL funguje s koncovým bodem Azure AD v1.0. Knihovna Microsoft Authentication Library (MSAL) funguje s platformou Microsoft Identity Platform, která se dříve označuje jako koncový bod Azure AD v2.0. Platforma Microsoft Identity Platform se liší od Azure AD verze 1.0 v tom, že:
Podpora:
Organizační identita (Microsoft Entra ID)
Identity mimo organizaci, jako jsou Outlook.com, Xbox Live atd.
(Jenom Azure AD B2C) Federované přihlášení pomocí Google, Facebooku, X a Amazonu
Jsou standardy kompatibilní s:
- OAuth v2.0
- OpenID Connect (OIDC)
Veřejné rozhraní API MSAL zavádí důležité změny, mezi které patří:
- Nový model pro přístup k tokenům:
- ADAL poskytuje přístup k tokenům prostřednictvím
AuthenticationContext
, který představuje server. MSAL poskytuje přístup k tokenům prostřednictvím objektuPublicClientApplication
, který představuje klienta. Vývojáři klientů nemusí vytvářet novouPublicClientApplication
instanci pro každou autoritu, se kterou potřebují pracovat. Vyžaduje se pouze jednaPublicClientApplication
konfigurace. - Podpora vyžádání přístupových tokenů pomocí oborů kromě identifikátorů prostředků
- Podpora přírůstkového souhlasu Vývojáři můžou požádat o obory, protože uživatel přistupuje k více a více funkcím v aplikaci, včetně těch, které nejsou zahrnuté během registrace aplikace.
- Autority se už neověřují za běhu. Vývojář místo toho deklaruje seznam "známých autorit" během vývoje.
- ADAL poskytuje přístup k tokenům prostřednictvím
- Změny rozhraní API tokenu:
- V ADAL
AcquireToken()
nejprve vytvoří tichý požadavek. Pokud se to nepodaří, vytvoří interaktivní požadavek. Toto chování vedlo k tomu, že někteří vývojáři spoléhají jenom naAcquireToken
to, že se uživatel neočekávaně vyzve k zadání přihlašovacích údajů. MSAL vyžaduje, aby vývojáři měli úmyslně, když uživatel obdrží výzvu k uživatelskému rozhraní.AcquireTokenSilent
Výsledkem vždy je bezobslužný požadavek, který buď proběhne úspěšně, nebo selže.AcquireToken
výsledkem vždy je požadavek, který uživatele vyzve prostřednictvím uživatelského rozhraní.
- V ADAL
- KNIHOVNA MSAL podporuje přihlášení z výchozího prohlížeče nebo integrovaného webového zobrazení:
- Ve výchozím nastavení se používá výchozí prohlížeč na zařízení. To umožňuje službě MSAL používat stav ověřování (soubory cookie), které již mohou být k dispozici pro jeden nebo více přihlášených účtů. Pokud není k dispozici žádný stav ověřování, ověření během autorizace prostřednictvím knihovny MSAL způsobí vytvoření stavu ověřování (souborů cookie) pro výhodu jiných webových aplikací, které budou použity ve stejném prohlížeči.
- Nový model výjimek:
- Výjimky jasněji definují typ chyby, ke které došlo, a to, co vývojář potřebuje k jeho vyřešení.
- MSAL podporuje objekty parametrů pro
AcquireToken
aAcquireTokenSilent
volání. - MSAL podporuje deklarativní konfiguraci pro:
- ID klienta, identifikátor URI přesměrování.
- Vložený a výchozí prohlížeč
- Úřady
- Nastavení HTTP, jako je vypršení časového limitu čtení a připojení
Registrace a migrace vaší aplikace do MSAL
Abyste mohli používat KNIHOVNU MSAL, nemusíte měnit stávající registraci aplikace. Pokud chcete využít výhod přírůstkového nebo progresivního souhlasu, možná budete muset zkontrolovat registraci a zjistit konkrétní rozsahy, které chcete vyžádat přírůstkově. Další informace o oborech a přírůstkových souhlasech následuje.
V registraci aplikace na portálu se zobrazí karta oprávnění rozhraní API. Zobrazí se seznam rozhraní API a oprávnění (oborů), ke kterým je vaše aplikace aktuálně nakonfigurovaná tak, aby požadovala přístup. Zobrazuje také seznam názvů oborů přidružených k jednotlivým oprávněním rozhraní API.
Souhlas uživatele
S ADAL a koncovým bodem Azure AD v1.0 uživatel souhlasil s prostředky, které vlastní, byl udělen při prvním použití. S MSAL a platformou Microsoft Identity Platform je možné vyžádat souhlas přírůstkově. Přírůstkový souhlas je užitečný pro oprávnění, která uživatel může zvážit vysoké oprávnění, nebo se může jinak dotazovat, pokud není k dispozici jasné vysvětlení, proč je oprávnění požadováno. V ADAL mohla tato oprávnění vést k tomu, že uživatel opustil přihlašování k vaší aplikaci.
Tip
Použití přírůstkového souhlasu k poskytnutí dalšího kontextu uživatelům o tom, proč vaše aplikace potřebuje oprávnění.
Souhlas správce
Správci organizace můžou udělit souhlas s oprávněními, která vaše aplikace vyžaduje jménem všech členů organizace. Některé organizace umožňují jenom správcům udělit souhlas s aplikacemi. Souhlas správce vyžaduje, abyste do registrace aplikace zahrnuli všechna oprávnění a obory rozhraní API, které vaše aplikace používá.
Tip
I když můžete požádat o rozsah pomocí knihovny MSAL pro něco, co není součástí registrace vaší aplikace, doporučujeme aktualizovat registraci aplikace tak, aby zahrnovala všechny prostředky a obory, kterým by mohl uživatel kdykoli udělit oprávnění.
Migrace z ID prostředků na obory
Ověření a vyžádání autorizace pro všechna oprávnění při prvním použití
Pokud aktuálně používáte knihovnu ADAL a nepotřebujete používat přírůstkový souhlas, nejjednodušší způsob, jak začít používat knihovnu MSAL, je vytvořit acquireToken
požadavek pomocí nového AcquireTokenParameter
objektu a nastavit hodnotu ID prostředku.
Upozornění
Obory i ID prostředku není možné nastavit. Výsledkem pokusu o nastavení obou bude hodnota IllegalArgumentException
.
Výsledkem bude stejné chování v1, které jste použili. Během první interakce se od uživatele požadují všechna oprávnění požadovaná v registraci aplikace.
Ověřování a vyžádání oprávnění pouze podle potřeby
Pokud chcete využít výhod přírůstkového souhlasu, vytvořte seznam oprávnění (rozsahů), které vaše aplikace používá z registrace aplikace, a uspořádejte je do dvou seznamů na základě:
- Jaké obory chcete během první interakce uživatele s vaší aplikací během přihlašování požadovat.
- Oprávnění přidružená k důležité funkci aplikace, která budete také muset uživateli vysvětlit.
Jakmile uspořádáte obory, uspořádejte každý seznam podle prostředku (API), pro který chcete požádat o token. Stejně jako všechny ostatní obory, které chcete uživateli autorizovat současně.
Objekt parametrů použitý k provedení požadavku na knihovnu MSAL podporuje:
Scope
: Seznam oborů, pro které chcete požádat o autorizaci a přijetí přístupového tokenu.ExtraScopesToConsent
: Další seznam oborů, pro které chcete požádat o autorizaci, zatímco žádáte o přístupový token pro jiný prostředek. Tento seznam oborů vám umožní minimalizovat počet, kolikrát potřebujete požádat o autorizaci uživatele. To znamená menší počet výzev k autorizaci nebo vyjádření souhlasu uživatele.
Migrace z AuthenticationContext na PublicClientApplications
Vytváření PublicClientApplication
Při použití MSAL vytvoříte instanci PublicClientApplication
. Tento objekt modeluje identitu aplikace a používá se k odesílání požadavků na jednu nebo více autorit. Pomocí tohoto objektu nakonfigurujete identitu klienta, identifikátor URI přesměrování, výchozí autoritu, jestli se má používat prohlížeč zařízení a vložené webové zobrazení, úroveň protokolu a další.
Tento objekt můžete deklarativním způsobem nakonfigurovat pomocí formátu JSON, který buď zadáte jako soubor, nebo ho uložíte jako prostředek v souboru APK.
I když tento objekt není singleton, interně používá sdílené Executors
pro interaktivní i tiché požadavky.
Business to Business
V ADAL vyžaduje každá organizace, od které požadujete přístupové tokeny, samostatnou instanci AuthenticationContext
. V MSAL už to není požadavek. Jako součást tichého nebo interaktivního požadavku můžete zadat autoritu, ze které chcete požádat o token.
Migrace z ověření autority na známé autority
Knihovna MSAL nemá příznak pro povolení nebo zakázání ověření autority. Ověření autority je funkce knihovny ADAL a v dřívějších verzích knihovny MSAL, která brání kódu v vyžádání tokenů z potenciálně škodlivé autority. Služba MSAL teď načte seznam autorit známých microsoftem a tento seznam sloučí s autoritami, které jste zadali ve své konfiguraci.
Tip
Pokud jste uživatel Azure Business to Consumer (B2C), znamená to, že už nemusíte ověřování autority zakázat. Místo toho do konfigurace MSAL zahrňte všechny podporované zásady Azure AD B2C jako autority.
Pokud se pokusíte použít autoritu, která není microsoftu známá a není součástí vaší konfigurace, získáte .UnknownAuthorityException
Protokolování
Protokolování teď můžete deklarativní konfigurovat jako součást konfigurace, například takto:
"logging": {
"pii_enabled": false,
"log_level": "WARNING",
"logcat_enabled": true
}
Migrace z UserInfo na účet
V ADAL AuthenticationResult
poskytuje UserInfo
objekt použitý k načtení informací o ověřeném účtu. Pojem "uživatel", který znamenal člověka nebo softwarového agenta, byl použit způsobem, který ztěžoval komunikaci s tím, že některé aplikace podporují jednoho uživatele (bez ohledu na to, jestli je to člověk nebo softwarový agent), který má více účtů.
Zvažte bankovní účet. Možná máte více účtů ve více než jedné finanční instituci. Při otevření účtu se vám (uživateli) vystaví přihlašovací údaje, jako je platební karta a PIN kód, které se použijí pro přístup k vašemu zůstatku, platbám na faktuře atd. pro každý účet. Tyto přihlašovací údaje lze použít pouze u finanční instituce, která je vydala.
Podobně jako účty v finanční instituci se k účtům na platformě Microsoft Identity Platform přistupuje pomocí přihlašovacích údajů. Tyto přihlašovací údaje jsou buď zaregistrované, nebo vydané společností Microsoft. Nebo microsoft jménem organizace.
Pokud se platforma Microsoft Identity Platform liší od finanční instituce, v této analogii představuje platforma Microsoft Identity Platform architekturu, která uživateli umožňuje používat jeden účet a jeho přidružené přihlašovací údaje pro přístup k prostředkům, které patří více jednotlivcům a organizacím. Je to jako schopnost používat kartu vystavenou jednou bankou, a to ještě v jiné finanční instituci. To funguje, protože všechny dotčené organizace používají platformu Microsoft Identity Platform, která umožňuje používat jeden účet napříč více organizacemi. Tady je příklad:
Sam pracuje pro Contoso.com, ale spravuje virtuální počítače Azure, které patří do Fabrikam.com. Aby Sam mohl spravovat virtuální počítače společnosti Fabrikam, musí mít oprávnění k přístupu k nim. Tento přístup můžete udělit přidáním účtu Sama do Fabrikam.com a udělením jeho účtu roli, která mu umožní pracovat s virtuálními počítači. To by se provedlo pomocí webu Azure Portal.
Přidání Contoso.com účtu Sam jako člena Fabrikam.com by vedlo k vytvoření nového záznamu v Fabrikam.com Microsoft Entra ID pro Sam. Záznam Samu v Microsoft Entra ID se označuje jako objekt uživatele. V tomto případě by tento objekt uživatele odkazoval zpět na objekt uživatele Sam v Contoso.com. Uživatelský objekt Sam Fabrikam je místní reprezentace Samu a použil by se k ukládání informací o účtu přidruženém k Samu v kontextu Fabrikam.com. V Contoso.com se Sam jmenuje Senior DevOps Consultant. Ve společnosti Fabrikam má Sam název Contractor-Virtual Machines. V Contoso.com sam není zodpovědný ani autorizovaný ke správě virtuálních počítačů. V Fabrikam.com je to jeho jediná funkce práce. Sam ale stále má jenom jednu sadu přihlašovacích údajů, které umožňují sledovat, což jsou přihlašovací údaje vydané Contoso.com.
Po úspěšném acquireToken
volání se zobrazí odkaz na IAccount
objekt, který lze použít v pozdějších acquireTokenSilent
požadavcích.
IMultiTenantAccount
Pokud máte aplikaci, která přistupuje k deklarací identity účtu z každého tenanta, ve kterém je účet reprezentován, můžete přetypovat IAccount
objekty na IMultiTenantAccount
. Toto rozhraní poskytuje mapu ITenantProfiles
, klíč klíč podle ID tenanta, která umožňuje přístup k deklaracím, které patří k účtu v každém tenantovi, od kterého jste požadovali token vzhledem k aktuálnímu účtu.
Deklarace identity v kořenovém adresáři IAccount
a IMultiTenantAccount
vždy obsahují deklarace identity z domovského tenanta. Pokud jste ještě neprošli žádost o token v rámci domovského tenanta, bude tato kolekce prázdná.
Další změny
Použití nového AuthenticationCallbacku
// 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);
}
Migrace na nové výjimky
V ADAL existuje jeden typ výjimky, AuthenticationException
která zahrnuje metodu pro načtení hodnoty výčtu ADALError
.
V knihovně MSAL existuje hierarchie výjimek a každá má vlastní sadu přidružených konkrétních kódů chyb.
Výjimka | Popis |
---|---|
MsalArgumentException |
Vyvolá se, pokud jeden nebo více argumentů vstupů není platný. |
MsalClientException |
Vyvolá se, pokud je chyba na straně klienta. |
MsalDeclinedScopeException |
Vyvolá se, pokud server odmítl jeden nebo více požadovaných oborů. |
MsalException |
Výchozí zaškrtnutá výjimka vyvolaná knihovnou MSAL |
MsalIntuneAppProtectionPolicyRequiredException |
Vyvolá se, pokud má prostředek povolenou zásadu ochrany MAMCA. |
MsalServiceException |
Vyvolá se, pokud je chyba na straně serveru. |
MsalUiRequiredException |
Vyvolá se, pokud se token nedá bezobslužně aktualizovat. |
MsalUserCancelException |
Vyvolá se, pokud uživatel zrušil tok ověřování. |
ADALError to MsalException translation
Pokud tyto chyby zachytáváte v ADAL... | ... zachyťte tyto výjimky MSAL: |
---|---|
Žádná ekvivalentní chyba ADAL | MsalArgumentException |
|
MsalClientException |
Žádná ekvivalentní chyba ADAL | MsalDeclinedScopeException |
|
MsalException |
Žádná ekvivalentní chyba ADAL | MsalIntuneAppProtectionPolicyRequiredException |
|
MsalServiceException |
|
MsalUiRequiredException |
Žádná ekvivalentní chyba ADAL | MsalUserCancelException |
Protokolování ADAL do protokolování MSAL
// 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
}