Sdílet prostřednictvím


Ověřování uživatelů pomocí Azure Active Directory B2C

Azure Active Directory B2C poskytuje správu cloudových identit pro webové a mobilní aplikace přístupné uživatelům. Tento článek ukazuje, jak pomocí Azure Active Directory B2C integrovat správu identit do mobilní aplikace s knihovnou Microsoft Authentication Library.

Přehled

Azure Active Directory B2C (ADB2C) je služba správy identit pro aplikace určené pro uživatele. Umožňuje uživatelům přihlásit se k aplikaci pomocí stávajících sociálních účtů nebo vlastních přihlašovacích údajů, jako je e-mail nebo uživatelské jméno a heslo. Vlastní účty přihlašovacích údajů se označují jako místní účty.

Proces integrace služby Azure Active Directory B2C pro správu identit do mobilní aplikace je následující:

  1. Vytvořte tenanta Azure Active Directory B2C.
  2. Zaregistrujte mobilní aplikaci v tenantovi Azure Active Directory B2C.
  3. Vytvořte zásady pro registraci a přihlášení a zapomněli jste toky uživatelů hesel.
  4. Pomocí knihovny MSAL (Microsoft Authentication Library) spusťte pracovní postup ověřování s vaším tenantem Azure Active Directory B2C.

Poznámka:

Pokud ještě nemáte předplatné Azure, vytvořte si bezplatný účet před tím, než začnete.

Azure Active Directory B2C podporuje několik zprostředkovatelů identity, včetně Microsoftu, GitHubu, Facebooku, Twitteru a dalších. Další informace o možnostech Azure Active Directory B2C najdete v dokumentaci k Azure Active Directory B2C.

Microsoft Authentication Library podporuje více aplikačních architektur a platforem. Informace o možnostech MSAL najdete v tématu Microsoft Authentication Library na GitHubu.

Konfigurace tenanta Azure Active Directory B2C

Pokud chcete spustit ukázkový projekt, musíte vytvořit tenanta Azure Active Directory B2C. Další informace najdete v tématu Vytvoření tenanta Azure Active Directory B2C na webu Azure Portal.

Po vytvoření tenanta budete potřebovat název tenanta a ID tenanta ke konfiguraci mobilní aplikace. ID a název tenanta jsou definovány doménou vygenerovanou při vytváření adresy URL tenanta. Pokud je vygenerovaná adresa URL https://contoso20190410tenant.onmicrosoft.com/ tenanta ID contoso20190410tenant.onmicrosoft.com tenanta a název tenanta je contoso20190410tenant. Na webu Azure Portal najděte doménu tenanta kliknutím na filtr adresáře a předplatného v horní nabídce. Následující snímek obrazovky ukazuje tlačítko filtru adresáře a předplatného Azure a doménu tenanta:

Název tenanta v zobrazení filtru adresáře Azure a předplatného

V ukázkovém projektu upravte soubor Constants.cs a nastavte poletenantName.tenantId Následující kód ukazuje, jak by se tyto hodnoty měly nastavit, pokud je https://contoso20190410tenant.onmicrosoft.com/doména vašeho tenanta , nahraďte tyto hodnoty hodnotami z portálu:

public static class Constants
{
    static readonly string tenantName = "contoso20190410tenant";
    static readonly string tenantId = "contoso20190410tenant.onmicrosoft.com";
    ...
}

Registrace mobilní aplikace v Azure Active Directory B2C

Aby bylo možné připojit a ověřit uživatele, musí být mobilní aplikace zaregistrovaná v tenantovi. Proces registrace přiřadí aplikaci jedinečné ID aplikace a adresu URL přesměrování, která po ověření přesměruje odpovědi zpět do aplikace. Další informace najdete v tématu Azure Active Directory B2C: Registrace aplikace. Budete muset znát ID aplikace přiřazené k vaší aplikaci, které je uvedeno za názvem aplikace v zobrazení vlastností. Následující snímek obrazovky ukazuje, kde najít ID aplikace:

ID aplikace v zobrazení vlastností aplikace Azure

Microsoft Authentication Library očekává , že adresa URL pro přesměrování vaší aplikace bude id vaší aplikace s předponou "msal" a za ním koncový bod s názvem "auth". Pokud je VAŠE ID aplikace 1234abcd, měla by být msal1234abcd://authúplná adresa URL . Ujistěte se, že vaše aplikace povolila nastavení nativního klienta , a vytvořte vlastní identifikátor URI přesměrování pomocí ID vaší aplikace, jak je znázorněno na následujícím snímku obrazovky:

Vlastní identifikátor URI přesměrování v zobrazení vlastností aplikace Azure

Adresa URL se použije později v ApplicationManifest.xml Androidu i v souboru iOS Info.plist.

V ukázkovém projektu upravte soubor Constants.cs a nastavte clientId pole na ID aplikace. Následující kód ukazuje, jak by tato hodnota měla být nastavena, pokud je 1234abcdVAŠE ID aplikace:

public static class Constants
{
    static readonly string tenantName = "contoso20190410tenant";
    static readonly string tenantId = "contoso20190410tenant.onmicrosoft.com";
    static readonly string clientId = "1234abcd";
    ...
}

Vytvoření zásad registrace a přihlašování a zapomenuté zásady hesel

Zásady představují prostředí, které uživatelé provedou dokončením úlohy, jako je vytvoření účtu nebo resetování hesla. Zásada také určuje obsah tokenů, které aplikace obdrží, když se uživatel vrátí z prostředí. Musíte nastavit zásady pro registraci účtu i přihlášení a resetování hesla. Azure má integrované zásady, které zjednodušují vytváření běžných zásad. Další informace najdete v tématu Azure Active Directory B2C: Předdefinované zásady.

Po dokončení nastavení zásad byste měli mít dvě zásady v zobrazení Toky uživatelů (zásady) na webu Azure Portal. Následující snímek obrazovky ukazuje dvě nakonfigurované zásady na webu Azure Portal:

Dvě nakonfigurované zásady v zobrazení toků uživatelů Azure (zásady)

V ukázkovém projektu upravte soubor Constants.cs a nastavte policySignin pole tak policyPassword , aby odrážela názvy, které jste zvolili při nastavování zásad:

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";
    ...
}

K ověřování použijte knihovnu MSAL (Microsoft Authentication Library).

Balíček NuGet knihovny Microsoft Authentication Library (MSAL) musí být přidán do sdíleného projektu .NET Standard a projektů platformy v Xamarin.Forms řešení. MSAL obsahuje PublicClientApplicationBuilder třídu, která vytváří objekt, který dodržuje IPublicClientApplication rozhraní. MSAL využívá With klauzule k poskytnutí dalších parametrů konstruktoru a metod ověřování.

V ukázkovém projektu kód pro App.xaml definuje statické vlastnosti pojmenované AuthenticationClient a UIParentvytvoří instanci AuthenticationClient objektu v konstruktoru. Klauzule WithIosKeychainSecurityGroup poskytuje název skupiny zabezpečení pro aplikace pro iOS. Klauzule WithB2CAuthority poskytuje výchozí autoritu nebo zásady, které se použijí k ověřování uživatelů. Klauzule WithRedirectUri říká instanci Azure Notification Hubs, která identifikátor URI přesměrování se má použít, pokud je zadáno více identifikátorů URI. Následující příklad ukazuje, jak vytvořit instanci 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());
    }

    ...

Poznámka:

Pokud má vaše instance Azure Notification Hubs definovaný jenom jeden identifikátor URI přesměrování, může instance fungovat bez AuthenticationClient zadání identifikátoru WithRedirectUri URI přesměrování s klauzulí. Tuto hodnotu byste ale měli vždy zadat v případě, že se vaše konfigurace Azure rozšíří tak, aby podporovala jiné klienty nebo metody ověřování.

Obslužná rutina OnAppearing události v kódu LoginPage.xaml.cs za voláními AcquireTokenSilentAsync pro aktualizaci ověřovacího tokenu pro uživatele, kteří se přihlásili dříve. Proces ověřování se přesměruje na LogoutPage úspěšné ověření a neprovede nic při selhání. Následující příklad ukazuje proces tichého opětovného ověření v 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();
    }

    ...
}

Obslužná rutina OnLoginButtonClicked události (aktivována při kliknutí na tlačítko Přihlásit) volání AcquireTokenAsync. Knihovna MSAL automaticky otevře prohlížeč mobilního zařízení a přejde na přihlašovací stránku. Přihlašovací adresa URL, označovaná jako Autorita, je kombinací názvu tenanta a zásad definovaných v souboru Constants.cs . Pokud uživatel zvolí možnost zapomenutého hesla, vrátí se do aplikace s výjimkou, která spustí zapomenuté heslo. Následující příklad ukazuje proces ověřování:

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 OnForgotPassword se podobá procesu přihlašování, ale implementuje vlastní zásadu. OnForgotPassword používá jiné přetížení AcquireTokenAsync, což umožňuje poskytnout konkrétní autoritu. Následující příklad ukazuje, jak zadat vlastní autoritu při získání 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;
        }
    }
}

Posledním procesem ověřování je proces odhlášení. Metoda OnLogoutButtonClicked se volá, když uživatel stiskne tlačítko odhlásit se. Prochází všechny účty a zajišťuje, že jejich tokeny byly zneplatněny. Následující ukázka ukazuje implementaci odhlášení:

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

V iOSu musí být vlastní schéma adres URL zaregistrované v Azure Active Directory B2C zaregistrované v souboru Info.plist. MSAL očekává, že schéma adres URL bude dodržovat konkrétní vzor popsaný dříve v části Registrace mobilní aplikace v Azure Active Directory B2C. Následující snímek obrazovky ukazuje vlastní schéma adres URL v souboru Info.plist.

Registrace vlastního schématu adres URL v iOSu

MsAL také vyžaduje oprávnění řetězce klíčů v iOSu zaregistrované v souboru Entityilements.plist, jak je znázorněno na následujícím snímku obrazovky:

Když Azure Active Directory B2C dokončí žádost o autorizaci, přesměruje se na zaregistrovanou adresu URL přesměrování. Vlastní schéma adres URL vede ke spuštění mobilní aplikace v iOSu a předání adresy URL jako spouštěcího parametru, kde je zpracováno přepsáním OpenUrl třídy aplikace AppDelegate a vrací kontrolu nad prostředím knihovny MSAL. Implementace OpenUrl je znázorněna v následujícím příkladu kódu:

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

V Androidu musí být v AndroidManifest.xml zaregistrované vlastní schéma adres URL zaregistrované v Azure Active Directory B2C. MSAL očekává, že schéma adres URL bude dodržovat konkrétní vzor popsaný dříve v části Registrace mobilní aplikace v Azure Active Directory B2C. Následující příklad ukazuje vlastní schéma adres URL v 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>

Třída musí být změněna MainActivity tak, aby poskytovala UIParent objekt aplikaci během OnCreate volání. Když Azure Active Directory B2C dokončí žádost o autorizaci, přesměruje se z AndroidManifest.xml do registrovaného schématu adres URL. Registrované schéma identifikátoru URI vede k volání OnActivityResult metody s adresou URL jako spouštěcí parametr, kde je zpracován metodou 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);
    }
}

Univerzální platforma Windows

K použití knihovny MSAL na Univerzální platforma Windows není potřeba žádné další nastavení.

Spuštění projektu

Spusťte aplikaci na virtuálním nebo fyzickém zařízení. Klepnutím na tlačítko Přihlásit by se měl otevřít prohlížeč a přejít na stránku, kde se můžete přihlásit nebo vytvořit účet. Po dokončení procesu přihlášení byste měli být vráceni na stránku odhlášení aplikace. Následující snímek obrazovky ukazuje přihlašovací obrazovku uživatele spuštěnou v Androidu a iOSu:

Přihlašovací obrazovka Azure ADB2C v Androidu a iOS