将重定向 URI 与用于 iOS 和 macOS 的 Microsoft 身份验证库 (MSAL) 配合使用

当用户进行身份验证时,Microsoft Entra ID 会将令牌发送到应用,方法是使用注册到 Microsoft Entra 应用程序的重定向 URI。

MSAL 要求重定向 URI 按特定格式注册到 Microsoft Entra 应用。 在未指定重定向 URI 的情况下,MSAL 使用默认的。 格式为 msauth.[Your_Bundle_Id]://auth

默认的重定向 URI 格式适用于大多数应用和方案,包括代理身份验证和系统 Web 视图。 尽可能使用默认格式。

但是,你可能需要为高级方案更改重定向 URI,如以下部分中所述。

需要其他重定向 URI 的方案

跨应用单一登录 (SSO)

如果希望 Microsoft 标识平台在应用之间共享令牌,每个应用都需要有相同的客户端 ID 或应用程序 ID。 此客户端 ID 是在 Azure 门户中注册应用时系统提供的唯一标识符(不是按应用注册到 Apple 时的应用程序捆绑 ID)。

每个 iOS 应用的重定向 URI 必须是不同的。 这样 Microsoft 标识服务才能唯一标识共享某个应用程序 ID 的不同应用。 每个应用程序可以在 Azure 门户中注册多个重定向 URI。 套件中的每个应用都具有不同的重定向 URI。 例如:

在 Azure 门户中进行以下应用程序注册时:

  • 客户端 ID:ABCDE-12345
  • RedirectUris:msauth.com.contoso.app1://authmsauth.com.contoso.app2://authmsauth.com.contoso.app3://auth

App1 使用重定向 msauth.com.contoso.app1://auth
App2 使用 msauth.com.contoso.app2://auth
App3 使用 msauth.com.contoso.app3://auth

从 ADAL 迁移到 MSAL

在将使用 Azure Active Directory 身份验证库 (ADAL) 的代码迁移到 MSAL 时,你可能已经为应用配置了重定向 URI。 可以持续使用同一个重定向 URI,前提是 ADAL 应用已配置为支持中转方案,且重定向 URI 满足 MSAL 重定向 URI 格式要求。

MSAL 重定向 URI 格式要求

  • MSAL 重定向 URI 必须采用 <scheme>://host 格式

    其中的 <scheme> 是用于标识应用的唯一字符串。 它主要基于应用程序的捆绑标识符,目的是保证唯一性。 例如,如果应用的捆绑 ID 为 com.contoso.myapp,则重定向 URI 将采用 msauth.com.contoso.myapp://auth 格式。

    如果从 ADAL 进行迁移,则重定向 URI 可能会采用此格式:<scheme>://[Your_Bundle_Id],其中的 scheme 是唯一字符串。 只要使用 MSAL,此格式就可以继续使用。

  • <scheme> 必须注册到应用的 Info.plist 的 CFBundleURLTypes > CFBundleURLSchemes 下。 在此示例中,Info.plist 已作为源代码打开:

    <key>CFBundleURLTypes</key>
    <array>
        <dict>
            <key>CFBundleURLSchemes</key>
            <array>
                <string>msauth.[BUNDLE_ID]</string>
            </array>
        </dict>
    </array>
    

MSAL 会验证重定向 URI 是否已正确注册,否则会返回错误。

  • 若要将通用链接用作重定向 URI,<scheme> 必须为 https,不需在 CFBundleURLSchemes 中声明。 只需在通过通用链接打开应用程序后,按照开发人员的通用链接中 Apple 的说明配置应用和域,然后调用 MSALPublicClientApplicationhandleMSALResponse:sourceApplication: 方法即可。

使用自定义重定向 URI

若要使用自定义重定向 URI,请在初始化对象时,将 redirectUri 参数传递给 MSALPublicClientApplicationConfig,将该对象传递给 MSALPublicClientApplication。 如果重定向 URI 无效,初始化表达式会返回 nil,并根据其他信息来设置 redirectURIError。 例如:

Objective-C:

MSALPublicClientApplicationConfig *config =
        [[MSALPublicClientApplicationConfig alloc] initWithClientId:@"your-client-id"
                                                        redirectUri:@"your-redirect-uri"
                                                        authority:authority];
NSError *redirectURIError;
MSALPublicClientApplication *application =
        [[MSALPublicClientApplication alloc] initWithConfiguration:config error:&redirectURIError];

Swift:

let config = MSALPublicClientApplicationConfig(clientId: "your-client-id",
                                            redirectUri: "your-redirect-uri",
                                              authority: authority)
do {
  let application = try MSALPublicClientApplication(configuration: config)
  // continue on with application
} catch let error as NSError {
  // handle error here
}

处理“URL 已打开”事件

应用程序在通过 URL 方案或通用链接收到任何响应时,应调用 MSAL。 当应用程序打开后,调用 MSALPublicClientApplicationhandleMSALResponse:sourceApplication: 方法。 下面是自定义方案的一个示例:

Objective-C:

- (BOOL)application:(UIApplication *)app
            openURL:(NSURL *)url
            options:(NSDictionary<UIApplicationOpenURLOptionsKey,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)
}

后续步骤

详细了解身份验证流和应用程序方案