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

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

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

Реализация 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.

Также может произойти прерывание проверки подлинности ASP.NET Core OIDC в iOS 12 Safari. Дополнительные сведения см. в статье Проблемы с 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:

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