Xamarin 애플리케이션에서 Microsoft Authenticator 또는 Intune 회사 포털 사용
Android와 iOS에서 Microsoft Authenticator 및 Android 관련 Microsoft Intune 회사 포털과 같은 브로커는 다음을 지원합니다.
- SSO(Single Sign-On): 사용자가 각 애플리케이션에 로그인할 필요가 없습니다.
- 디바이스 식별: 브로커가 디바이스 인증서에 액세스합니다. 이 인증서는 작업 공간에 조인될 때 디바이스에 생성됩니다.
- 애플리케이션 ID 확인: 애플리케이션에서 브로커를 호출할 때 해당 리디렉션 URL을 전달합니다. 브로커가 URL을 확인합니다.
이러한 기능 중 하나를 사용하려면 WithBroker()
메서드를 호출할 때 PublicClientApplicationBuilder.CreateApplication
매개 변수를 사용합니다.
.WithBroker()
매개 변수는 true로 기본 설정됩니다.
.NET용 Microsoft 인증 라이브러리(MSAL.NET)에서 조정된 인증 설정은 플랫폼에 따라 다릅니다.
참고 항목
MSAL.NET 버전 4.61.0 이상에서는 UWP(유니버설 Windows 플랫폼), Xamarin Android 및 Xamarin iOS를 지원하지 않습니다. Xamarin 애플리케이션을 MAUI와 같은 최신 프레임워크로 마이그레이션하는 것이 좋습니다. Xamarin 및 UWP용 MSAL.NET의 향후 사용 중단 발표에서 사용 중단에 대해 자세히 알아보세요.
iOS에 대한 조정된 인증
다음 단계에 따라 Xamarin.iOS 앱이 Microsoft Authenticator 앱과 통신할 수 있도록 설정합니다. iOS 13을 대상으로 하는 경우 Apple의 호환성이 손상되는 API 변경에 대해 읽어보세요.
1단계: 브로커 지원 사용
PublicClientApplication
의 개별 인스턴스에 대해 브로커 지원을 사용하도록 설정해야 합니다. 지원은 기본적으로 사용되지 않습니다.
PublicClientApplication
를 통해 PublicClientApplicationBuilder
을 만들 때 다음 예와 같이 WithBroker()
매개 변수를 사용합니다.
WithBroker()
매개 변수는 true로 기본 설정됩니다.
var app = PublicClientApplicationBuilder
.Create(ClientId)
.WithBroker()
.WithReplyUri(redirectUriOnIos) // $"msauth.{Bundle.Id}://auth" (see step 6 below)
.Build();
2단계: 키 집합 액세스 사용
키 집합 액세스를 사용하도록 설정하려면 애플리케이션에 대한 키 집합 액세스 그룹이 있어야 합니다.
WithIosKeychainSecurityGroup()
API를 사용하여 애플리케이션을 만들 때 키 집합 액세스 그룹을 설정할 수 있습니다.
var builder = PublicClientApplicationBuilder
.Create(ClientId)
.WithIosKeychainSecurityGroup("com.microsoft.adalcache")
.Build();
자세한 내용은 키 집합 액세스 사용을 참조하세요.
3단계: 콜백을 처리하도록 AppDelegate 업데이트
MSAL.NET에서 브로커를 호출하면 브로커가 OpenUrl
클래스의 AppDelegate
메서드를 통해 애플리케이션을 다시 호출합니다. MSAL에서 브로커의 응답을 대기하므로 애플리케이션은 협력하여 MSAL.NET을 다시 호출해야 합니다. 이 협력을 사용하도록 설정하려면 AppDelegate.cs 파일을 업데이트하여 다음 메서드를 재정의합니다.
public override bool OpenUrl(UIApplication app, NSUrl url,
string sourceApplication,
NSObject annotation)
{
if (AuthenticationContinuationHelper.IsBrokerResponse(sourceApplication))
{
AuthenticationContinuationHelper.SetBrokerContinuationEventArgs(url);
return true;
}
else if (!AuthenticationContinuationHelper.SetAuthenticationContinuationEventArgs(url))
{
return false;
}
return true;
}
이 메서드는 애플리케이션이 시작될 때마다 호출됩니다. 이는 브로커의 응답을 처리하고 MSAL.NET이 시작한 인증 프로세스를 완료하는 기회로 사용됩니다.
4단계: UIViewController() 설정
AppDelegate.cs 파일에서 개체 창을 설정합니다. 일반적으로 Xamarin iOS에 대한 개체 창을 설정하지 않아도 되지만 브로커의 응답을 보내고 받으려면 개체 창이 필요합니다.
개체 창을 설정하려면 다음을 수행합니다.
AppDelegate.cs 파일에서
App.RootViewController
를 새UIViewController()
로 설정합니다. 이렇게 할당하면 브로커에 대한 호출에UIViewController
가 포함됩니다. 이 설정이 잘못 할당되면 다음과 같은 오류가 발생할 수 있습니다."uiviewcontroller_required_for_ios_broker":"UIViewController is null, so MSAL.NET cannot invoke the iOS broker. See https://aka.ms/msal-net-ios-broker"
AcquireTokenInteractive
호출에서.WithParentActivityOrWindow(App.RootViewController)
를 사용하고 사용할 개체 창에 대한 참조를 전달합니다.App.cs에서
public static object RootViewController { get; set; }
AppDelegate.cs에서
LoadApplication(new App()); App.RootViewController = new UIViewController();
AcquireToken
호출에서result = await app.AcquireTokenInteractive(scopes) .WithParentActivityOrWindow(App.RootViewController) .ExecuteAsync();
5단계: URL 구성표 등록
MSAL.NET은 URL을 사용하여 브로커를 호출한 다음, 앱에 브로커 응답을 반환합니다. 왕복을 완료하려면 info.plist 파일에 앱에 대한 URL 구성표를 등록합니다.
CFBundleURLSchemes
이름에는 msauth.
가 접두사로 포함되어야 합니다. 접두사 뒤에 CFBundleURLName
을 붙입니다.
URL 구성표에서는 BundleId
로 $"msauth.(BundleId)"
앱이 고유하게 식별됩니다. 따라서 BundleId
가 com.yourcompany.xforms
인 경우 URL 구성표는 msauth.com.yourcompany.xforms
입니다.
참고 항목
이 URL 구성표는 브로커의 응답을 받을 때 앱을 고유하게 식별하는 리디렉션 URI의 일부가 됩니다.
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>CFBundleURLName</key>
<string>com.yourcompany.xforms</string>
<key>CFBundleURLSchemes</key>
<array>
<string>msauth.com.yourcompany.xforms</string>
</array>
</dict>
</array>
6단계: LSApplicationQueriesSchemes 섹션에 브로커 식별자 추가
MSAL은 –canOpenURL:
을 사용하여 브로커가 디바이스에 설치되어 있는지 확인합니다. iOS 9에서 Apple은 애플리케이션에서 쿼리할 수 있는 구성표를 잠궜습니다.
다음 예와 같이 msauthv2
파일의 LSApplicationQueriesSchemes
섹션에 를 추가합니다.
<key>LSApplicationQueriesSchemes</key>
<array>
<string>msauthv2</string>
<string>msauthv3</string>
</array>
7단계: 앱 등록에 리디렉션 URI 추가
브로커를 사용하는 경우 리디렉션 URI에는 추가 요구 사항이 있습니다. 리디렉션 URI의 형식은 다음과 같아야 합니다.
$"msauth.{BundleId}://auth"
예를 들면 다음과 같습니다.
public static string redirectUriOnIos = "msauth.com.yourcompany.XForms://auth";
리디렉션 URI는 CFBundleURLSchemes
파일에 포함한 이름과 일치합니다.
리디렉션 URI를 앱 등록에 추가합니다. 올바른 형식의 리디렉션 URI를 생성하려면 앱 등록을 사용하여 번들 ID에서 조정된 리디렉션 URI를 생성합니다.
리디렉션 URI를 생성하려면
최소한 클라우드 애플리케이션 관리자로 Microsoft Entra 관리 센터에 로그인합니다.
ID>애플리케이션>앱 등록으로 이동합니다.
애플리케이션을 검색하여 선택합니다.
인증>플랫폼 추가>iOS/macOS를 선택합니다.
번들 ID를 입력하고 구성을 선택합니다.
코드에 포함할 리디렉션 URI 텍스트 상자에 표시되는 생성된 리디렉션 URI를 복사합니다.
완료를 선택하여 리디렉션 URI 생성을 완료합니다.
Android에 대한 조정된 인증
1단계: 브로커 지원 사용
브로커 지원은 PublicClientApplication
별로 사용하도록 설정됩니다. 기본적으로 비활성화되어 있습니다.
WithBroker()
를 통해 IPublicClientApplication
를 만들 때 PublicClientApplicationBuilder
매개 변수(기본적으로 true로 설정됨)를 사용합니다.
var app = PublicClientApplicationBuilder
.Create(ClientId)
.WithBroker()
.WithRedirectUri(redirectUriOnAndroid) // See step #4
.Build();
2단계: 콜백을 처리하도록 주 활동 업데이트
MSAL.NET에서 브로커를 호출하면 브로커는 OnActivityResult()
메서드로 애플리케이션을 다시 호출합니다. MSAL에서 브로커의 응답을 기다리므로 애플리케이션에서 결과를 MSAL.NET으로 라우팅해야 합니다.
다음과 같이 SetAuthenticationContinuationEventArgs(int requestCode, Result resultCode, Intent data)
메서드를 재정의하여 결과를 OnActivityResult()
메서드로 라우팅합니다.
protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)
{
base.OnActivityResult(requestCode, resultCode, data);
AuthenticationContinuationHelper.SetAuthenticationContinuationEventArgs(requestCode, resultCode, data);
}
이 메서드는 브로커 애플리케이션이 시작될 때마다 호출되며 브로커의 응답을 처리하고 MSAL.NET에서 시작한 인증 프로세스를 완료할 수 있는 기회로 사용됩니다.
3단계: 작업 설정
조정된 인증을 사용하도록 설정하려면 MSAL에서 브로커와 응답을 보내고 받을 수 있도록 작업을 설정합니다. 이렇게 하려면 작업(일반적으로 MainActivity
)을 부모 개체인 WithParentActivityOrWindow(object parent)
에 제공합니다.
예를 들어, AcquireTokenInteractive()
호출에서 다음을 수행합니다.
result = await app.AcquireTokenInteractive(scopes)
.WithParentActivityOrWindow((Activity)context))
.ExecuteAsync();
4단계: 앱 등록에 리디렉션 URI 추가
MSAL은 URL을 사용하여 브로커를 호출한 다음, 앱에 반환합니다. 이 왕복을 완료하려면 앱에 대한 리디렉션 URI를 등록합니다.
애플리케이션에 대한 리디렉션 URI의 형식은 APK 서명에 사용되는 인증서에 따라 다릅니다. 예시:
msauth://com.microsoft.xforms.testApp/hgbUYHVBYUTvuvT&Y6tr554365466=
URI의 마지막 부분인 hgbUYHVBYUTvuvT&Y6tr554365466=
는 APK 서명에 사용되는 Base64로 인코딩된 버전의 서명입니다. Visual Studio에서 앱을 개발하는 동안 특정 인증서로 APK에 서명하지 않고 코드를 디버깅하는 경우 Visual Studio는 디버깅을 위해 APK에 서명합니다. 이러한 방식으로 Visual Studio에서 APK에 서명하면 기반 컴퓨터에 대한 고유한 서명이 제공됩니다. 따라서 다른 컴퓨터에서 앱을 빌드할 때마다 MSAL로 인증하려면 애플리케이션 코드의 리디렉션 URI와 애플리케이션 등록을 업데이트해야 합니다.
디버깅하는 동안 제공된 리디렉션 URI가 잘못되었음을 나타내는 MSAL 예외(또는 로그 메시지)가 발생할 수 있습니다. 예외 또는 로그 메시지는 디버깅 중인 현재 컴퓨터에서 사용해야 하는 리디렉션 URI도 나타냅니다. 코드에서 리디렉션 URI를 업데이트하고 제공된 리디렉션 URI를 앱 등록에 추가하기만 하면 제공된 리디렉션 URI를 사용하여 앱을 계속 개발할 수 있습니다.
코드를 완료할 준비가 되면 코드에서 리디렉션 URI를 업데이트하고 애플리케이션 등록을 업데이트하여 APK 서명에 사용하는 인증서의 서명을 사용합니다.
실제로 이는 개발 팀의 각 구성원에 대한 리디렉션 URI와 프로덕션 서명된 버전의 APK에 대한 리디렉션 URI를 추가하는 것을 고려해야 함을 의미합니다.
MSAL에서 이를 수행하는 방식과 비슷하게 서명을 직접 계산할 수 있습니다.
private string GetRedirectUriForBroker()
{
string packageName = Application.Context.PackageName;
string signatureDigest = this.GetCurrentSignatureForPackage(packageName);
if (!string.IsNullOrEmpty(signatureDigest))
{
return string.Format(CultureInfo.InvariantCulture, "{0}://{1}/{2}", RedirectUriScheme,
packageName.ToLowerInvariant(), signatureDigest);
}
return string.Empty;
}
private string GetCurrentSignatureForPackage(string packageName)
{
Android.Content.PM.Signature signature = null;
if (Build.VERSION.SdkInt >= BuildVersionCodes.Tiramisu)
{
var packageInfo = Application.Context.PackageManager.GetPackageInfo(packageName, PackageManager.PackageInfoFlags.Of((long)PackageInfoFlags.SigningCertificates));
if (packageInfo.SigningInfo != null)
{
var signatures = packageInfo.SigningInfo.GetApkContentsSigners();
if (signatures != null && signatures.Length > 0)
signature = signatures[0];
}
}
else
{
#pragma warning disable CS0618 // Type or member is obsolete
var packageInfo = Application.Context.PackageManager.GetPackageInfo(packageName, PackageInfoFlags.Signatures);
if (packageInfo != null && packageInfo.Signatures != null && packageInfo.Signatures.Count > 0)
signature = packageInfo.Signatures[0];
#pragma warning restore CS0618 // Type or member is obsolete
}
if (signature != null)
{
// First available signature. Applications can be signed with multiple signatures.
// The order of Signatures is not guaranteed.
var md = MessageDigest.GetInstance("SHA");
md.Update(signature.ToByteArray());
return Convert.ToBase64String(md.Digest(), Base64FormattingOptions.None);
// Server side needs to register all other tags. ADAL will
// send one of them.
}
}
다음 명령으로 keytool을 사용하여 패키지에 대한 서명을 가져오는 옵션도 있습니다.
- Windows:
keytool.exe -list -v -keystore "%LocalAppData%\Xamarin\Mono for Android\debug.keystore" -alias androiddebugkey -storepass android -keypass android
- macOS:
keytool -exportcert -alias androiddebugkey -keystore ~/.android/debug.keystore | openssl sha1 -binary | openssl base64
5단계(선택 사항): 시스템 브라우저로 변경
MSAL이 브로커를 사용하도록 구성되었지만 브로커가 설치되어 있지 않은 경우 MSAL은 대신 웹 보기(브라우저)를 사용합니다. MSAL은 디바이스에서 기본 시스템 브라우저를 사용하여 인증을 시도하지만 리디렉션 URI가 브로커에 대해 구성되어 있고 시스템 브라우저는 이를 사용하여 MSAL로 다시 이동하는 방법을 모르기 때문에 실패합니다. 실패를 방지하려면 4단계에서 사용한 브로커 리디렉션 URI로 의도 필터를 구성하면 됩니다.
애플리케이션의 매니페스트를 수정하여 의도 필터를 추가합니다.
<!-- NOTE the SLASH (required) that prefixes the signature value in the path attribute.
The signature value is the Base64-encoded signature discussed above. -->
<intent-filter>
<data android:scheme="msauth"
android:host="Package Name"
android:path="/Package Signature"/>
예를 들어 msauth://com.microsoft.xforms.testApp/hgbUYHVBYUTvuvT&Y6tr554365466=
의 리디렉션 URI가 있는 경우 매니페스트는 다음 XML 조각과 유사해야 합니다.
/
값의 서명 앞에 슬래시(android:path
)가 필요합니다.
<!-- NOTE the SLASH (required) that prefixes the signature value in the path attribute.
The signature value is the Base64-encoded signature discussed above. -->
<intent-filter>
<data android:scheme="msauth"
android:host="com.microsoft.xforms.testApp"
android:path="/hgbUYHVBYUTvuvT&Y6tr554365466="/>
시스템 브라우저 및 Android 11 지원을 위한 애플리케이션 구성에 대한 자세한 내용은 시스템 브라우저 지원을 위한 Android 매니페스트 업데이트를 참조하세요.
또는 리디렉션 URI를 사용하지 않는 포함된 브라우저로 변경되도록 MSAL을 구성할 수 있습니다.
.WithUseEmbeddedWebUi(true)
Android 조정된 인증에 대한 문제 해결 팁
다음은 Android에서 조정된 인증을 구현할 때 발생하는 문제를 방지하기 위한 몇 가지 팁입니다.
리디렉션 URI - 애플리케이션 등록에 리디렉션 URI를 추가합니다. 누락되거나 잘못된 리디렉션 URI는 개발자에게 발생하는 일반적인 문제입니다.
브로커 버전 - 필요한 최소 버전의 브로커 앱을 설치합니다. Android에서 조정된 인증에 이러한 두 앱 중 하나를 사용할 수 있습니다.
- Intune 회사 포털(버전 5.0.4689.0 이상)
- Microsoft Authenticator(버전 6.2001.0140 이상).
브로커 우선 순위 - MSAL은 여러 브로커가 설치된 경우 디바이스에 설치된 첫 번째 브로커와 통신합니다.
예: 먼저 Microsoft Authenticator를 설치하고 Intune 회사 포털을 설치하는 경우 조정된 인증은 Microsoft Authenticator에서만 수행됩니다.
로그 -조정된 인증에 문제가 발생하는 경우 브로커의 로그를 보면 원인을 진단하는 데 도움이 될 수 있습니다.
Microsoft Authenticator 로그 가져오기:
- 앱의 오른쪽 위 모퉁이에 있는 메뉴 단추를 선택합니다.
- 사용자 의견 보내기>문제가 있나요?를 선택합니다.
- 수행하려는 작업이 무엇인가요? 아래에서 옵션을 선택하고 설명을 추가합니다.
- 로그를 보내려면 앱의 오른쪽 위 모퉁이에 있는 화살표를 선택합니다.
로그를 보낸 후 대화 상자에 인시던트 ID가 표시됩니다. 인시던트 ID를 기록하고 지원을 요청할 때 포함합니다.
Intune 회사 포털 로그 가져오기:
- 앱의 왼쪽 위 모퉁이에 있는 메뉴 단추를 선택합니다.
- 도움말>이메일 지원을 선택합니다.
- 로그를 보내려면 로그만 업로드를 선택합니다.
로그를 보낸 후 대화 상자에 인시던트 ID가 표시됩니다. 인시던트 ID를 기록하고 지원을 요청할 때 포함합니다.
다음 단계
MSAL.NET과 함께 유니버설 Windows 플랫폼을 사용하기 위한 고려 사항에 대해 알아봅니다.