Udostępnij za pośrednictwem


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:

  1. tworzenie dzierżawy usługi Azure Active Directory B2C.
  2. Zarejestruj aplikację mobilną w dzierżawie usługi Azure Active Directory B2C.
  3. Utwórz zasady tworzenia konta i logowania oraz nie pamiętam przepływów użytkowników haseł.
  4. 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/ identyfikatorcontoso20190410tenant.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:

Nazwa dzierżawy w widoku filtru katalogu i subskrypcji platformy Azure

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:

Identyfikator aplikacji w widoku właściwości aplikacji platformy Azure

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:

Niestandardowy identyfikator URI przekierowania w widoku właściwości aplikacji platformy Azure

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:

Dwa skonfigurowane zasady w widoku Przepływy użytkownika platformy Azure (zasady)

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 UIParenti 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 AcquireTokenAsyncelementu , 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: