Настройка единого входа в macOS и iOS

Microsoft Authentication Library (MSAL) для macOS и iOS поддерживает единый вход между приложениями и браузерами macOS/iOS. В этой статье рассматриваются следующие сценарии единого входа:

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

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

  • Единый вход между MSAL и Safari

Единый вход достигается с помощью класса ASWebAuthenticationSession. Он использует существующее состояние входа из других приложений и браузера Safari. Это не ограничивается приложениями, распределенными одним и тем же разработчиком Apple, но для этого требуется некоторое взаимодействие с пользователем.

Если вы используете в приложении веб-представление по умолчанию для входа пользователей в систему, будет автоматически доступен единый вход между приложениями на базе MSAL и Safari. Дополнительные сведения о веб-представлениях, поддерживаемых MSAL, см. в статье "Настройка браузеров и веб-представлений".

Этот тип единого входа в настоящее время недоступен в macOS. MSAL в macOS поддерживает только WKWebView, которая не поддерживает единый вход в Safari.

Note

IOS очищает файлы cookie сеанса сразу после входа из-за использования временного браузера для выполнения входа. Этот браузер не передаёт сеансовые файлы cookie. Чтобы SSO работал на iOS, необходимо включить KMSI, чтобы использовать постоянные файлы cookie.

  • Бесшовный единый вход в приложениях ADAL и MSAL для macOS/iOS

MSAL Objective-C поддерживает миграцию и единый вход с приложениями на основе ADAL Objective C. Приложения должны распространяться тем же разработчиком Apple.

Инструкции по межприложенческому единому входу между приложениями на основе ADAL и MSAL см. в статье SSO между приложениями ADAL и MSAL в macOS и iOS.

Бесшовный SSO между приложениями

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

Чтобы включить единый вход в приложения, вам потребуется выполнить следующие действия, описанные ниже.

  1. Убедитесь, что все приложения используют один и тот же идентификатор клиента или идентификатор приложения.
  2. Убедитесь, что все приложения совместно используют один и тот же сертификат подписи из Apple, чтобы предоставить общий доступ к цепочкам ключей.
  3. Запросите одно и то же право доступа к связке ключей для всех ваших приложений.
  4. Сообщите библиотекам MSAL SDK об общей цепочке ключей, которую нужно использовать, если она отличается от цепочки ключей по умолчанию.

Использование одного и того же идентификатора клиента и идентификатора приложения

Чтобы платформа идентификации Microsoft знала, какие приложения могут совместно использовать токены, эти приложения должны иметь один и тот же идентификатор клиента или идентификатор приложения. Это уникальный идентификатор, предоставленный при регистрации первого приложения на портале.

Способ, с помощью которого платформа удостоверений Microsoft различает приложения, использующие один и тот же идентификатор приложения, — по их URI перенаправления. Каждое приложение может иметь несколько URI перенаправления, зарегистрированных на портале подключения. У каждого приложения в вашем наборе будет свой URI перенаправления. Рассмотрим пример.

URI перенаправления App1: msauth.com.contoso.mytestapp1://auth
URI перенаправления App2: msauth.com.contoso.mytestapp2://auth
URI перенаправления App3: msauth.com.contoso.mytestapp3://auth

Формат URI перенаправления должен быть совместим с поддерживаемым форматом MSAL, который задокументирован в требованиях к формату URI перенаправления MSAL.

Настройка общего доступа к цепочке ключей между приложениями

См. статью Apple «Добавление функциональных возможностей», чтобы включить совместное использование связки ключей. Важно, чтобы вы решили, как назвать свою связку ключей, и добавили эту возможность во все приложения, которые будут участвовать в едином входе (SSO).

При правильной настройке прав вы увидите entitlements.plist файл в каталоге проекта, который содержит примерно следующий пример:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>keychain-access-groups</key>
    <array>
        <string>$(AppIdentifierPrefix)com.myapp.mytestapp</string>
        <string>$(AppIdentifierPrefix)com.myapp.mycache</string>
    </array>
</dict>
</plist>

Добавление новой группы цепочки ключей

Добавьте новую группу цепочек ключей в проект функции. Группа цепочки ключей должна быть следующей:

  • com.microsoft.adalcache в iOS
  • com.microsoft.identity.universalstorage в macOS.

Пример цепочки ключей

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

Настройка объекта приложения

После того как вы включите возможность доступа к связке ключей в каждом из ваших приложений и будете готовы использовать SSO, настройте MSALPublicClientApplication, указав вашу группу доступа к связке ключей, как показано в следующем примере:

Objective-C.

NSError *error = nil;
MSALPublicClientApplicationConfig *configuration = [[MSALPublicClientApplicationConfig alloc] initWithClientId:@"<my-client-id>"];
configuration.cacheConfig.keychainSharingGroup = @"my.keychain.group";

MSALPublicClientApplication *application = [[MSALPublicClientApplication alloc] initWithConfiguration:configuration error:&error];

Swift:

let config = MSALPublicClientApplicationConfig(clientId: "<my-client-id>")
config.cacheConfig.keychainSharingGroup = "my.keychain.group"

do {
   let application = try MSALPublicClientApplication(configuration: config)
  // continue on with application
} catch let error as NSError {
  // handle error here
}

Предупреждение

При совместном использовании цепочки ключей в приложениях любой из приложений может удалять пользователей или даже все маркеры в приложении. Это особенно влияет, если у вас есть приложения, которые полагаются на маркеры для выполнения фоновой работы. Совместное использование связки ключей означает, что при использовании операций удаления в пакете SDK Microsoft Identity вашему приложению следует быть очень осторожным.

Вот и все! SDK идентификации Microsoft теперь будет использовать общие учетные данные во всех ваших приложениях. Список учетных записей также будет общим для экземпляров приложения.

SSO через брокер аутентификации в iOS

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

Ниже описано, как включить единый вход с помощью брокера проверки подлинности для приложения:

  1. Зарегистрируйте в файле Info.plist приложения URI перенаправления в формате, совместимом с брокером. Совместимый с брокером формат URI перенаправления: msauth.<app.bundle.id>://auth. Замените "<app.bundle.id>" идентификатором пакета приложения. Рассмотрим пример.

    <key>CFBundleURLSchemes</key>
    <array>
        <string>msauth.<app.bundle.id></string>
    </array>
    
  2. Добавьте следующие схемы в файл Info.plist вашего приложения в разделе LSApplicationQueriesSchemes:

    <key>LSApplicationQueriesSchemes</key>
    <array>
         <string>msauthv2</string>
         <string>msauthv3</string>
    </array>
    
  3. Добавьте следующее в файл AppDelegate.m для обработки обратных вызовов:

    Objective-C.

    - (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString *,id> *)options
    {
        return [MSALPublicClientApplication handleMSALResponse:url sourceApplication:options[UIApplicationOpenURLOptionsSourceApplicationKey]];
    }
    

    Swift:

    func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
        return MSALPublicClientApplication.handleMSALResponse(url, sourceApplication: options[UIApplication.OpenURLOptionsKey.sourceApplication] as? String)
    }
    

Если вы используете Xcode 11, следует вместо этого поместить обработчик обратного вызова MSAL в файл SceneDelegate. Если вы поддерживаете UISceneDelegate и UIApplicationDelegate для совместимости с более старыми версиями iOS, вызов MSAL необходимо поместить в оба файла.

Objective-C.

 - (void)scene:(UIScene *)scene openURLContexts:(NSSet<UIOpenURLContext *> *)URLContexts
 {
     UIOpenURLContext *context = URLContexts.anyObject;
     NSURL *url = context.URL;
     NSString *sourceApplication = context.options.sourceApplication;

     [MSALPublicClientApplication handleMSALResponse:url sourceApplication:sourceApplication];
 }

Swift:

func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) {

        guard let urlContext = URLContexts.first else {
            return
        }

        let url = urlContext.url
        let sourceApp = urlContext.options.sourceApplication

        MSALPublicClientApplication.handleMSALResponse(url, sourceApplication: sourceApp)
    }