Share via


搭配使用 Xamarin iOS 與 MSAL.NET 的考慮

當您在 Xamarin iOS 上使用適用於 .NET 的 Microsoft 驗證連結庫 (MSAL.NET),您應該:

  • 在中覆寫並實作 AppDelegateOpenUrl式。
  • 啟用金鑰鏈群組。
  • 啟用令牌快取共用。
  • 啟用金鑰鏈存取。
  • 瞭解 iOS 12 和 iOS 13 和驗證的已知問題。

實作 OpenUrl

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

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

此外,請執行下列工作:

啟用金鑰鏈存取

若要啟用金鑰鏈存取,請確定您的應用程式具有金鑰鏈存取群組。 當您使用 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 中建置應用程式時,它會執行相同的動作。 這就是為什麼檔案中 Entitlements.plist 的權利需要在密鑰鏈存取群組之前包含 $(AppIdentifierPrefix)

如需詳細資訊,請參閱 iOS 權利檔

針對 KeyChain 存取進行疑難解答

如果您收到類似「應用程式無法存取應用程式發行者的 iOS 金鑰鏈」的錯誤訊息(TeamId 為 null),這表示 MSAL 無法存取 KeyChain。 這是設定問題。 若要進行疑難解答,請嘗試自行存取 KeyChain,例如:

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 登入網站時的 Infinite 迴圈。

您也可以在 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 應用程式是否存在,就必須新增 msauthv3Info.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。