Share via


MSAL.NET에서 Xamarin iOS를 사용하기 위한 고려 사항

Xamarin iOS에서 Microsoft Authentication Library for .NET(MSAL.NET)을 사용하는 경우 다음을 수행해야 합니다.

  • AppDelegate에서 OpenUrl함수를 재정의하고 구현합니다.
  • 키 집합 그룹을 사용하도록 설정합니다.
  • 토큰 캐시 공유를 사용하도록 설정합니다.
  • 키 집합 액세스를 사용하도록 설정합니다.
  • iOS 12 및 iOS 13 및 인증의 알려진 문제를 이해합니다.

OpenUrl 구현

FormsApplicationDelegate 파생 클래스의 OpenUrl 메서드를 재정의하고 AuthenticationContinuationHelper.SetAuthenticationContinuationEventArgs를 호출합니다. 예를 들면 다음과 같습니다.

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

또한 다음 작업을 수행합니다.

  • 리디렉션 URI 체계를 정의합니다.
  • 앱에서 다른 앱을 호출하기 위해 권한이 필요합니다.
  • 리디렉션 URI에 대한 특정 형식이 있어야 합니다.
  • Azure Portal에서 리디렉션 URI를 등록합니다.

키 집합 액세스를 사용하도록 설정

키 집합 액세스를 사용하도록 설정하려면 애플리케이션에 키 집합 액세스 그룹이 있는지 확인합니다. WithIosKeychainSecurityGroup() API를 사용하여 애플리케이션을 만들 때 키 집합 액세스 그룹을 설정할 수 있습니다.

캐시 및 SSO(Single Sign-On)를 활용하려면 모든 애플리케이션에서 키 집합 액세스 그룹을 동일한 값으로 설정합니다.

이 설치 예제에서는 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은 애플리케이션의 팀 ID(AppIdentifierPrefix) 끝에 보안 그룹을 자동으로 추가합니다. Xcode에서 애플리케이션을 빌드할 때 동일한 작업을 수행하기 때문에 MSAL은 보안 그룹을 추가합니다. 이러한 이유로 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 애플리케이션 및 ADAL.objc 또는 MSAL.objc에서 개발한 네이티브 iOS 애플리케이션 간에 토큰 캐시를 공유할 수 있습니다.

토큰 캐시를 공유하면 동일한 키 집합 액세스 그룹을 사용하는 모든 애플리케이션에서 SSO(Single Sign-On)를 허용할 수 있습니다.

이 캐시 공유를 사용하도록 설정하려면 WithIosKeychainSecurityGroup() 메서드를 사용하여 동일한 캐시를 공유하는 모든 애플리케이션에서 키 집합 액세스 그룹을 동일한 값으로 설정합니다. 이 문서의 첫 번째 코드 예제에서는 이 메서드를 사용하는 방법을 보여 줍니다.

이 문서의 앞부분에서 MSAL이 WithIosKeychainSecurityGroup() API를 사용할 때마다 $(AppIdentifierPrefix)를 추가한다는 사실을 확인했습니다. 팀 ID AppIdentifierPrefix는 동일한 게시자가 만든 애플리케이션만 키 집합 액세스를 공유할 수 있도록 하기 때문에 MSAL은 이 요소를 추가합니다.

참고 항목

KeychainSecurityGroup 속성은 더 이상 사용되지 않습니다. 대신 iOSKeychainSecurityGroup 속성을 사용합니다. iOSKeychainSecurityGroup을 사용할 때는 TeamId 접두사가 필요하지 않습니다.

Microsoft Authenticator 사용

애플리케이션에서 Microsoft Authenticator를 broker로 사용하여 다음을 지원할 수 있습니다.

  • SSO: SSO를 사용하도록 설정하면 사용자가 각 애플리케이션에 로그인할 필요가 없습니다.
  • 디바이스 식별: 디바이스 ID를 사용하여 디바이스 인증서에 액세스하여 인증합니다. 이 인증서는 작업 공간에 조인될 때 디바이스에 생성됩니다. 테넌트 관리자가 디바이스와 관련된 조건부 액세스를 사용하도록 설정하면 애플리케이션을 사용할 준비가 됩니다.
  • 애플리케이션 ID 확인: 애플리케이션에서 브로커를 호출할 때 해당 리디렉션 URL을 전달합니다. broker가 리디렉션 URL을 확인합니다.

broker를 사용하도록 설정하는 방법에 대한 자세한 내용은 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: iOS 12 #1329에서 웹 사이트에 로그인하려고 할 때 무한 루프 발생(Infinite loop when trying to login to website from iOS 12 #1329)에 나오는 이 ADAL 문제와 비슷합니다.

iOS 12 Safari를 사용하는 ASP.NET Core OIDC 인증에 문제가 있는 것을 볼 수도 있습니다. 자세한 내용은 이 WebKit 이슈를 참조하세요.

iOS 13 및 인증의 알려진 문제

앱에 조건부 액세스 또는 인증서 인증 지원이 필요한 경우 앱이 Microsoft Authenticator broker 앱과 통신할 수 있도록 설정합니다. 그러면 MSAL이 애플리케이션과 Microsoft Authenticator 간의 요청 및 응답을 처리하는 일을 담당합니다.

iOS 13에서 Apple은 사용자 지정 URL 체계를 통해 외부 애플리케이션에서 응답을 받을 때 원본 애플리케이션을 읽는 애플리케이션의 기능을 제거하여 API를 획기적으로 변경했습니다.

UIApplicationOpenURLOptionsSourceApplicationKey 상태에 대한 Apple 설명서:

팀에 속한 다른 앱에서 요청이 발생한 경우, UIKit 이 키의 값을 해당 앱의 ID로 설정합니다. 발신 앱의 팀 식별자가 현재 앱의 팀 식별자와 다른 경우, 이 키의 해당 값은 0이 됩니다.

MSAL은 MSAL과 Microsoft Authenticator 앱 간의 통신을 확인하기 위해 UIApplication.SharedApplication.OpenUrl에 의존하기 때문에 이러한 변경은 매우 획기적인 것입니다.

또한 iOS 13에서 개발자는 ASWebAuthenticationSession을 사용할 때 프레젠테이션 컨트롤러를 제공해야 합니다.

Xcode 11을 사용하여 빌드하는 중이며 iOS broker 또는 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 앱이 있는지 검색하려면 Info.plistmsauthv3를 추가해야 합니다.

문제 보고

질문이 있거나 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, UWP(유니버설 Windows 플랫폼) MSAL.NET을 사용하여 Microsoft ID 플랫폼을 사용하여 회사 또는 학교 및 Microsoft 개인 계정을 인증하고 결과 토큰으로 Microsoft Graph에 액세스하는 방법을 보여주는 Xamarin Forms 앱.