Xamarin uygulamalarında Microsoft Authenticator veya Intune Şirket Portalı kullanma

Android ve iOS'ta Microsoft Authenticator ve Android'e özgü Microsoft Intune Şirket Portalı gibi aracılar şunları etkinleştirir:

  • Çoklu oturum açma (SSO):Kullanıcıların her uygulamada oturum açması gerekmez.
  • Cihaz kimliği: Aracı, cihaz sertifikasına erişir. Bu sertifika, çalışma alanına katıldığında cihazda oluşturulur.
  • Uygulama tanımlama doğrulaması: Bir uygulama aracıyı çağırdığında yeniden yönlendirme URL'sini geçirir. Aracı URL'yi doğrular.

Bu özelliklerden birini etkinleştirmek için yöntemini çağırırken parametresini PublicClientApplicationBuilder.CreateApplication kullanınWithBroker(). .WithBroker() parametresi varsayılan olarak true olarak ayarlanır.

.NET (MSAL.NET) için Microsoft Kimlik Doğrulama Kitaplığı'nda aracılı kimlik doğrulaması kurulumu platforma göre değişir:

iOS için aracılı kimlik doğrulaması

Xamarin.iOS uygulamanızın Microsoft Authenticator uygulamasıyla iletişim kurmasını sağlamak için aşağıdaki adımları kullanın. iOS 13'i hedeflediyseniz Apple'ın hataya neden olan API değişikliğini okumayı göz önünde bulundurun.

1. Adım: Aracı desteğini etkinleştirme

tek tek örnekleri PublicClientApplicationiçin aracı desteğini etkinleştirmeniz gerekir. Destek varsayılan olarak devre dışıdır. aracılığıyla PublicClientApplicationBuilderoluşturduğunuzdaPublicClientApplication, aşağıdaki örnekte gösterildiği gibi parametresini kullanınWithBroker(). WithBroker() parametresi varsayılan olarak true olarak ayarlanır.

var app = PublicClientApplicationBuilder
                .Create(ClientId)
                .WithBroker()
                .WithReplyUri(redirectUriOnIos) // $"msauth.{Bundle.Id}://auth" (see step 6 below)
                .Build();

2. Adım: Anahtarlık erişimini etkinleştirme

Anahtarlık erişimini etkinleştirmek için, uygulamanız için bir anahtarlık erişim grubuna sahip olmanız gerekir. Uygulamanızı oluştururken anahtarlık erişim grubunuzu ayarlamak için API'yi kullanabilirsiniz WithIosKeychainSecurityGroup() :

var builder = PublicClientApplicationBuilder
     .Create(ClientId)
     .WithIosKeychainSecurityGroup("com.microsoft.adalcache")
     .Build();

Daha fazla bilgi için bkz . Anahtarlık erişimini etkinleştirme.

3. Adım: AppDelegate'i geri çağırmayı işleyecek şekilde güncelleştirme

MSAL.NET aracıyı çağırdığında, aracı sınıfı yöntemi AppDelegate aracılığıyla OpenUrl uygulamanıza geri çağırır. MSAL aracının yanıtını beklediğinden uygulamanızın MSAL.NET geri çağırmak için işbirliği yapması gerekir. Bu işbirliğini etkinleştirmek için AppDelegate.cs dosyasını aşağıdaki yöntemi geçersiz kacak şekilde güncelleştirin.

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;
}

Bu yöntem, uygulama her başlatıldığında çağrılır. Aracıdan gelen yanıtı işlemek ve MSAL.NET başlatılan kimlik doğrulama işlemini tamamlamak için bir fırsat olarak kullanılır.

4. Adım: UIViewController() Ayarlama

Hala AppDelegate.cs dosyasında bir nesne penceresi ayarlayın. Genellikle Xamarin iOS için nesne penceresini ayarlamanız gerekmez, ancak aracıdan yanıt göndermek ve almak için bir nesne penceresine ihtiyacınız vardır.

Nesne penceresini ayarlamak için:

  1. AppDelegate.cs dosyasında yeni UIViewController()olarak ayarlayınApp.RootViewController. Bu atama, aracıya yapılan çağrının içermesini UIViewControllersağlar. Bu ayar yanlış atanmışsa şu hatayı alabilirsiniz:

    "uiviewcontroller_required_for_ios_broker":"UIViewController is null, so MSAL.NET cannot invoke the iOS broker. See https://aka.ms/msal-net-ios-broker"

  2. Çağrısında AcquireTokenInteractive kullanın .WithParentActivityOrWindow(App.RootViewController) ve ardından kullanacağınız nesne penceresine başvuruyu geçirin.

    App.cs dosyasında:

       public static object RootViewController { get; set; }
    

    AppDelegate.cs dosyasında:

       LoadApplication(new App());
       App.RootViewController = new UIViewController();
    

    Aramada AcquireToken :

    result = await app.AcquireTokenInteractive(scopes)
                 .WithParentActivityOrWindow(App.RootViewController)
                 .ExecuteAsync();
    

5. Adım: URL düzenini kaydetme

MSAL.NET, aracıyı çağırmak ve ardından aracı yanıtını uygulamanıza döndürmek için URL'leri kullanır. Gidiş dönüş işlemini tamamlamak için Info.plist dosyasına uygulamanız için bir URL düzeni kaydedin.

Adın CFBundleURLSchemes önek olarak eklenmesi msauth. gerekir. ön ekini ile CFBundleURLNameizleyin.

URL düzeninde, BundleId uygulamayı benzersiz olarak tanımlar: $"msauth.(BundleId)". Bu nedenle, ise BundleIdcom.yourcompany.xformsURL düzeni şeklindedir msauth.com.yourcompany.xforms.

Dekont

Bu URL düzeni, aracıdan yanıt aldığında uygulamanızı benzersiz olarak tanımlayan yeniden yönlendirme URI'sinin bir parçası olur.

 <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. Adım: Aracı tanımlayıcısını LSApplicationQueriesSchemes bölümüne ekleme

MSAL, aracının cihazda yüklü olup olmadığını denetlemek için kullanır –canOpenURL: . iOS 9'da Apple, bir uygulamanın sorgulayabileceğiniz düzenleri kilitledi.

Aşağıdaki örnekte olduğu LSApplicationQueriesSchemes gibi Info.plist dosyasının bölümüne ekleyinmsauthv2:

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

7. Adım: Uygulama kaydınıza yeniden yönlendirme URI'sini ekleme

Bahşiş

Bu makaledeki adımlar, başladığınız portala göre biraz değişiklik gösterebilir.

Aracıyı kullandığınızda, yeniden yönlendirme URI'nizin ek bir gereksinimi vardır. Yeniden yönlendirme URI'sinin biçimi aşağıdaki olmalıdır :

$"msauth.{BundleId}://auth"

Bir örnek aşağıda verilmiştir:

public static string redirectUriOnIos = "msauth.com.yourcompany.XForms://auth";

Yeniden yönlendirme URI'sinin Info.plist dosyasına eklediğiniz adla eşleştiğinden CFBundleURLSchemesemin olun.

Yeniden yönlendirme URI'sini uygulamanın kaydına ekleyin. Düzgün biçimlendirilmiş bir yeniden yönlendirme URI'si oluşturmak için Uygulama kayıtları kullanarak paket kimliğinden aracılı yeniden yönlendirme URI'sini oluşturun.

Yeniden yönlendirme URI'sini oluşturmak için:

  1. Microsoft Entra yönetim merkezinde en azından bir Bulut Uygulaması Yönetici istrator olarak oturum açın.

  2. Kimlik>Uygulamaları'na> göz atın Uygulama kayıtları.

  3. Uygulamayı arayın ve seçin.

  4. Kimlik Doğrulaması>Platform>ekle iOS / macOS'ı seçin

  5. Paket kimliğinizi girin ve Yapılandır'ı seçin.

    Kodunuza eklemek için Yeniden Yönlendirme URI'sini yeniden yönlendirme metin kutusunda görüntülenen oluşturulan yeniden yönlendirme URI'sini kopyalayın:

    iOS platform settings with generated redirect URI

  6. Yeniden yönlendirme URI'sinin oluşturulmasını tamamlamak için Bitti'yi seçin.

Android için aracılı kimlik doğrulaması

1. Adım: Aracı desteğini etkinleştirme

Aracı desteği ayrı ayrı etkinleştirilirPublicClientApplication . Varsayılan olarak devre dışıdır. WithBroker() aracılığıyla PublicClientApplicationBuilderoluştururken IPublicClientApplication parametresini kullanın (varsayılan olarak true olarak ayarlayın).

var app = PublicClientApplicationBuilder
                .Create(ClientId)
                .WithBroker()
                .WithRedirectUri(redirectUriOnAndroid) // See step #4
                .Build();

2. Adım: Geri çağırmayı işlemek için ana etkinliği güncelleştirme

MSAL.NET aracıyı çağırdığında, aracı da yöntemiyle OnActivityResult() uygulamanıza geri döner. MSAL aracıdan yanıtı bekleyeceğinden, uygulamanızın sonucu MSAL.NET yönlendirmesi gerekir.

Burada gösterildiği gibi yöntemini geçersiz kılarak sonucu SetAuthenticationContinuationEventArgs(int requestCode, Result resultCode, Intent data) yöntemine yönlendirin OnActivityResult() :

protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)
{
   base.OnActivityResult(requestCode, resultCode, data);
   AuthenticationContinuationHelper.SetAuthenticationContinuationEventArgs(requestCode, resultCode, data);
}

Bu yöntem, aracı uygulaması her başlatıldığında çağrılır ve aracıdan gelen yanıtı işlemek ve MSAL.NET tarafından başlatılan kimlik doğrulama işlemini tamamlamak için bir fırsat olarak kullanılır.

3. Adım: Etkinlik Ayarlama

Aracılı kimlik doğrulamasını etkinleştirmek için MSAL'nin aracıya ve aracıdan yanıt gönderip alabilmesi için bir etkinlik ayarlayın. Bunu yapmak için, üst nesneye WithParentActivityOrWindow(object parent) etkinliği (genellikle ) MainActivitysağlayın.

Örneğin, çağrısında AcquireTokenInteractive():

result = await app.AcquireTokenInteractive(scopes)
             .WithParentActivityOrWindow((Activity)context))
             .ExecuteAsync();

4. Adım: Uygulama kaydınıza yeniden yönlendirme URI'sini ekleme

MSAL, aracıyı çağırmak ve ardından uygulamanıza dönmek için URL'leri kullanır. Bu gidiş dönüş işlemini tamamlamak için uygulamanız için bir Yeniden Yönlendirme URI'sini kaydedin.

Uygulamanız için yeniden yönlendirme URI'sinin biçimi APK'yi imzalamak için kullanılan sertifikaya bağlıdır. Örneğin:

msauth://com.microsoft.xforms.testApp/hgbUYHVBYUTvuvT&Y6tr554365466=

URI'nin son bölümü, hgbUYHVBYUTvuvT&Y6tr554365466=APK'nın imzalı olduğu imzanın Base64 ile kodlanmış sürümüdür. Visual Studio'da uygulamanızı geliştirirken, APK'yı belirli bir sertifikayla imzalamadan kodunuzun hatalarını ayıklarsanız, Visual Studio hata ayıklama amacıyla APK'yı sizin için imzalar. Visual Studio APK'yı sizin için bu şekilde imzaladığında, üzerine oluşturulduğu makine için benzersiz bir imza verir. Bu nedenle, uygulamanızı farklı bir makinede her derlediğinizde, MSAL ile kimlik doğrulaması yapmak için uygulamanın kodundaki yeniden yönlendirme URI'sini ve uygulamanın kaydını güncelleştirmeniz gerekir.

Hata ayıklama sırasında, sağlanan yeniden yönlendirme URI'sinin yanlış olduğunu belirten bir MSAL özel durumu (veya günlük iletisi) ile karşılaşabilirsiniz. Özel durum veya günlük iletisi, hata ayıkladığınız geçerli makinede kullanmanız gereken yeniden yönlendirme URI'sini de gösterir. Kodda yeniden yönlendirme URI'sini güncelleştirdiğiniz ve sağlanan yeniden yönlendirme URI'sini uygulamanın kaydına eklediğiniz sürece uygulamanızı geliştirmeye devam etmek için sağlanan yeniden yönlendirme URI'sini kullanabilirsiniz.

Kodunuzu sonlandırmaya hazır olduğunuzda koddaki yeniden yönlendirme URI'sini ve uygulamanın kaydını APK'yı imzaladığınız sertifikanın imzasını kullanacak şekilde güncelleştirin.

Pratikte bu, geliştirme ekibinizin her üyesi için bir yeniden yönlendirme URI'sinin yanı sıra APK'nın üretim imzalı sürümü için bir yeniden yönlendirme URI'sini de eklemeniz gerektiği anlamına gelir.

MSAL'nin yaptığı gibi imzayı kendiniz hesaplayabilirsiniz:

   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.
      }
   }

Ayrıca aşağıdaki komutlarla keytool kullanarak paketinizin imzasını alma seçeneğiniz de vardır:

  • 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. Adım (isteğe bağlı): Sistem tarayıcısına geri dönün

MSAL aracıyı kullanacak şekilde yapılandırılmışsa ancak aracı yüklü değilse, MSAL bir web görünümü (tarayıcı) kullanmaya geri döner. MSAL, aracı için yeniden yönlendirme URI'sini yapılandırdığından ve sistem tarayıcısı MSAL'ye geri dönmek için nasıl kullanılacağını bilmediğinden cihazdaki varsayılan sistem tarayıcısını kullanarak kimlik doğrulamayı dener. Hatayı önlemek için, 4. adımda kullandığınız aracı yeniden yönlendirme URI'siyle bir amaç filtresi yapılandırabilirsiniz.

Amaç filtresini eklemek için uygulamanızın bildirimini değiştirin:

<!-- 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"/>

Örneğin, yeniden yönlendirme URI'niz msauth://com.microsoft.xforms.testApp/hgbUYHVBYUTvuvT&Y6tr554365466=varsa bildiriminiz aşağıdaki XML kod parçacığı gibi görünmelidir.

Değerdeki imzanın android:path önündeki eğik çizgi (/) gereklidir.

<!-- 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="/>

Uygulamanızı sistem tarayıcısı ve Android 11 desteği için yapılandırma hakkında daha fazla bilgi için bkz . Sistem tarayıcısı desteği için Android bildirimini güncelleştirme.

Alternatif olarak, MSAL'yi yeniden yönlendirme URI'sine bağlı olmayan ekli tarayıcıya geri dönecek şekilde yapılandırabilirsiniz:

.WithUseEmbeddedWebUi(true)

Android aracılı kimlik doğrulaması için sorun giderme ipuçları

Android'de aracılı kimlik doğrulaması uygularken sorunlardan kaçınmaya yönelik birkaç ipucu aşağıdadır:

  • Yeniden yönlendirme URI'si - Uygulama kaydınıza yeniden yönlendirme URI'sini ekleyin. Eksik veya yanlış yeniden yönlendirme URI'si, geliştiriciler tarafından karşılaşılan yaygın bir sorundur.

  • Aracı sürümü - Aracı uygulamalarının gerekli en düşük sürümünü yükleyin. Bu iki uygulamadan biri Android'de aracılı kimlik doğrulaması için kullanılabilir.

    • Intune Şirket Portalı (sürüm 5.0.4689.0 veya üzeri)
    • Microsoft Authenticator (sürüm 6.2001.0140 veya üzeri).
  • Aracı önceliği - MSAL, birden çok aracı yüklendiğinde cihazda yüklü olan ilk aracıyla iletişim kurar.

    Örnek: Önce Microsoft Authenticator'ı ve ardından Intune Şirket Portalı yüklerseniz, aracılı kimlik doğrulaması yalnızca Microsoft Authenticator'da gerçekleşir.

  • Günlükler - Aracılı kimlik doğrulamasıyla ilgili bir sorunla karşılaşırsanız, aracı günlüklerini görüntülemek nedenini tanılamanıza yardımcı olabilir.

    • Microsoft Authenticator günlüklerini alın:

      1. Uygulamanın sağ üst köşesindeki menü düğmesini seçin.
      2. Sorun yaşıyor musunuz? geri bildirim>gönder'i seçin.
      3. Ne yapmaya çalışıyorsunuz?'un altında bir seçenek belirleyin ve bir açıklama ekleyin.
      4. Günlükleri göndermek için uygulamanın sağ üst köşesindeki oku seçin.

      Günlükleri gönderdikten sonra, olay kimliğini bir iletişim kutusu görüntüler. Olay kimliğini kaydedin ve yardım istediğinizde ekleyin.

    • Intune Şirket Portalı günlüklerini alma:

      1. Uygulamanın sol üst köşesindeki menü düğmesini seçin.
      2. Yardım>E-posta Desteği'ne tıklayın.
      3. Günlükleri göndermek için Yalnızca Günlükleri Karşıya Yükle'yi seçin.

      Günlükleri gönderdikten sonra, olay kimliğini bir iletişim kutusu görüntüler. Olay kimliğini kaydedin ve yardım istediğinizde ekleyin.

Sonraki adımlar

MSAL.NET ile Evrensel Windows Platformu kullanma konusunda dikkat edilmesi gerekenler hakkında bilgi edinin.