Korzystanie z aplikacji Microsoft Authenticator lub Intune — Portal firmy w aplikacjach platformy Xamarin

W systemach Android i iOS brokerzy tacy jak Microsoft Authenticator i specyficzne dla systemu Android Intune — Portal firmy włączyć:

  • Logowanie jednokrotne (SSO): użytkownicy nie muszą logować się do każdej aplikacji.
  • Identyfikacja urządzenia: broker uzyskuje dostęp do certyfikatu urządzenia. Ten certyfikat jest tworzony na urządzeniu po dołączeniu do miejsca pracy.
  • Weryfikacja identyfikacji aplikacji: gdy aplikacja wywołuje brokera, przekazuje adres URL przekierowania. Broker weryfikuje adres URL.

Aby włączyć jedną z tych funkcji, użyj parametru WithBroker() podczas wywoływania PublicClientApplicationBuilder.CreateApplication metody. Parametr .WithBroker() jest domyślnie ustawiony na wartość true.

Konfiguracja uwierzytelniania obsługiwanego przez brokera w bibliotece uwierzytelniania firmy Microsoft dla platformy .NET (MSAL.NET) różni się w zależności od platformy:

Uwierzytelnianie obsługiwane przez brokera dla systemu iOS

Wykonaj poniższe kroki, aby umożliwić aplikacji Xamarin.iOS komunikowanie się z aplikacją Microsoft Authenticator . Jeśli używasz systemu iOS 13, rozważ zapoznanie się ze zmianą interfejsu API powodującą niezgodność firmy Apple.

Krok 1. Włączanie obsługi brokera

Należy włączyć obsługę brokera dla poszczególnych wystąpień programu PublicClientApplication. Obsługa jest domyślnie wyłączona. Podczas tworzenia PublicClientApplication za pomocą PublicClientApplicationBuilderpolecenia użyj parametru WithBroker() , jak pokazano w poniższym przykładzie. Parametr WithBroker() jest domyślnie ustawiony na wartość true.

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

Krok 2. Włączanie dostępu łańcucha kluczy

Aby włączyć dostęp łańcucha kluczy, musisz mieć grupę dostępu łańcucha kluczy dla aplikacji. Interfejs API umożliwia WithIosKeychainSecurityGroup() ustawienie grupy dostępu łańcucha kluczy podczas tworzenia aplikacji:

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

Aby uzyskać więcej informacji, zobacz Włączanie dostępu łańcucha kluczy.

Krok 3. Aktualizowanie elementu AppDelegate w celu obsługi wywołania zwrotnego

Gdy MSAL.NET wywołuje brokera, broker wywołuje z powrotem do aplikacji metodę OpenUrlAppDelegate klasy . Ponieważ biblioteka MSAL czeka na odpowiedź brokera, aplikacja musi współpracować, aby wywołać MSAL.NET z powrotem. Aby umożliwić tę współpracę, zaktualizuj plik AppDelegate.cs , aby zastąpić następującą metodę.

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

Ta metoda jest wywoływana za każdym razem, gdy aplikacja jest uruchamiana. Jest ona używana jako okazja do przetworzenia odpowiedzi od brokera i ukończenia procesu uwierzytelniania, który MSAL.NET rozpoczęty.

Krok 4. Ustawianie kontrolki UIViewController()

Nadal w pliku AppDelegate.cs ustaw okno obiektu. Zazwyczaj nie trzeba ustawiać okna obiektu dla systemu IOS platformy Xamarin, ale do wysyłania i odbierania odpowiedzi z brokera potrzebne jest okno obiektu.

Aby skonfigurować okno obiektu:

  1. W pliku AppDelegate.cs ustaw App.RootViewController wartość na nową UIViewController(). To przypisanie gwarantuje, że wywołanie brokera obejmuje UIViewControllerelement . Jeśli to ustawienie jest przypisane niepoprawnie, może zostać wyświetlony następujący błąd:

    "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. W wywołaniu AcquireTokenInteractive użyj polecenia .WithParentActivityOrWindow(App.RootViewController) , a następnie przekaż odwołanie do okna obiektu, którego użyjesz.

    W pliku App.cs:

       public static object RootViewController { get; set; }
    

    W pliku AppDelegate.cs:

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

    W wywołaniu AcquireToken :

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

Krok 5. Rejestrowanie schematu adresów URL

MSAL.NET używa adresów URL do wywołania brokera, a następnie zwrócenia odpowiedzi brokera do aplikacji. Aby ukończyć rundę, zarejestruj schemat adresów URL aplikacji w pliku Info.plist .

Nazwa CFBundleURLSchemes musi zawierać msauth. się jako prefiks. Postępuj zgodnie z prefiksem za pomocą CFBundleURLNamepolecenia .

W schemacie BundleId adresów URL unikatowo identyfikuje aplikację: $"msauth.(BundleId)". Więc jeśli BundleId ma wartość com.yourcompany.xforms, schemat adresu URL to msauth.com.yourcompany.xforms.

Uwaga

Ten schemat adresów URL staje się częścią identyfikatora URI przekierowania, który jednoznacznie identyfikuje aplikację po odebraniu odpowiedzi od brokera.

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

Krok 6. Dodawanie identyfikatora brokera do sekcji LSApplicationQueriesSchemes

Biblioteka MSAL używa –canOpenURL: funkcji do sprawdzania, czy broker jest zainstalowany na urządzeniu. W systemie iOS 9 firma Apple zablokowała schematy, dla których aplikacja może wykonywać zapytania.

Dodaj msauthv2 do LSApplicationQueriesSchemes sekcji pliku Info.plist , jak w poniższym przykładzie:

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

Krok 7. Dodawanie identyfikatora URI przekierowania do rejestracji aplikacji

Napiwek

Kroki opisane w tym artykule mogą się nieznacznie różnić w zależności od portalu, od którego zaczynasz.

W przypadku korzystania z brokera identyfikator URI przekierowania ma dodatkowe wymaganie. Identyfikator URI przekierowania musi mieć następujący format:

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

Oto przykład:

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

Zwróć uwagę, że identyfikator URI przekierowania jest zgodny z CFBundleURLSchemes nazwą uwzględnioną w pliku Info.plist .

Dodaj identyfikator URI przekierowania do rejestracji aplikacji. Aby wygenerować poprawnie sformatowany identyfikator URI przekierowania, użyj Rejestracje aplikacji, aby wygenerować identyfikator URI przekierowania brokera z identyfikatora pakietu.

Aby wygenerować identyfikator URI przekierowania:

  1. Zaloguj się do centrum administracyjnego firmy Microsoft Entra jako co najmniej Administracja istrator aplikacji w chmurze.

  2. Przejdź do aplikacji tożsamości>> Rejestracje aplikacji.

  3. Wyszukaj i wybierz aplikację.

  4. Wybierz pozycję Uwierzytelnianie>Dodaj platformę dla systemu>iOS/macOS

  5. Wprowadź identyfikator pakietu, a następnie wybierz pozycję Konfiguruj.

    Skopiuj wygenerowany identyfikator URI przekierowania, który zostanie wyświetlony w polu tekstowym Identyfikator URI przekierowania, aby zakluzował kod:

    iOS platform settings with generated redirect URI

  6. Wybierz pozycję Gotowe , aby ukończyć generowanie identyfikatora URI przekierowania.

Uwierzytelnianie obsługiwane przez brokera dla systemu Android

Krok 1. Włączanie obsługi brokera

Obsługa brokera jest włączona dla poszczególnychPublicClientApplication użytkowników. Jest ona domyślnie wyłączona. Użyj parametru (domyślnie ustawionego WithBroker() na wartość true) podczas tworzenia IPublicClientApplication elementu za pomocą polecenia PublicClientApplicationBuilder.

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

Krok 2. Aktualizowanie głównego działania w celu obsługi wywołania zwrotnego

Gdy MSAL.NET wywołuje brokera, broker z kolei wywoła aplikację przy użyciu OnActivityResult() metody . Ponieważ biblioteka MSAL będzie czekać na odpowiedź od brokera, aplikacja musi kierować wynik do MSAL.NET.

Kierowanie wyniku do SetAuthenticationContinuationEventArgs(int requestCode, Result resultCode, Intent data) metody przez zastąpienie OnActivityResult() metody, jak pokazano poniżej:

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

Ta metoda jest wywoływana za każdym razem, gdy aplikacja brokera jest uruchamiana i jest używana jako okazja do przetworzenia odpowiedzi z brokera i ukończenia procesu uwierzytelniania rozpoczętego przez MSAL.NET.

Krok 3. Ustawianie działania

Aby włączyć uwierzytelnianie obsługiwane przez brokera, ustaw działanie, aby biblioteka MSAL mogła wysyłać i odbierać odpowiedź z brokera. W tym celu podaj działanie (zazwyczaj MainActivity) do WithParentActivityOrWindow(object parent) obiektu nadrzędnego.

Na przykład w wywołaniu metody AcquireTokenInteractive():

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

Krok 4. Dodawanie identyfikatora URI przekierowania do rejestracji aplikacji

Biblioteka MSAL używa adresów URL do wywoływania brokera, a następnie powrotu do aplikacji. Aby ukończyć rundy, zarejestruj identyfikator URI przekierowania dla aplikacji.

Format identyfikatora URI przekierowania dla aplikacji zależy od certyfikatu użytego do podpisania pakietu APK. Na przykład:

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

Ostatnia część identyfikatora URI, hgbUYHVBYUTvuvT&Y6tr554365466=, to zakodowana w formacie Base64 wersja podpisu, z którą plik APK jest podpisany. Podczas opracowywania aplikacji w programie Visual Studio, jeśli debugujesz kod bez podpisywania pliku APK przy użyciu określonego certyfikatu, program Visual Studio podpisuje plik APK do celów debugowania. Gdy program Visual Studio podpisze pakiet APK w ten sposób, daje mu unikatowy podpis dla maszyny, na której jest zbudowany. W związku z tym za każdym razem, gdy tworzysz aplikację na innym komputerze, musisz zaktualizować identyfikator URI przekierowania w kodzie aplikacji i rejestrację aplikacji w celu uwierzytelnienia przy użyciu biblioteki MSAL.

Podczas debugowania może wystąpić wyjątek biblioteki MSAL (lub komunikat dziennika) z informacją, że podany identyfikator URI przekierowania jest niepoprawny. Wyjątek lub komunikat dziennika wskazuje również identyfikator URI przekierowania, którego należy używać z bieżącą maszyną, na której debugujesz. Możesz użyć podanego identyfikatora URI przekierowania, aby kontynuować opracowywanie aplikacji, o ile zaktualizujesz identyfikator URI przekierowania w kodzie i dodaj podany identyfikator URI przekierowania do rejestracji aplikacji.

Gdy wszystko będzie gotowe do sfinalizowania kodu, zaktualizuj identyfikator URI przekierowania w kodzie i rejestrację aplikacji, aby użyć podpisu certyfikatu, za pomocą którego podpisujesz plik APK.

W praktyce oznacza to, że należy rozważyć dodanie identyfikatora URI przekierowania dla każdego członka zespołu deweloperów oraz identyfikator URI przekierowania dla produkcyjnej podpisanej wersji pakietu APK.

Podpis można samodzielnie obliczyć, podobnie jak biblioteka 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.
      }
   }

Istnieje również możliwość uzyskania podpisu dla pakietu przy użyciu narzędzia keytool z następującymi poleceniami:

  • 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
    

Krok 5 (opcjonalnie): Wróć do przeglądarki systemowej

Jeśli biblioteka MSAL jest skonfigurowana do korzystania z brokera, ale broker nie jest zainstalowany, biblioteka MSAL powróci do korzystania z widoku internetowego (przeglądarki). Biblioteka MSAL podejmie próbę uwierzytelnienia przy użyciu domyślnej przeglądarki systemowej na urządzeniu, co kończy się niepowodzeniem, ponieważ identyfikator URI przekierowania jest skonfigurowany dla brokera, a przeglądarka systemowa nie wie, jak używać jej do powrotu do biblioteki MSAL. Aby uniknąć niepowodzenia, możesz skonfigurować filtr intencji przy użyciu identyfikatora URI przekierowania brokera użytego w kroku 4.

Zmodyfikuj manifest aplikacji, aby dodać filtr intencji:

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

Jeśli na przykład masz identyfikator URI msauth://com.microsoft.xforms.testApp/hgbUYHVBYUTvuvT&Y6tr554365466=przekierowania , manifest powinien wyglądać podobnie do poniższego fragmentu kodu XML.

Wymagany jest ukośnik ukośnik (/) przed podpisem android:path w wartości.

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

Aby uzyskać więcej informacji na temat konfigurowania aplikacji pod kątem obsługi przeglądarki systemowej i systemu Android 11, zobacz Aktualizowanie manifestu systemu Android pod kątem obsługi przeglądarki systemowej.

Alternatywnie można skonfigurować bibliotekę MSAL tak, aby wróciła do osadzonej przeglądarki, która nie opiera się na identyfikatorze URI przekierowania:

.WithUseEmbeddedWebUi(true)

Porady dotyczące rozwiązywania problemów z uwierzytelnianiem obsługiwanym przez brokera systemu Android

Poniżej przedstawiono kilka wskazówek dotyczących unikania problemów podczas implementowania uwierzytelniania obsługiwanego przez brokera w systemie Android:

  • Identyfikator URI przekierowania — dodaj identyfikator URI przekierowania do rejestracji aplikacji. Brak lub nieprawidłowy identyfikator URI przekierowania to typowy problem napotykany przez deweloperów.

  • Wersja brokera — zainstaluj minimalną wymaganą wersję aplikacji brokera. Jedną z tych dwóch aplikacji można używać do uwierzytelniania obsługiwanego przez brokera w systemie Android.

  • Pierwszeństwo brokera — biblioteka MSAL komunikuje się z pierwszym brokerem zainstalowanym na urządzeniu po zainstalowaniu wielu brokerów.

    Przykład: jeśli najpierw zainstalujesz aplikację Microsoft Authenticator, a następnie zainstalujesz Intune — Portal firmy, uwierzytelnianie obsługiwane przez brokera będzie odbywać się tylko w aplikacji Microsoft Authenticator.

  • Dzienniki — jeśli wystąpi problem z uwierzytelnianiem obsługiwanym przez brokera, wyświetlenie dzienników brokera może pomóc w zdiagnozowaniu przyczyny.

    • Pobierz dzienniki aplikacji Microsoft Authenticator:

      1. Wybierz przycisk menu w prawym górnym rogu aplikacji.
      2. Wybierz pozycję Wyślij opinię>, której dotyczą problemy?
      3. W obszarze Co próbujesz zrobić?, wybierz opcję i dodaj opis.
      4. Aby wysłać dzienniki, wybierz strzałkę w prawym górnym rogu aplikacji.

      Po wysłaniu dzienników zostanie wyświetlone okno dialogowe z identyfikatorem zdarzenia. Zarejestruj identyfikator zdarzenia i dołącz go, gdy poprosisz o pomoc.

    • Pobierz dzienniki Intune — Portal firmy:

      1. Wybierz przycisk menu w lewym górnym rogu aplikacji.
      2. Wybierz pozycję Pomoc>techniczna w wiadomości e-mail.
      3. Aby wysłać dzienniki, wybierz pozycję Przekaż tylko dzienniki.

      Po wysłaniu dzienników zostanie wyświetlone okno dialogowe z identyfikatorem zdarzenia. Zarejestruj identyfikator zdarzenia i dołącz go, gdy poprosisz o pomoc.

Następne kroki

Dowiedz się więcej o zagadnieniach dotyczących używania platforma uniwersalna systemu Windows z MSAL.NET.