Uwierzytelnianie użytkowników za pomocą usługi Azure Active Directory B2C
Usługa Azure Active Directory B2C zapewnia zarządzanie tożsamościami w chmurze dla aplikacji internetowych i mobilnych przeznaczonych dla konsumentów. W tym artykule pokazano, jak używać usługi Azure Active Directory B2C do integracji zarządzania tożsamościami z aplikacją mobilną z biblioteką Microsoft Authentication Library.
Omówienie
Azure Active Directory B2C (ADB2C) to usługa zarządzania tożsamościami dla aplikacji przeznaczonych dla konsumentów. Umożliwia użytkownikom logowanie się do aplikacji przy użyciu istniejących kont społecznościowych lub niestandardowych poświadczeń, takich jak adres e-mail lub nazwa użytkownika i hasło. Konta poświadczeń niestandardowych są nazywane kontami lokalnymi .
Proces integrowania usługi zarządzania tożsamościami usługi Azure Active Directory B2C z aplikacją mobilną jest następujący:
- tworzenie dzierżawy usługi Azure Active Directory B2C.
- Zarejestruj aplikację mobilną w dzierżawie usługi Azure Active Directory B2C.
- Utwórz zasady tworzenia konta i logowania oraz nie pamiętam przepływów użytkowników haseł.
- Użyj biblioteki Microsoft Authentication Library (MSAL), aby uruchomić przepływ pracy uwierzytelniania z dzierżawą usługi Azure Active Directory B2C.
Uwaga
Jeśli nie masz subskrypcji platformy Azure, przed rozpoczęciem utwórz bezpłatne konto.
Usługa Azure Active Directory B2C obsługuje wielu dostawców tożsamości, takich jak Microsoft, GitHub, Facebook, Twitter i inne. Aby uzyskać więcej informacji na temat możliwości usługi Azure Active Directory B2C, zobacz Dokumentację usługi Azure Active Directory B2C.
Biblioteka uwierzytelniania firmy Microsoft obsługuje wiele architektur i platform aplikacji. Aby uzyskać informacje o możliwościach biblioteki MSAL, zobacz Biblioteka uwierzytelniania firmy Microsoft w witrynie GitHub.
Konfigurowanie dzierżawy usługi Azure Active Directory B2C
Aby uruchomić przykładowy projekt, musisz utworzyć dzierżawę usługi Azure Active Directory B2C. Aby uzyskać więcej informacji, zobacz Tworzenie dzierżawy usługi Azure Active Directory B2C w witrynie Azure Portal.
Po utworzeniu dzierżawy będzie potrzebna nazwa dzierżawy i identyfikator dzierżawy, aby skonfigurować aplikację mobilną. Identyfikator dzierżawy i nazwa są definiowane przez domenę wygenerowaną podczas tworzenia adresu URL dzierżawy. Jeśli wygenerowany adres URL dzierżawy to https://contoso20190410tenant.onmicrosoft.com/
identyfikator contoso20190410tenant.onmicrosoft.com
dzierżawy, a nazwa dzierżawy to contoso20190410tenant
. Znajdź domenę dzierżawy w witrynie Azure Portal, klikając filtr katalogu i subskrypcji w górnym menu. Poniższy zrzut ekranu przedstawia przycisk filtru katalogów i subskrypcji platformy Azure oraz domenę dzierżawy:
W przykładowym projekcie zmodyfikuj plik Constants.cs , aby ustawić tenantName
pola i tenantId
. Poniższy kod pokazuje, jak te wartości należy ustawić, jeśli domena dzierżawy to https://contoso20190410tenant.onmicrosoft.com/
, zastąp te wartości wartościami z portalu:
public static class Constants
{
static readonly string tenantName = "contoso20190410tenant";
static readonly string tenantId = "contoso20190410tenant.onmicrosoft.com";
...
}
Rejestrowanie aplikacji mobilnej w usłudze Azure Active Directory B2C
Aby można było połączyć i uwierzytelnić użytkowników, aplikacja mobilna musi zostać zarejestrowana w dzierżawie. Proces rejestracji przypisuje unikatowy identyfikator aplikacji do aplikacji i adres URL przekierowania, który kieruje odpowiedzi z powrotem do aplikacji po uwierzytelnieniu. Aby uzyskać więcej informacji, zobacz Azure Active Directory B2C: Rejestrowanie aplikacji. Musisz znać identyfikator aplikacji przypisany do aplikacji, który znajduje się na liście po nazwie aplikacji w widoku właściwości. Poniższy zrzut ekranu przedstawia miejsce znalezienia identyfikatora aplikacji:
Biblioteka uwierzytelniania firmy Microsoft oczekuje , że adres URL przekierowania aplikacji będzie prefiksem Identyfikator aplikacji z tekstem "msal", a następnie punkt końcowy o nazwie "auth". Jeśli identyfikator aplikacji to "1234abcd", pełny adres URL powinien mieć wartość msal1234abcd://auth
. Upewnij się, że aplikacja włączyła ustawienie natywnego klienta i utwórz niestandardowy identyfikator URI przekierowania przy użyciu identyfikatora aplikacji, jak pokazano na poniższym zrzucie ekranu:
Adres URL będzie używany później zarówno w ApplicationManifest.xml systemu Android, jak i w pliku Info.plist systemu iOS.
W przykładowym projekcie zmodyfikuj plik Constants.cs, aby ustawić clientId
pole na identyfikator aplikacji. Poniższy kod pokazuje, jak tę wartość należy ustawić, jeśli identyfikator aplikacji to 1234abcd
:
public static class Constants
{
static readonly string tenantName = "contoso20190410tenant";
static readonly string tenantId = "contoso20190410tenant.onmicrosoft.com";
static readonly string clientId = "1234abcd";
...
}
Tworzenie zasad rejestracji i logowania oraz zapomniane zasady haseł
Zasady to środowisko, przez które użytkownicy przechodzą do wykonania zadania, takiego jak tworzenie konta lub resetowanie hasła. Zasady określają również zawartość tokenów odbieranych przez aplikację po powrocie użytkownika ze środowiska. Należy skonfigurować zasady zarówno dla rejestracji konta, jak i logowania oraz resetowania hasła. Platforma Azure ma wbudowane zasady, które upraszczają tworzenie typowych zasad. Aby uzyskać więcej informacji, zobacz Azure Active Directory B2C: wbudowane zasady.
Po zakończeniu konfigurowania zasad w widoku Przepływy użytkownika (zasady) w witrynie Azure Portal powinny znajdować się dwie zasady. Poniższy zrzut ekranu przedstawia dwie skonfigurowane zasady w witrynie Azure Portal:
W przykładowym projekcie zmodyfikuj plik Constants.cs , aby ustawić policySignin
pola i policyPassword
tak, aby odzwierciedlały nazwy wybrane podczas konfigurowania zasad:
public static class Constants
{
static readonly string tenantName = "contoso20190410tenant";
static readonly string tenantId = "contoso20190410tenant.onmicrosoft.com";
static readonly string clientId = "1234abcd";
static readonly string policySignin = "B2C_1_signupsignin1";
static readonly string policyPassword = "B2C_1_passwordreset";
...
}
Uwierzytelnianie przy użyciu biblioteki Microsoft Authentication Library (MSAL)
Pakiet NuGet biblioteki Microsoft Authentication Library (MSAL) musi zostać dodany do udostępnionego projektu .NET Standard i projektów platformy w rozwiązaniu Xamarin.Forms . Biblioteka MSAL zawiera klasę PublicClientApplicationBuilder
, która konstruuje obiekt przylegający do interfejsu IPublicClientApplication
. Biblioteka MSAL wykorzystuje klauzule With
w celu dostarczenia dodatkowych parametrów do metod konstruktora i uwierzytelniania.
W przykładowym projekcie kod w pliku App.xaml definiuje właściwości statyczne o nazwach AuthenticationClient
i UIParent
i tworzy wystąpienie AuthenticationClient
obiektu w konstruktorze. Klauzula WithIosKeychainSecurityGroup
zawiera nazwę grupy zabezpieczeń dla aplikacji systemu iOS. Klauzula WithB2CAuthority
zawiera domyślny urząd lub zasady, które będą używane do uwierzytelniania użytkowników. Klauzula WithRedirectUri
informuje wystąpienie usługi Azure Notification Hubs, które identyfikator URI przekierowania ma być używany, jeśli określono wiele identyfikatorów URI. W poniższym przykładzie pokazano, jak utworzyć wystąpienie elementu PublicClientApplication
:
public partial class App : Application
{
public static IPublicClientApplication AuthenticationClient { get; private set; }
public static object UIParent { get; set; } = null;
public App()
{
InitializeComponent();
AuthenticationClient = PublicClientApplicationBuilder.Create(Constants.ClientId)
.WithIosKeychainSecurityGroup(Constants.IosKeychainSecurityGroups)
.WithB2CAuthority(Constants.AuthoritySignin)
.WithRedirectUri($"msal{Constants.ClientId}://auth")
.Build();
MainPage = new NavigationPage(new LoginPage());
}
...
Uwaga
Jeśli wystąpienie usługi Azure Notification Hubs ma zdefiniowany tylko jeden identyfikator URI przekierowania, AuthenticationClient
wystąpienie może działać bez określania identyfikatora URI przekierowania z klauzulą WithRedirectUri
. Jednak zawsze należy określić tę wartość w przypadku rozszerzenia konfiguracji platformy Azure w celu obsługi innych klientów lub metod uwierzytelniania.
Procedura OnAppearing
obsługi zdarzeń w kodzie LoginPage.xaml.cs za wywołaniami AcquireTokenSilentAsync
w celu odświeżenia tokenu uwierzytelniania dla użytkowników, którzy wcześniej się zalogowali. Proces uwierzytelniania przekierowuje do LogoutPage
elementu , jeśli zakończy się powodzeniem i nic nie powiedzie się. W poniższym przykładzie przedstawiono dyskretny proces ponownego uwierzytelniania w programie OnAppearing
:
public partial class LoginPage : ContentPage
{
...
protected override async void OnAppearing()
{
try
{
// Look for existing account
IEnumerable<IAccount> accounts = await App.AuthenticationClient.GetAccountsAsync();
AuthenticationResult result = await App.AuthenticationClient
.AcquireTokenSilent(Constants.Scopes, accounts.FirstOrDefault())
.ExecuteAsync();
await Navigation.PushAsync(new LogoutPage(result));
}
catch
{
// Do nothing - the user isn't logged in
}
base.OnAppearing();
}
...
}
Program OnLoginButtonClicked
obsługi zdarzeń (uruchamiany po kliknięciu przycisku Logowania) wywołuje metodę AcquireTokenAsync
. Biblioteka MSAL automatycznie otwiera przeglądarkę urządzeń przenośnych i przechodzi do strony logowania. Adres URL logowania nazywany urzędem jest kombinacją nazwy dzierżawy i zasad zdefiniowanych w pliku Constants.cs. Jeśli użytkownik wybierze opcję zapomnianego hasła, zostanie zwrócony do aplikacji z wyjątkiem, co spowoduje uruchomienie funkcji zapomnianego hasła. W poniższym przykładzie przedstawiono proces uwierzytelniania:
public partial class LoginPage : ContentPage
{
...
async void OnLoginButtonClicked(object sender, EventArgs e)
{
AuthenticationResult result;
try
{
result = await App.AuthenticationClient
.AcquireTokenInteractive(Constants.Scopes)
.WithPrompt(Prompt.SelectAccount)
.WithParentActivityOrWindow(App.UIParent)
.ExecuteAsync();
await Navigation.PushAsync(new LogoutPage(result));
}
catch (MsalException ex)
{
if (ex.Message != null && ex.Message.Contains("AADB2C90118"))
{
result = await OnForgotPassword();
await Navigation.PushAsync(new LogoutPage(result));
}
else if (ex.ErrorCode != "authentication_canceled")
{
await DisplayAlert("An error has occurred", "Exception message: " + ex.Message, "Dismiss");
}
}
}
...
}
Metoda jest podobna OnForgotPassword
do procesu logowania, ale implementuje zasady niestandardowe. OnForgotPassword
używa innego przeciążenia AcquireTokenAsync
elementu , co umożliwia podanie określonego urzędu. W poniższym przykładzie pokazano, jak podać niestandardowy urząd podczas uzyskiwania tokenu:
public partial class LoginPage : ContentPage
{
...
async Task<AuthenticationResult> OnForgotPassword()
{
try
{
return await App.AuthenticationClient
.AcquireTokenInteractive(Constants.Scopes)
.WithPrompt(Prompt.SelectAccount)
.WithParentActivityOrWindow(App.UIParent)
.WithB2CAuthority(Constants.AuthorityPasswordReset)
.ExecuteAsync();
}
catch (MsalException)
{
// Do nothing - ErrorCode will be displayed in OnLoginButtonClicked
return null;
}
}
}
Ostatnim elementem uwierzytelniania jest proces wylogowywanie. Metoda jest wywoływana OnLogoutButtonClicked
, gdy użytkownik naciska przycisk wyloguj. Przechodzi przez wszystkie konta i zapewnia, że tokeny zostały unieważnione. W poniższym przykładzie pokazano implementację wylogowywanie:
public partial class LogoutPage : ContentPage
{
...
async void OnLogoutButtonClicked(object sender, EventArgs e)
{
IEnumerable<IAccount> accounts = await App.AuthenticationClient.GetAccountsAsync();
while (accounts.Any())
{
await App.AuthenticationClient.RemoveAsync(accounts.First());
accounts = await App.AuthenticationClient.GetAccountsAsync();
}
await Navigation.PopAsync();
}
}
iOS
W systemie iOS niestandardowy schemat adresu URL zarejestrowany w usłudze Azure Active Directory B2C musi być zarejestrowany w pliku Info.plist. Biblioteka MSAL oczekuje, że schemat adresów URL będzie zgodny z określonym wzorcem opisanym wcześniej w temacie Rejestrowanie aplikacji mobilnej w usłudze Azure Active Directory B2C. Poniższy zrzut ekranu przedstawia niestandardowy schemat adresów URL w pliku Info.plist.
Biblioteka MSAL wymaga również uprawnień łańcucha kluczy w systemie iOS zarejestrowanych w pliku Entitilements.plist, jak pokazano na poniższym zrzucie ekranu:
Po zakończeniu żądania autoryzacji przez usługę Azure Active Directory B2C nastąpi przekierowanie do zarejestrowanego adresu URL przekierowania. Niestandardowy schemat adresów URL powoduje uruchomienie aplikacji mobilnej w systemie iOS i przekazanie adresu URL jako parametru uruchamiania, gdzie jest ono przetwarzane przez OpenUrl
zastąpienie klasy aplikacji AppDelegate
i zwraca kontrolę nad środowiskiem do biblioteki MSAL. Implementacja jest pokazana OpenUrl
w poniższym przykładzie kodu:
using Microsoft.Identity.Client;
namespace TodoAzure.iOS
{
[Register("AppDelegate")]
public partial class AppDelegate : global::Xamarin.Forms.Platform.iOS.FormsApplicationDelegate
{
...
public override bool OpenUrl(UIApplication app, NSUrl url, NSDictionary options)
{
AuthenticationContinuationHelper.SetAuthenticationContinuationEventArgs(url);
return base.OpenUrl(app, url, options);
}
}
}
Android
W systemie Android niestandardowy schemat adresów URL zarejestrowany w usłudze Azure Active Directory B2C musi być zarejestrowany w AndroidManifest.xml. Biblioteka MSAL oczekuje, że schemat adresów URL będzie zgodny z określonym wzorcem opisanym wcześniej w temacie Rejestrowanie aplikacji mobilnej w usłudze Azure Active Directory B2C. Poniższy przykład przedstawia niestandardowy schemat adresów URL w AndroidManifest.xml.
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="1.0" package="com.xamarin.adb2cauthorization">
<uses-sdk android:minSdkVersion="15" />
<application android:label="ADB2CAuthorization">
<activity android:name="microsoft.identity.client.BrowserTabActivity">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<!-- example -->
<!-- <data android:scheme="msalaaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee" android:host="auth" /> -->
<data android:scheme="INSERT_URI_SCHEME_HERE" android:host="auth" />
</intent-filter>
</activity>"
</application>
</manifest>
Klasa MainActivity
musi zostać zmodyfikowana, aby udostępnić UIParent
obiekt aplikacji podczas wywołania OnCreate
. Gdy usługa Azure Active Directory B2C ukończy żądanie autoryzacji, przekierowuje do zarejestrowanego schematu adresów URL z AndroidManifest.xml. Zarejestrowany schemat identyfikatora URI powoduje, że system Android wywołuje OnActivityResult
metodę przy użyciu adresu URL jako parametru uruchamiania, gdzie jest przetwarzany przez metodę SetAuthenticationContinuationEventArgs
.
public class MainActivity : FormsAppCompatActivity
{
protected override void OnCreate(Bundle bundle)
{
TabLayoutResource = Resource.Layout.Tabbar;
ToolbarResource = Resource.Layout.Toolbar;
base.OnCreate(bundle);
Forms.Init(this, bundle);
LoadApplication(new App());
App.UIParent = this;
}
protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)
{
base.OnActivityResult(requestCode, resultCode, data);
AuthenticationContinuationHelper.SetAuthenticationContinuationEventArgs(requestCode, resultCode, data);
}
}
Platforma uniwersalna systemu Windows
Do korzystania z biblioteki MSAL w platforma uniwersalna systemu Windows nie jest wymagana żadna dodatkowa konfiguracja
Uruchamianie projektu
Uruchom aplikację na urządzeniu wirtualnym lub fizycznym. Naciśnięcie przycisku Zaloguj powinno otworzyć przeglądarkę i przejść do strony, na której można się zalogować lub utworzyć konto. Po zakończeniu procesu logowania powinno nastąpić powrót do strony wylogowywanie aplikacji. Poniższy zrzut ekranu przedstawia ekran logowania użytkownika uruchomiony w systemach Android i iOS: