Поделиться через


Рекомендации по использованию Xamarin iOS с MSAL.NET

При использовании библиотеки проверки подлинности Майкрософт для .NET (MSAL.NET) в Xamarin iOS необходимо выполнить следующие действия:

  • Переопределите и реализуйте функцию OpenUrl в AppDelegate .
  • Активируйте группы ключей.
  • Разрешите общий доступ к кэшу токенов.
  • Предоставьте доступ к цепочке ключей.
  • Узнайте об известных проблемах с iOS 12 и iOS 13 и проверкой подлинности.

Примечание.

MSAL.NET версии 4.61.0 и выше не поддерживают универсальную платформу Windows (UWP), Xamarin Android и Xamarin iOS. Мы рекомендуем перенести приложения Xamarin в современные платформы, такие как MAUI. Узнайте больше о прекращении поддержки в статье о предстоящей отмене MSAL.NET для Xamarin и UWP.

Внедрить OpenUrl

Переопределите OpenUrl метод FormsApplicationDelegate производного класса и вызовите AuthenticationContinuationHelper.SetAuthenticationContinuationEventArgs . Приведем пример:

public override bool OpenUrl(UIApplication app, NSUrl url, NSDictionary options)
{
    AuthenticationContinuationHelper.SetAuthenticationContinuationEventArgs(url);
    return true;
}

Также выполните следующие действия:

  • Определите схему URI перенаправления.
  • Запросите для приложения разрешение на вызов другого приложения.
  • Для URI перенаправления требуется определённая форма.
  • Добавьте URI перенаправления на портале Azure.

Предоставление доступа к цепочке ключей

Чтобы предоставить доступ к цепочке ключей, убедитесь, что у приложения есть группа доступа к цепочке ключей. Группу доступа к цепочке ключей можно задать при создании приложения с помощью API WithIosKeychainSecurityGroup().

Чтобы воспользоваться преимуществами кэша и единого входа (SSO), задайте для группы доступа к цепочке ключей одно и то же значение во всех приложениях.

В этом примере программы установки используется MSAL 4. x:

var builder = PublicClientApplicationBuilder
     .Create(ClientId)
     .WithIosKeychainSecurityGroup("com.microsoft.adalcache")
     .Build();

Также включите доступ к цепочке ключей в файле Entitlements.plist. Используйте следующую группу доступа или собственную группу доступа.

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

При использовании API WithIosKeychainSecurityGroup() MSAL автоматически добавляет группу безопасности в конец идентификатора группы приложения ( AppIdentifierPrefix ). MSAL добавляет группу безопасности, так как при создании приложения в Xcode оно будет выполнять те же действия. Именно поэтому права в файле Entitlements.plist должны включать $(AppIdentifierPrefix) перед группой доступа к цепочке ключей.

Дополнительные сведения см. в документации по правам iOS.

Устранение неполадок с доступом к цепочке ключей

Если появляется сообщение об ошибке "Приложение не может получить доступ к цепочке ключей iOS для издателя приложения (TeamId имеет значение NULL)", это означает, что MSAL не может получить доступ к цепочке ключей. Это проблема конфигурации. Чтобы устранить неполадки, попробуйте получить доступ к цепочке ключей самостоятельно, например:

var queryRecord = new SecRecord(SecKind.GenericPassword)
{
    Service = "",
    Account = "SomeTeamId",
    Accessible = SecAccessible.Always
};

SecRecord match = SecKeyChain.QueryAsRecord(queryRecord, out SecStatusCode resultCode);

if (resultCode == SecStatusCode.ItemNotFound)
{
    SecKeyChain.Add(queryRecord);
    match = SecKeyChain.QueryAsRecord(queryRecord, out resultCode);
}

// Make sure that  resultCode == SecStatusCode.Success

Включение совместного использования кэша токенов в приложениях iOS

Начиная с версии MSAL 2. x, можно указывать группу доступа к цепочке ключей, чтобы сохранить кэш токенов в нескольких приложениях. Этот параметр позволяет совместно использовать кэш токенов в нескольких приложениях с одной группой доступа к цепочке ключей. Кэш токенов можно совместно использовать в приложениях ADAL.NET, MSAL.NET Xamarin. iOS и в собственных приложениях iOS, разработанных в ADAL.objc или MSAL.objc.

При совместном использовании кэша токенов вы разрешаете единый вход (SSO) для всех приложений, использующих одну группу доступа к цепочке ключей.

Чтобы включить этот общий доступ к кэшу, используйте метод WithIosKeychainSecurityGroup(), чтобы задать для группы доступа к цепочке ключей одно и то же значение во всех приложениях, использующих общий кэш. В первом примере кода в этой статье показано, как использовать этот метод.

Ранее в этой статье вы узнали, что MSAL добавляет $(AppIdentifierPrefix) каждый раз при использовании API WithIosKeychainSecurityGroup(). MSAL добавляет этот элемент, так как идентификатор команды AppIdentifierPrefix гарантирует, что только приложения, созданные одним издателем, могут использовать общий доступ к цепочке ключей.

Примечание.

Свойство KeychainSecurityGroup устарело. Вместо него используйте свойство iOSKeychainSecurityGroup. Префикс TeamId не требуется при использовании iOSKeychainSecurityGroup .

Использование Microsoft Authenticator

Приложение может использовать Microsoft Authenticator в качестве брокера для включения:

  • SSO: при использовании единого входа (SSO) пользователям не нужно будет входить отдельно в каждое приложение.
  • Идентификация устройства: используйте идентификацию устройства для проверки подлинности при доступе к сертификату устройства. Этот сертификат создается на устройстве при его подключении к рабочему месту. Приложение будет готово, если администраторы клиента разрешают условный доступ, связанный с устройствами.
  • Проверка идентификации приложения. Когда приложение вызывает брокер, ему передается URL-адрес перенаправления. Брокер проверяет URL-адрес перенаправления.

Дополнительные сведения о включении брокера см. в статье Использование Microsoft Authenticator или Корпоративный портал Microsoft Intune в приложениях Xamarin iOS и Android.

Известные проблемы с iOS 12 и проверкой подлинности

Корпорация Майкрософт выпустила Советы по безопасности о несовместимости между iOS 12 и некоторыми типами проверки подлинности. Несовместимость ломает авторизацию через социальные сети, WSFed и OIDC. Рекомендации по безопасности помогут вам понять, как удалить ограничения безопасности ASP.NET из ваших приложений, чтобы сделать их совместимыми с iOS 12.

При разработке приложений MSAL.NET на Xamarin iOS, может возникнуть бесконечный цикл, когда вы попытаетесь войти на веб-сайты на iOS 12. Такое поведение аналогично ошибке ADAL в GitHub: бесконечный цикл при попытке входа на веб-сайт из iOS 12 #1329.

Также может возникнуть сбой проверки подлинности OIDC в ASP.NET Core с использованием Safari на iOS 12. Дополнительные сведения см. в статье Проблемы с WebKit.

Известные проблемы с iOS 13 и проверкой подлинности

Если приложению требуется поддержка условного доступа или проверки подлинности сертификатов, включите приложение для взаимодействия с приложением брокера Microsoft Authenticator. MSAL также отвечает за обработку запросов и ответов между приложением и Microsoft Authenticator.

В iOS 13 компания Apple внесла критическое изменение в API, удалив возможность приложения считывать исходное приложение при получении ответа от внешнего приложения через пользовательские схемы URL-адресов.

Документация Apple для UIApplicationOpenURLOptionsSourceApplicationKey указывает:

Если запрос поступил из другого приложения, принадлежащего вашей команде, UIKit присваивает этому ключу значение идентификатора такого приложения. Если идентификатор команды исходного приложения отличается от идентификатора текущего приложения, то значение ключа равно nil.

Это изменение является критическим для MSAL, так как оно использовалось на UIApplication.SharedApplication.OpenUrl для проверки связи между MSAL и приложением Microsoft Authenticator.

Кроме того, в iOS 13 разработчик должен предоставить контроллер презентации при использовании ASWebAuthenticationSession .

Ваше приложение затронуто, если сборка выполняется с помощью Xcode 11 и с использованием либо брокера iOS, либо ASWebAuthenticationSession.

В таких случаях используйте MSAL.NET 4.4.0 +, чтобы проверка подлинности прошла успешно.

Дополнительные требования

  • При использовании последних библиотек MSAL убедитесь, что на устройстве установлена версия Microsoft Authenticator 6.3.19 + .

  • При обновлении до MSAL.NET 4.4.0 + обновите LSApplicationQueriesSchemes в файле info. plist и добавьте msauthv3:

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

    Добавление msauthv3 в info. plist необходимо для проверки наличия последнего приложения Microsoft Authenticator на устройстве, которое поддерживает iOS 13.

Сообщение о проблеме

Если у вас есть вопросы или вы хотите сообщить о проблеме, обнаруженной в MSAL.NET, откройте проблему в microsoft-authentication-library-for-dotnet репозитории на сайте GitHub.

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

Дополнительные сведения о свойствах Xamarin iOS см. в разделе Рекомендации для iOS в следующем примере файла readme.md:

Пример Платформа Описание
https://github.com/Azure-Samples/active-directory-xamarin-native-v2 Xamarin iOS, Android, Universal Windows Platform (UWP) Приложение Xamarin Forms, показывающее, как использовать MSAL.NET для проверки подлинности рабочих или учебных личная учетная запись и Microsoft личная учетная запись с помощью платформа удостоверений Майкрософт и доступа к Microsoft Graph с результирующий маркер.