Проверка подлинности с помощью Azure Active Directory B2C

Download Sample Скачайте пример

Azure Active Directory B2C обеспечивает управление облачными удостоверениями для веб-приложений и мобильных приложений, подключенных к потребителю. В этой статье показано, как использовать Azure Active Directory B2C для интеграции управления удостоверениями в мобильное приложение с библиотекой проверки подлинности Майкрософт.

Обзор

Azure Active Directory B2C (ADB2C) — это служба управления удостоверениями для приложений, подключенных к потребителю. Он позволяет пользователям входить в приложение с помощью существующих учетных записей социальных параметров или пользовательских учетных данных, таких как электронная почта или имя пользователя и пароль. Пользовательские учетные записи учетных данных называются локальными учетными записями.

Процесс интеграции службы управления удостоверениями Azure Active Directory B2C в мобильное приложение выглядит следующим образом:

  1. Создание клиента Azure Active Directory B2C.
  2. Зарегистрируйте мобильное приложение в клиенте Azure Active Directory B2C.
  3. Создайте политики для регистрации и входа и забыли потоки пользователей паролей.
  4. Используйте библиотеку проверки подлинности Майкрософт (MSAL), чтобы запустить рабочий процесс проверки подлинности с клиентом Azure Active Directory B2C.

Примечание.

Если у вас еще нет подписки Azure, создайте бесплатную учетную запись Azure, прежде чем начать работу.

Azure Active Directory B2C поддерживает несколько поставщиков удостоверений, включая Microsoft, GitHub, Facebook, Twitter и многое другое. Дополнительные сведения о возможностях Azure Active Directory B2C см . в документации по Azure Active Directory B2C.

Библиотека проверки подлинности Майкрософт поддерживает несколько архитектур приложений и платформ. Сведения о возможностях MSAL см . в библиотеке проверки подлинности Майкрософт на сайте GitHub.

Настройка клиента Azure Active Directory B2C

Чтобы запустить пример проекта, необходимо создать клиент Azure Active Directory B2C. Дополнительные сведения см. в статье "Создание клиента Azure Active Directory B2C" в портал Azure.

После создания клиента вам потребуется имя клиента и идентификатор клиента для настройки мобильного приложения. Идентификатор клиента и имя определяются доменом, созданным при создании URL-адреса клиента. Если созданный URL-адрес клиента является https://contoso20190410tenant.onmicrosoft.com/ идентификатором contoso20190410tenant.onmicrosoft.com клиента, а имя клиента — .contoso20190410tenant Найдите домен клиента в портал Azure, щелкнув фильтр каталога и подписки в верхнем меню. На следующем снимку экрана показана кнопка "Каталог Azure" и "Фильтр подписки" и домен клиента:

Tenant name in the Azure directory and subscription filter view

В примере проекта измените файл Constants.cs , чтобы задать tenantName поля и tenantId поля. В следующем коде показано, как следует задать эти значения, если домен клиента имеет значение https://contoso20190410tenant.onmicrosoft.com/, замените эти значения значениями на портале:

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

Регистрация мобильного приложения в Azure Active Directory B2C

Перед подключением и проверкой подлинности пользователей мобильное приложение должно быть зарегистрировано в клиенте. Процесс регистрации назначает уникальный идентификатор приложения приложению и URL-адрес перенаправления, который направляет ответы обратно в приложение после проверки подлинности. Дополнительные сведения см. в статье Azure Active Directory B2C: регистрация приложения. Вам потребуется знать идентификатор приложения, назначенный приложению, который указан после имени приложения в представлении свойств. На следующем снимку экрана показано, где найти идентификатор приложения:

Application ID in the Azure application properties view

Библиотека проверки подлинности Майкрософт ожидает , что URL-адрес перенаправления приложения будет префиксом идентификатора приложения с текстом msal, а затем конечной точкой с именем auth. Если идентификатор приложения равен "1234abcd", полный URL-адрес должен быть msal1234abcd://auth. Убедитесь, что приложение включило собственный параметр клиента и создайте URI пользовательского перенаправления с помощью идентификатора приложения, как показано на следующем снимке экрана:

Custom Redirect URI in the Azure application properties view

URL-адрес будет использоваться позже в Android ApplicationManifest.xml и iOS Info.plist.

В примере проекта измените файл Constants.cs, чтобы задать поле идентификатору clientIdприложения. В следующем коде показано, как задать это значение, если идентификатор приложения:1234abcd

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

Создание политик регистрации и входа и забыли политики паролей

Политика — это взаимодействие с пользователями, которые выполняют задачу, например создание учетной записи или сброс пароля. Политика также указывает содержимое маркеров, которые приложение получает, когда пользователь возвращается из интерфейса. Необходимо настроить политики для регистрации и входа в учетную запись, а также для сброса пароля. В Azure есть встроенные политики, упрощающие создание общих политик. Дополнительные сведения см. в статье Azure Active Directory B2C: встроенные политики.

После завершения настройки политики в представлении "Потоки пользователей" (политики) в портал Azure должны быть две политики. На следующем снимке экрана показаны две настроенные политики в портал Azure:

Two configured policies in the Azure User flows (policies) view

В примере проекта измените файл Constants.cs , чтобы задать policySigninpolicyPassword и поля, чтобы отразить имена, выбранные во время настройки политики:

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

Использование библиотеки проверки подлинности Майкрософт (MSAL) для проверки подлинности

Пакет NuGet библиотеки проверки подлинности Майкрософт (MSAL) должен быть добавлен в общий проект , .NET Standard и проекты платформы в Xamarin.Forms решении. MSAL включает PublicClientApplicationBuilder класс, который создает объект, хранящееся в интерфейсе IPublicClientApplication . MSAL использует With предложения для предоставления дополнительных параметров конструктору и методам проверки подлинности.

В примере проекта код, который стоит за App.xaml , определяет статические свойства с именем AuthenticationClient и UIParentсоздает экземпляр AuthenticationClient объекта в конструкторе. Предложение WithIosKeychainSecurityGroup предоставляет имя группы безопасности для приложений iOS. Предложение WithB2CAuthority предоставляет центр или политику по умолчанию, которая будет использоваться для проверки подлинности пользователей. Предложение WithRedirectUri сообщает экземпляру Центров уведомлений Azure, который будет использоваться URI перенаправления, если задано несколько URI. В следующем примере показано, как создать экземпляр 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());
    }

    ...

Примечание.

Если в экземпляре Центров уведомлений Azure определен только один URI перенаправления, AuthenticationClient экземпляр может работать без указания URI перенаправления с предложением WithRedirectUri . Однако всегда следует указать это значение в случае расширения конфигурации Azure для поддержки других клиентов или методов проверки подлинности.

Обработчик OnAppearing событий в коде LoginPage.xaml.cs за вызовами AcquireTokenSilentAsync для обновления маркера проверки подлинности для пользователей, вошедшего ранее. Процесс проверки подлинности перенаправляется в случае успешного LogoutPage выполнения и не выполняет никаких действий при сбое. В следующем примере показан процесс автоматической повторной проверки подлинности в 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();
    }

    ...
}

Обработчик OnLoginButtonClicked событий (срабатывает при нажатии кнопки входа).AcquireTokenAsync Библиотека MSAL автоматически открывает браузер мобильных устройств и переходит на страницу входа. URL-адрес входа, называемый центром, представляет собой сочетание имени клиента и политик, определенных в файле Constants.cs . Если пользователь выбирает параметр "Забыл пароль", он возвращается в приложение с исключением, что запускает процесс забыли пароль. В следующем примере показан процесс проверки подлинности:

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

    ...
}

Метод OnForgotPassword аналогичен процессу входа, но реализует настраиваемую политику. OnForgotPassword использует другую перегрузку AcquireTokenAsync, которая позволяет предоставить определенный орган. В следующем примере показано, как предоставить пользовательский центр при получении маркера:

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

Последний элемент проверки подлинности — это процесс выхода. Метод OnLogoutButtonClicked вызывается, когда пользователь нажимает кнопку выхода. Он цикличен по всем учетным записям и гарантирует, что их маркеры были недействительными. В приведенном ниже примере демонстрируется реализация выхода:

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

В iOS пользовательская схема URL-адресов, зарегистрированная в Azure Active Directory B2C, должна быть зарегистрирована в Info.plist. MSAL ожидает, что схема URL-адресов соответствует определенному шаблону, описанному ранее в разделе "Регистрация мобильного приложения в Azure Active Directory B2C". На следующем снимке экрана показана настраиваемая схема URL-адресов в Info.plist.

MSAL также требует прав цепочки ключей в iOS, зарегистрированных в Entitilements.plist, как показано на следующем снимке экрана:

Когда Azure Active Directory B2C завершит запрос авторизации, он перенаправляется на зарегистрированный URL-адрес перенаправления. Пользовательская схема URL-адресов приводит к запуску мобильного приложения iOS и передаче URL-адреса в качестве параметра запуска, где он обрабатывается OpenUrl переопределением класса приложения AppDelegate и возвращает контроль над интерфейсом MSAL. Реализация OpenUrl показана в следующем примере кода:

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

В Android пользовательская схема URL-адресов, зарегистрированная в Azure Active Directory B2C, должна быть зарегистрирована в AndroidManifest.xml. MSAL ожидает, что схема URL-адресов соответствует определенному шаблону, описанному ранее в разделе "Регистрация мобильного приложения в Azure Active Directory B2C". В следующем примере показана настраиваемая схема URL-адресов в 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>

Класс MainActivity необходимо изменить, чтобы предоставить UIParent объект приложению во время OnCreate вызова. Когда Azure Active Directory B2C завершит запрос авторизации, он перенаправляется на зарегистрированную схему URL-адресов из AndroidManifest.xml. Зарегистрированная схема URI приводит к вызову OnActivityResult метода с URL-адресом в качестве параметра запуска, где он обрабатывается методом 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);
    }
}

Универсальная платформа Windows

Дополнительная настройка не требуется для использования MSAL в универсальная платформа Windows

Запуск проекта

Запустите приложение на виртуальном или физическом устройстве. Нажмите кнопку входа, чтобы открыть браузер и перейти на страницу, на которой можно войти или создать учетную запись. После завершения процесса входа необходимо вернуться на страницу выхода приложения. На следующем снимке экрана показан экран входа пользователя в Android и iOS: