Číst v angličtině

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