Перенос приложений iOS, использующих Microsoft Authenticator, из ADAL.NET в MSAL.NET

Вы уже использовали библиотеку проверки подлинности Azure Active Directory для .NET (ADAL.NET) и брокера iOS. Теперь пора перейти на библиотеку проверки подлинности Майкрософт для .NET (MSAL.NET), которая поддерживает брокер в iOS начиная с выпуска 4.3 и далее.

С чего начать? Эта статья поможет вам перенести приложение Xamarin на платформе iOS из ADAL в MSAL.

Необходимые компоненты

В этой статье предполагается, что у вас уже есть приложение Xamarin, интегрированное с брокером iOS. В противном случае перейдите непосредственно к MSAL.NET и начните реализацию брокера. Сведения о том, как вызвать брокер iOS в MSAL.NET для нового приложения, см. в этой документации.

Общие сведения

Что такое брокеры?

Брокеры — это приложения, предоставляемые корпорацией Майкрософт в Android и iOS. (См. приложение Microsoft Authenticator в iOS и Android, а также приложение "Корпоративный портал Intune" на Android.)

Они включают:

Перенос данных из ADAL в MSAL

Шаг 1. Включение брокера

Текущий код ADAL:Аналог в MSAL:
В ADAL.NET поддержка брокера была включена для каждого контекста проверки подлинности. По умолчанию он отключен. Вам пришлось установить

флажок useBroker для вызова брокера в значение "Да" в конструкторе PlatformParameters:

public PlatformParameters(
        UIViewController callerViewController,
        bool useBroker)

Кроме того, в зависящем от платформы коде этого примера, в модуле отрисовки страниц для iOS установите флажок useBroker в значение "Да":

page.BrokerParameters = new PlatformParameters(
          this,
          true,
          PromptBehavior.SelectAccount);

Затем включите параметры в вызов токена получения:

 AuthenticationResult result =
                    await
                        AuthContext.AcquireTokenAsync(
                              Resource,
                              ClientId,
                              new Uri(RedirectURI),
                              platformParameters)
                              .ConfigureAwait(false);
В MSAL.NET поддержка брокера включается для каждого приложения PublicClientApplication. По умолчанию он отключен. Чтобы включить его, используйте

параметр WithBroker() (по умолчанию имеет значение true), чтобы вызвать брокер:

var app = PublicClientApplicationBuilder
                .Create(ClientId)
                .WithBroker()
                .WithReplyUri(redirectUriOnIos)
                .Build();

В вызове запроса маркера:

result = await app.AcquireTokenInteractive(scopes)
             .WithParentActivityOrWindow(App.RootViewController)
             .ExecuteAsync();

Шаг 2. Установка UIViewController()

В ADAL.NET вы ознакомились с UIViewController в качестве части PlatformParameters. (См. пример на шаге 1.) В MSAL.NET для предоставления разработчикам большей гибкости используется окно объекта, но оно не является обязательным для обычного использования iOS. Чтобы использовать брокер, задайте окно объекта для отправки и получения ответов от брокера.

Текущий код ADAL:Аналог в MSAL:
UiViewController передается в

PlatformParameters на платформе iOS.

page.BrokerParameters = new PlatformParameters(
          this,
          true,
          PromptBehavior.SelectAccount);
В MSAL.NET можно настроить окно объекта для iOS:
  1. В AppDelegate.cs задайте App.RootViewController в новое UIViewController(). Это назначение гарантирует наличие UIViewController с вызовом брокера. Если значения заданы неправильно, может появиться следующее сообщение об ошибке: "uiviewcontroller_required_for_ios_broker":"UIViewController is null, so MSAL.NET cannot invoke the iOS broker. See https://aka.ms/msal-net-ios-broker".
  2. При вызове AcquireTokenInteractive используйте .WithParentActivityOrWindow(App.RootViewController) и передайте ссылку на окно объекта, которое вы будете использовать.

Пример.

В App.cs:

   public static object RootViewController { get; set; }

В AppDelegate.cs:

   LoadApplication(new App());
   App.RootViewController = new UIViewController();

В вызове запроса маркера:

result = await app.AcquireTokenInteractive(scopes)
             .WithParentActivityOrWindow(App.RootViewController)
             .ExecuteAsync();

Шаг 3. Обновление AppDelegate для обработки обратного вызова

И ADAL, и MSAL вызывают брокер, а брокер, в свою очередь, обращается к приложению через метод OpenUrl класса AppDelegate. Дополнительные сведения см. в этой документации.

В данном случае изменений между ADAL.NET и MSAL.NET не существует.

Шаг 4. Регистрация схемы URL-адреса

ADAL.NET и MSAL.NET используют URL-адреса для вызова брокера и возврата ответа брокера обратно в приложение. Зарегистрируйте схему URL-адресов в файле приложения Info.plist следующим образом.

Текущий код ADAL:Аналог в MSAL:
Схема URL-адресов уникальна для вашего приложения. Токен

Имя CFBundleURLSchemes должно включать

msauth.

в качестве префикса, за которым следует CFBundleURLName.

Пример: $"msauth.(BundleId")

 <key>CFBundleURLTypes</key>
    <array>
      <dict>
        <key>CFBundleTypeRole</key>
        <string>Editor</string>
        <key>CFBundleURLName</key>
        <string>com.yourcompany.xforms</string>
        <key>CFBundleURLSchemes</key>
        <array>
          <string>msauth.com.yourcompany.xforms</string>
        </array>
      </dict>
    </array>

Примечание.

Эта схема URL-адресов становится частью URI перенаправления, который является уникальным идентификатором приложения при получении ответа брокера.

Шаг 5. Добавление идентификатора брокера в раздел LSApplicationQueriesSchemes

Как ADAL.NET, так и MSAL.NET используют -canOpenURL: чтобы проверить, установлен ли брокер на устройстве. Добавьте правильный идентификатор для брокера iOS в раздел LSApplicationQueriesSchemes файла info.plist следующим образом.

Текущий код ADAL:Аналог в MSAL:
Использует

msauth

<key>LSApplicationQueriesSchemes</key>
<array>
     <string>msauth</string>
</array>
Использует

msauthv2

<key>LSApplicationQueriesSchemes</key>
<array>
     <string>msauthv2</string>
     <string>msauthv3</string>
</array>

Шаг 6. Зарегистрируйте URI перенаправления через портал Azure

ADAL.NET и MSAL.NET добавляют дополнительные требования к URI перенаправления, когда он берет в цель брокера. Зарегистрируйте URI перенаправления в приложении через портал Azure.

Текущий код ADAL:Аналог в MSAL:

"<app-scheme>://<your.bundle.id>"

Пример:

mytestiosapp://com.mycompany.myapp

$"msauth.{BundleId}://auth"

Пример:

public static string redirectUriOnIos = "msauth.com.yourcompany.XForms://auth";

Дополнительные сведения о регистрации URI перенаправления в портал Azure см. в разделе Шаг 7. Добавление URI перенаправления в регистрацию приложения.

Шаг 7. Настройка Entitlements.plist

Включите доступ к цепочке ключей в файле прав Entitlements.plist:

 <key>keychain-access-groups</key>
    <array>
      <string>$(AppIdentifierPrefix)com.microsoft.adalcache</string>
    </array>

Дополнительные сведения о включении доступа к цепочке ключей см. в разделе Включение доступа к цепочке ключей.

Следующие шаги

Ознакомьтесь с тематическими вопросами, связанными с Xamarin iOS, в MSAL.NET.