共用方式為


搭配 MSAL.NET 一起使用 Xamarin iOS 的考量

當在 Xamarin iOS 上使用 Microsoft Authentication Library for .NET (MSAL.NET) 時,您應該:

  • 覆寫並實作 AppDelegate 中的 OpenUrl 函式。
  • 啟用鑰匙圈群組。
  • 啟用權杖快取共用。
  • 啟用鑰匙圈存取。
  • 了解 iOS 12 與 iOS 13 及驗證的已知問題。

注意

MSAL.NET 版本 4.61.0 和更新版本不支援通用 Windows 平台 (UWP)、Xamarin Android 和 Xamarin iOS。 建議您將 Xamarin 應用程式移轉至 MAUI 等新式架構。 在 宣佈即將淘汰適用於 Xamarin 和 UWP 的 MSAL.NET 中深入了解此淘汰。

實作 OpenUrl

覆寫 FormsApplicationDelegate 衍生類別的 OpenUrl 方法,並呼叫 AuthenticationContinuationHelper.SetAuthenticationContinuationEventArgs。 以下是範例:

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

另外,執行下列工作:

  • 定義重新導向 URI 配置。
  • 要求應用程式的權限,以呼叫另一個應用程式。
  • 擁有重新導向 URI 的特定表單。
  • 在 Azure 入口網站中註冊重新導向 URI

啟用鑰匙圈存取

若要啟用鑰匙圈存取,請確定應用程式具有鑰匙圈存取群組。 當使用 WithIosKeychainSecurityGroup() API 建立應用程式時,可以設定鑰匙圈存取群組。

若要受益於快取與單一登入 (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>

當使用 WithIosKeychainSecurityGroup() API 時,MSAL 會自動將安全性群組附加至應用程式小組識別碼的結尾 (AppIdentifierPrefix)。 MSAL 會新增安全性群組,因為當您在 Xcode 中建置應用程式時,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 應用程式,以及在 ADAL.objcMSAL.objc 中開發的原生 iOS 應用程式之間共用權杖快取。

藉由共用權杖快取,您可以在所有使用相同鑰匙圈存取群組的應用程式中允許單一登入 (SSO)。

若要啟用此快取共用,請使用 WithIosKeychainSecurityGroup() 方法,將鑰匙圈存取群組設定為共用相同快取之所有應用程式中的相同值。 本文中第一個程式碼範例會顯示如何使用該方法。

稍早在本文中,您已了解 MSAL 會在您每次使用 WithIosKeychainSecurityGroup() API 時新增 $(AppIdentifierPrefix)。 MSAL 會新增此元素,因為小組識別碼 AppIdentifierPrefix 可確保只有相同發行者所製作的應用程式可以共用鑰匙圈存取。

注意

KeychainSecurityGroup 屬性已遭取代。 請改用 iOSKeychainSecurityGroup 屬性。 當使用 iOSKeychainSecurityGroup 時,不需要 TeamId 前置詞。

使用 Microsoft Authenticator

應用程式可以使用 Microsoft Authenticator 作為訊息代理程式,以啟用:

  • SSO:當啟用 SSO 時,使用者不需要登入每個應用程式。
  • 裝置識別:透過存取裝置憑證來使用裝置識別進行驗證。 當此憑證加入工作場所時,會在裝置上加以建立。 若租用戶系統管理員啟用與裝置相關的條件式存取,則您的應用程式將會就緒。
  • 應用程式識別驗證:當應用程式呼叫訊息代理程式時,會傳遞其重新導向 URL。 該訊息代理程式會驗證重新導向 URL。

如需如何啟用訊息代理程式的詳細資料,請參閱在 Xamarin iOS 與 Android 應用程式上使用 Microsoft Authenticator 或 Microsoft Intune 公司入口網站

iOS 12 與驗證的已知問題

Microsoft 發行了有關 iOS 12 與某些驗證類型之間不相容性的資訊安全諮詢。 不相容會中斷社交媒體、WSFed 和 OIDC 登入。安全性諮詢可協助您瞭解如何從您的應用程式中移除 ASP.NET 安全性限制,使其與 iOS 12 相容。

當在 Xamarin iOS 上開發 MSAL.NET 應用程式,並嘗試從 iOS 12 登入網站時,可能會看到無限迴圈。 這類行為類似於 GitHub 上的此 ADAL 問題:嘗試從 iOS 12 登入網站時的無限迴圈 #1329 (英文)。

您也可能會在具有 iOS 12 Safari 的 ASP.NET Core OIDC 驗證中看到中斷。 如需詳細資訊,請參閱此 WebKit 問題

iOS 13 與驗證的已知問題

若應用程式需要條件式存取或憑證驗證支援,請讓應用程式與 Microsoft Authenticator 代理程式應用程式通訊。 然後,MSAL 會負責處理應用程式與 Microsoft Authenticator 之間的要求與回應。

在 iOS 13 上,Apple 藉由移除應用程式透過自訂 URL 配置從外部應用程式接收回應時讀取來源應用程式的能力來進行重大 API 變更。

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+ 時,請在 Info.plist 檔案中更新 LSApplicationQueriesSchemes,並新增 msauthv3

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

    若要偵測支援 iOS 13 的裝置上是否存在最新 Microsoft Authenticator 應用程式,則必須將 msauthv3 新增至 Info.plist

回報問題

如果您有問題,或想要回報您在 MSAL.NET 中找到的問題,請在 GitHub 上的 microsoft-authentication-library-for-dotnet 存放庫中開啟問題。

下一步

如需 Xamarin iOS 屬性的資訊,請參閱下列範例 README.md 檔案的 iOS 特定考量 (英文) 段落:

範例 平台 描述
https://github.com/Azure-Samples/active-directory-xamarin-native-v2 Xamarin iOS、Android、通用 Windows 平台 (UWP) Xamarin Forms 應用程式示範如何使用 MSAL.NET,以使用 Microsoft 身分識別平台驗證公司或學校和 Microsoft 個人帳戶,並使用產生的權杖存取 Microsoft Graph。