Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Migrowanie aplikacji z używania biblioteki ADAL do korzystania z biblioteki MSAL zapewnia korzyści związane z zabezpieczeniami i odpornością. W tym artykule opisano różnice między MSAL.NET a biblioteką ADAL.NET. Wszystkie nowe aplikacje powinny używać MSAL.NET i Platforma tożsamości Microsoft, czyli najnowszej generacji bibliotek uwierzytelniania Microsoft. Korzystając z MSAL.NET, uzyskujesz tokeny dla użytkowników logujący się do aplikacji przy użyciu Microsoft Entra ID (kont służbowych), kont Microsoft (osobistych) (MSA) lub Azure AD B2C. Jeśli masz istniejącą aplikację korzystającą z biblioteki ADAL.NET zmigruj ją do MSAL.NET.
Nadal musisz używać biblioteki ADAL.NET jeśli aplikacja musi logować użytkowników z wcześniejszymi wersjami Active Directory Federation Services (ADFS). Aby uzyskać więcej informacji, zobacz Obsługa usług AD FS.
Wymagania wstępne
Zapoznaj się z omówieniem biblioteki MSAL , aby dowiedzieć się więcej na temat biblioteki MSAL.
Differences
| ADAL NET | MSAL NET | |
|---|---|---|
| Pakiety NuGet i przestrzenie nazw | Biblioteka ADAL została zużyta z Microsoft. Pakiet NuGet IdentityModel.Clients.ActiveDirectory. Przestrzeń nazw to Microsoft.IdentityModel.Clients.ActiveDirectory. |
Dodaj Microsoft. Pakiet NuGet Identity.Client i użyj Microsoft.Identity.Client przestrzeni nazw. Jeśli tworzysz poufne aplikacje klienckie, zapoznaj się z Microsoft. Identity.Web. |
| Zakresy i zasoby | Biblioteka ADAL.NET uzyskuje tokeny dla zasobów. | MSAL.NET uzyskuje tokeny dla zakresów. Kilka MSAL.NET AcquireTokenXXX przesłonięć wymaga parametru o nazwie scopes(IEnumerable<string> scopes). Ten parametr to prosta lista ciągów, które deklarują żądane uprawnienia i zasoby. Dobrze znane zakresy to zakresy Microsoft Graph. Dostęp do zasobów w wersji 1.0 można również uzyskać przy użyciu MSAL.NET. |
| Podstawowe klasy | Biblioteka ADAL.NET używała elementu AuthenticationContext jako reprezentacji połączenia z usługą tokenu zabezpieczającego (STS) lub serwerem autoryzacji za pośrednictwem urzędu. | MSAL.NET jest zaprojektowana wokół aplikacji klienckich. Definiuje IPublicClientApplication interfejsy dla publicznych aplikacji klienckich i IConfidentialClientApplication poufnych aplikacji klienckich, a także podstawowy interfejs IClientApplicationBase dla kontraktu wspólnego dla obu typów aplikacji. |
| Pozyskiwanie tokenów | Na klientach publicznych biblioteka ADAL używa biblioteki AcquireTokenAsync i AcquireTokenSilentAsync do wywołań uwierzytelniania. |
W przypadku klientów publicznych biblioteka MSAL używa biblioteki AcquireTokenInteractive i AcquireTokenSilent dla tych samych wywołań uwierzytelniania. Parametry różnią się od parametrów biblioteki ADAL. W aplikacjach klienckich Poufne istnieją metody pozyskiwania tokenów o jawnej nazwie w zależności od scenariusza. Inną różnicą jest to, że w MSAL.NET nie trzeba już przekazywać ClientID aplikacji w każdym wywołaniu AcquireTokenXX. Parametr ClientID jest ustawiany tylko raz podczas kompilowania IPublicClientApplication lub IConfidentialClientApplication. |
| IAccount i IUser | Biblioteka ADAL definiuje pojęcie użytkownika za pośrednictwem interfejsu IUser. Jednak użytkownik jest człowiekiem lub agentem oprogramowania. W związku z tym użytkownik może posiadać co najmniej jedno konto w Platforma tożsamości Microsoft (kilka kont Microsoft Entra, Azure AD B2C, Microsoft konta osobiste). Użytkownik może być również odpowiedzialny za co najmniej jedno konto Platforma tożsamości Microsoft. | MSAL.NET definiuje koncepcję konta (za pośrednictwem interfejsu IAccount). Interfejs IAccount reprezentuje informacje o pojedynczym koncie. Użytkownik może mieć kilka kont w różnych dzierżawach. MSAL.NET zapewnia lepsze informacje w scenariuszach gościa, ponieważ podano informacje o koncie głównym. Więcej informacji na temat różnic między użytkownikami IUser i IAccount można dowiedzieć się więcej. |
| Trwałość pamięci podręcznej | Biblioteka ADAL.NET umożliwia rozszerzenie TokenCache klasy w celu zaimplementowania żądanych funkcji trwałości na platformach bez bezpiecznego magazynu (.NET Framework i .NET core) przy użyciu BeforeAccessmetod i .BeforeWrite Aby uzyskać szczegółowe informacje, zobacz serializacji pamięci podręcznej tokenów w biblioteki ADAL.NET. |
MSAL.NET sprawia, że pamięć podręczna tokenu jest zapieczętowaną klasą, usuwając możliwość jej rozszerzenia. W związku z tym implementacja trwałości pamięci podręcznej tokenu musi być w postaci klasy pomocniczej, która współdziała z zapieczętowaną pamięcią podręczną tokenu. Ta interakcja została opisana w artykule dotyczącym serializacji pamięci podręcznej tokenów w MSAL.NET artykule. Serializacja dla publicznej aplikacji klienckiej (zobacz pamięć podręczną tokenu dla publicznej aplikacji klienckiej) różni się od serializacji dla poufnej aplikacji klienckiej (zobacz pamięć podręczną tokenu dla aplikacji internetowej lub internetowego interfejsu API). |
| Wspólny urząd | Biblioteka ADAL używa usługi Azure AD w wersji 1.0.
https://login.microsoftonline.com/commonurząd w usłudze Azure AD w wersji 1.0 (z której korzysta biblioteka ADAL) umożliwia użytkownikom logowanie się przy użyciu dowolnego konta organizacji Microsoft Entra (służbowego). usługa Azure AD w wersji 1.0 nie zezwala na logowanie się przy użyciu kont osobistych Microsoft. Aby uzyskać więcej informacji, zobacz Walidacja urzędu w biblioteki ADAL.NET. |
Biblioteka MSAL używa usługi Azure AD w wersji 2.0.
https://login.microsoftonline.com/commonurząd w usłudze Azure AD w wersji 2.0 (z której korzysta biblioteka MSAL) umożliwia użytkownikom logowanie się przy użyciu dowolnego konta organizacji Microsoft Entra (służbowego) lub konta osobistego Microsoft. Aby ograniczyć logowanie przy użyciu tylko kont organizacji (konta służbowego) w usłudze MSAL, musisz użyć punktu końcowego https://login.microsoftonline.com/organizations . Aby uzyskać szczegółowe informacje, zobacz parametr w publicznej authorityaplikacji klienckiej. |
Obsługiwane dotacje
Poniżej znajduje się podsumowanie porównujące MSAL.NET i bibliotekę ADAL.NET obsługiwane dotacje zarówno dla publicznych, jak i poufnych aplikacji klienckich.
Publiczne aplikacje klienckie
Na poniższej ilustracji przedstawiono podsumowanie niektórych różnic między biblioteką ADAL.NET a MSAL.NET dla publicznej aplikacji klienckiej.
Poniżej przedstawiono dotacje obsługiwane w bibliotekach ADAL.NET i MSAL.NET dla aplikacji klasycznych i mobilnych.
| Dotacja | MSAL.NET | ADAL.NET |
|---|---|---|
| Interactive | Interaktywne uzyskiwanie tokenów w MSAL.NET | Interakcyjne uwierzytelnianie |
| Zintegrowane uwierzytelnianie systemu Windows | Zintegrowane uwierzytelnianie systemu Windows | Zintegrowane uwierzytelnianie w Windows (Kerberos) |
| Nazwa użytkownika/hasło | Uwierzytelnianie przy użyciu hasła użytkownika | Uzyskiwanie tokenów przy użyciu nazwy użytkownika i hasła |
| Przepływ kodu urządzenia | Przepływ kodu urządzenia | Profil urządzenia dla urządzeń bez przeglądarek internetowych |
Poufne aplikacje klienckie
Na poniższej ilustracji przedstawiono podsumowanie niektórych różnic między biblioteką ADAL.NET a MSAL.NET dla poufnej aplikacji klienckiej.
Oto granty obsługiwane w bibliotekach ADAL.NET, MSAL.NET i Microsoft. Identity.Web dla aplikacji internetowych, internetowych interfejsów API i aplikacji demona.
| Typ aplikacji | Dotacja | MSAL.NET | ADAL.NET |
|---|---|---|---|
| Aplikacja internetowa, internetowy interfejs API, demon | Poświadczenia klienta | Przepływy poświadczeń klienta w MSAL.NET | Przepływy poświadczeń klienta w biblioteki ADAL.NET |
| Internetowe API | W imieniu | W imieniu MSAL.NET | Usługa do obsługi wywołań w imieniu użytkownika za pomocą biblioteki ADAL.NET |
| Aplikacja internetowa | Kod uwierzytelniania | Uzyskiwanie tokenów przy użyciu kodów autoryzacji w aplikacjach internetowych przy użyciu MSAL.NET | Uzyskiwanie tokenów przy użyciu kodów autoryzacji w aplikacjach internetowych za pomocą biblioteki ADAL.NET |
Migrowanie z biblioteki ADAL 2.x z tokenami odświeżania
W biblioteki ADAL.NET v2. X, tokeny odświeżania zostały ujawnione, umożliwiając opracowywanie rozwiązań dotyczących korzystania z tych tokenów przez buforowanie ich i używanie AcquireTokenByRefreshToken metod dostarczonych przez bibliotekę ADAL 2.x.
Niektóre z tych rozwiązań były używane w scenariuszach, takich jak:
- Długotrwałe usługi, które wykonują akcje, w tym odświeżanie pulpitów nawigacyjnych dla użytkowników, gdy użytkownicy nie są już połączeni/ zalogowani do aplikacji.
- Scenariusze WebFarm umożliwiające klientowi przełączenie tokenu odświeżania do usługi internetowej (buforowanie odbywa się po stronie klienta, zaszyfrowany plik cookie, a nie po stronie serwera).
MSAL.NET nie uwidacznia tokenów odświeżania ze względów bezpieczeństwa. Biblioteka MSAL obsługuje odświeżanie tokenów.
Na szczęście MSAL.NET ma interfejs API, który umożliwia migrację poprzednich tokenów odświeżania (uzyskanych za pomocą biblioteki ADAL) do elementu 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);
Ta metoda umożliwia podanie wcześniej używanego tokenu odświeżania wraz z dowolnymi zakresami (zasobami). Token odświeżania zostanie zamieniony na nowy i zapisany w pamięci podręcznej do aplikacji.
Ponieważ ta metoda jest przeznaczona dla scenariuszy, które nie są typowe, nie jest łatwo dostępne bez uprzedniego IConfidentialClientApplication rzutowania go do IByRefreshTokenelementu .
Poniższy fragment kodu przedstawia kod migracji w poufnej aplikacji klienckiej.
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 Pobiera token odświeżania przechowywany w magazynie przez poprzednią wersję aplikacji, która korzystała z biblioteki ADAL 2.x.
GetTokenCacheForSignedInUser deserializuje pamięć podręczną zalogowanego użytkownika (ponieważ poufne aplikacje klienckie powinny mieć jedną pamięć podręczną na użytkownika).
Token dostępu i token identyfikatora są zwracane w AuthenticationResult wartości, gdy nowy token odświeżania jest przechowywany w pamięci podręcznej. Możesz również użyć tej metody w różnych scenariuszach integracji, w których dostępny jest token odświeżania.
Tokeny w wersji 1.0 i 2.0
Istnieją dwie wersje tokenów: tokeny w wersji 1.0 i tokeny w wersji 2.0. Punkt końcowy w wersji 1.0 (używany przez bibliotekę ADAL) emituje tokeny identyfikatorów w wersji 1.0, podczas gdy punkt końcowy w wersji 2.0 (używany przez bibliotekę MSAL) emituje tokeny identyfikatorów w wersji 2.0. Jednak oba punkty końcowe emitują tokeny dostępu wersji tokenu akceptowanego przez internetowy interfejs API. Właściwość manifestu aplikacji internetowego interfejsu API umożliwia deweloperom wybranie, która wersja tokenu jest akceptowana. Zobacz accessTokenAcceptedVersion dokumentację referencyjną manifestu aplikacji .
Aby uzyskać więcej informacji na temat tokenów dostępu w wersji 1.0 i 2.0, zobacz Microsoft Entra tokeny dostępu.
Exceptions
Wymagane wyjątki interakcji
Używanie MSAL.NET przechwytuje MsalUiRequiredException się zgodnie z opisem w artykule AcquireTokenSilent
catch(MsalUiRequiredException exception)
{
try {"try to authenticate interactively"}
}
Aby uzyskać szczegółowe informacje, zobacz Obsługa błędów i wyjątków w MSAL.NET
Biblioteka ADAL.NET miała mniej jawne wyjątki. Na przykład gdy uwierzytelnianie dyskretne nie powiodło się w usłudze ADAL, procedura miała na celu przechwycenie wyjątku i wyszukanie kodu błędu user_interaction_required :
catch(AdalException exception)
{
if (exception.ErrorCode == "user_interaction_required")
{
try
{“try to authenticate interactively”}}
}
}
Aby uzyskać szczegółowe informacje, zobacz zalecany wzorzec uzyskiwania tokenu w publicznych aplikacjach klienckich z biblioteką ADAL.NET.
Pilne działanie
Zachowanie monitu w MSAL.NET jest równoważne zachowaniu monitu w biblioteki ADAL.NET:
| ADAL.NET | MSAL.NET | Description |
|---|---|---|
PromptBehavior.Auto |
NoPrompt |
Microsoft Entra ID wybiera najlepsze zachowanie (logowanie użytkowników w trybie dyskretnym, jeśli są zalogowani przy użyciu tylko jednego konta lub wyświetlanie selektora kont, jeśli są zalogowani przy użyciu kilku kont). |
PromptBehavior.Always |
ForceLogin |
Resetuje pole logowania i wymusza na użytkowniku ponowne wprowadzenie poświadczeń. |
PromptBehavior.RefreshSession |
Consent |
Wymusza, aby użytkownik ponownie wyraził zgodę na wszystkie uprawnienia. |
PromptBehavior.Never |
Never |
Nie używaj; Zamiast tego należy użyć zalecanego wzorca dla publicznych aplikacji klienckich. |
PromptBehavior.SelectAccount |
SelectAccount |
Wyświetla selektor konta i wymusza wybranie konta przez użytkownika. |
Obsługa wyjątków żądań oświadczeń
Czasami podczas uzyskiwania tokenu Microsoft Entra ID zgłasza wyjątek w przypadku, gdy zasób wymaga większej liczby oświadczeń od użytkownika (na przykład uwierzytelniania dwuskładnikowego).
W MSAL.NET wyjątki dotyczące żądań oświadczeń są obsługiwane w następujący sposób:
- Są
Claimsone wyświetlane w obiekcieMsalServiceException. -
WithClaims(String) Istnieje metoda, która może być stosowana do
AcquireTokenXXXkonstruktorów.
Aby uzyskać szczegółowe informacje, zobacz Handling MsalUiRequiredException (Obsługa wyjątku MsalUiRequiredException).
W usłudze ADAL.NET wyjątki dotyczące żądań zostały obsłużone w następujący sposób:
-
AdalClaimChallengeExceptionjest wyjątkiem (wyprowadzanym zAdalServiceExceptionelementu ). ElementClaimsczłonkowski zawiera fragment kodu JSON z oświadczeniami, które są oczekiwane. - Publiczna aplikacja kliencka, która otrzymuje ten wyjątek, musi wywołać
AcquireTokenInteractiveprzesłoń o parametrze oświadczeń. To zastąpienieAcquireTokenInteractivenie powoduje nawet próby trafienia w pamięć podręczną, ponieważ nie jest to konieczne. Przyczyną jest to, że token w pamięci podręcznej nie ma odpowiednich oświadczeń (w przeciwnym razieAdalClaimChallengeExceptionnie zostałby zgłoszony). W związku z tym nie ma potrzeby przyjrzenia się pamięci podręcznej. ElementClaimChallengeExceptionmożna odebrać w interfejsie WebAPI wykonującym funkcję OBO, aleAcquireTokenInteractivenależy go wywołać w publicznej aplikacji klienckiej wywołującej ten internetowy interfejs API.
Aby uzyskać szczegółowe informacje, w tym przykłady, zobacz obsługa wyjątku AdalClaimChallengeException.
Scopes
Biblioteka ADAL używa koncepcji zasobów z ciągiemresourceId, MSAL.NET jednak używa zakresów. Logika używana przez Microsoft Entra ID jest następująca:
- W przypadku punktu końcowego biblioteki ADAL (wersja 1.0) z tokenem dostępu w wersji 1.0 (jedynym możliwym)
aud=resourcejest . - W przypadku punktu końcowego biblioteki MSAL (wersja 2.0) z pytaniem o token dostępu dla zasobu akceptującego tokeny w wersji 2.0,
aud=resource.AppId. - W przypadku punktu końcowego biblioteki MSAL (wersja 2.0) z pytaniem o token dostępu dla zasobu akceptującego token dostępu w wersji 1.0 Microsoft Entra ID analizuje żądanych odbiorców z żądanego zakresu. Jest to wykonywane przez pobranie wszystkiego przed ostatnim ukośnikiem i użycie go jako identyfikatora zasobu. W związku z tym, jeśli
https://database.windows.netoczekuje się grupy odbiorcówhttps://database.windows.net/, musisz zażądać zakresuhttps://database.windows.net//.default(zwróć uwagę na podwójny ukośnik przed znakiem ./default). Jest to zilustrowane przykładami 1 i 2 poniżej.
Przykład 1
Jeśli chcesz uzyskać tokeny dla aplikacji akceptującej tokeny w wersji 1.0 (na przykład microsoft interfejs Graph API, czyli https://graph.microsoft.com), należy utworzyć przez scopes połączenie żądanego identyfikatora zasobu z żądanym uprawnieniem OAuth2 dla tego zasobu.
Aby na przykład uzyskać dostęp do nazwy użytkownika za pośrednictwem internetowego interfejsu API w wersji 1.0, którego identyfikator URI identyfikatora aplikacji to ResourceId, należy użyć:
var scopes = new [] { ResourceId+"/user_impersonation" };
Jeśli chcesz czytać i zapisywać przy użyciu MSAL.NET Microsoft Entra ID przy użyciu interfejs Graph API (https://graph.microsoft.com/), utwórz listę zakresów, takich jak w poniższym fragmencie kodu:
string ResourceId = "https://graph.microsoft.com/";
string[] scopes = { ResourceId + "Directory.Read", ResourceId + "Directory.Write" }
Przykład 2
Jeśli identyfikator resourceId kończy się znakiem "/", podczas zapisywania wartości zakresu musisz mieć dwukrotnie wartość "/". Jeśli na przykład chcesz napisać zakres odpowiadający interfejsowi API Azure Resource Manager (), zażądaj następującego zakresu (https://management.core.windows.net/zwróć uwagę na dwa ukośniki).
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
Dzieje się tak, ponieważ interfejs API Resource Manager oczekuje ukośnika w oświadczeniu odbiorców (aud), a następnie ukośnik oddziela nazwę interfejsu API od zakresu.
Jeśli chcesz uzyskać token dla wszystkich zakresów statycznych aplikacji w wersji 1.0, utwórz listę zakresów, jak pokazano w poniższym fragmencie kodu:
ResourceId = "someAppIDURI";
var scopes = new [] { ResourceId+"/.default" };
W przypadku przepływu poświadczeń klienta zakres do przekazania będzie również miał wartość /.default. Ten zakres informuje o Microsoft Entra ID: "wszystkie uprawnienia na poziomie aplikacji, na które administrator wyraził zgodę w rejestracji aplikacji.
Następne kroki
Migrowanie aplikacji z biblioteki ADAL dobiblioteki MSAL Migrate your ADAL.NET confidential client apps to use MSAL.NET