Hinzufügen der Authentifizierung zu Ihrer Xamarin.iOS-App

In diesem Lernprogramm fügen Sie microsoft-Authentifizierung zum TodoApp-Projekt mithilfe der Microsoft Entra-ID hinzu. Stellen Sie vor Abschluss dieses Lernprogramms sicher, dass Sie das Projekt erstellt und das Back-End bereitgestellt haben.

Hinweis

Da für die iOS-App der Schlüsselbundzugriff erforderlich ist, müssen Sie ein iOS-Bereitstellungsprofil einrichten. Für ein Bereitstellungsprofil ist entweder ein echtes iOS-Gerät oder ein kostenpflichtiges Apple-Entwicklerkonto (bei Verwendung des Simulators) erforderlich. Sie können dieses Lernprogramm überspringen und mit dem Hinzufügen des Offlinezugriffs zu Ihrer App fortfahren, wenn Sie die Authentifizierung aufgrund dieser Einschränkung nicht verwenden können.

Tipp

Obwohl wir Microsoft Entra-ID für die Authentifizierung verwenden, können Sie jede beliebige Authentifizierungsbibliothek mit Azure Mobile Apps verwenden.

Hinzufügen der Authentifizierung zu Ihrem Back-End-Dienst

Ihr Back-End-Dienst ist ein Standarddienst ASP.NET 6. Jedes Lernprogramm, das Ihnen zeigt, wie Sie die Authentifizierung für einen ASP.NET 6-Dienst mit Azure Mobile Apps aktivieren.

Um die Microsoft Entra-Authentifizierung für Ihren Back-End-Dienst zu aktivieren, müssen Sie:

  • Melden Sie eine Anwendung mit Microsoft Entra ID an.
  • Fügen Sie dem ASP.NET 6-Back-End-Projekt die Authentifizierungsprüfung hinzu.

Registrieren der Anwendung

Registrieren Sie zunächst die Web-API in Ihrem Microsoft Entra-Mandanten, und fügen Sie einen Bereich hinzu:

  1. Melden Sie sich beim Azure-Portal an.

  2. Wenn Sie Zugriff auf mehrere Mandanten haben, verwenden Sie den Filter "Verzeichnisse + Abonnements " im oberen Menü, um zum Mandanten zu wechseln, in dem Sie die Anwendung registrieren möchten.

  3. Suchen Sie nach Microsoft Entra ID, und wählen Sie diese Lösung aus.

  4. Wählen Sie unter Verwalten Folgendes aus: App-Registrierungen>Neue Registrierung.

    • Name: Geben Sie einen Namen für Ihre Anwendung ein, z. B. "Schnellstart für TodoApp". Benutzer Ihrer App sehen diesen Namen. Sie können ihn später ändern.
    • Unterstützte Kontotypen: Konten in jedem Organisationsverzeichnis (beliebiges Microsoft Entra-Verzeichnis – Multitenant) und persönliche Microsoft-Konten (z. B. Skype, Xbox)
  5. Wählen Sie Registrieren aus.

  6. Wählen Sie unter Verwalten die Optionen Eine API verfügbar machen>Bereich hinzufügen aus.

  7. Übernehmen Sie für den Anwendungs-ID-URI die Standardeinstellung, indem Sie "Speichern" auswählen und den Vorgang fortsetzen.

  8. Geben Sie die folgenden Details ein:

    • Bereichsname: access_as_user
    • Zum Einwilligen berechtigte Personen: Administratoren und Benutzer
    • Anzeigename der Administratoreinwilligung: Access TodoApp
    • Beschreibung der Administratoreinwilligung: Allows the app to access TodoApp as the signed-in user.
    • Anzeigename der Benutzereinwilligung: Access TodoApp
    • Beschreibung der Benutzereinwilligung: Allow the app to access TodoApp on your behalf.
    • Status:Aktiviert
  9. Wählen Sie Bereich hinzufügen aus, um das Hinzufügen des Bereichs abzuschließen.

  10. Beachten Sie den Wert des Bereichs, ähnlich api://<client-id>/access_as_user wie der Web-API-Bereich. Sie benötigen den Bereich beim Konfigurieren des Clients.

  11. Wählen Sie Übersicht aus.

  12. Beachten Sie die Anwendungs-ID (Client-ID ) im Abschnitt "Essentials " (als Web-API-Anwendungs-ID bezeichnet). Sie benötigen diesen Wert, um den Back-End-Dienst zu konfigurieren.

Öffnen Sie Visual Studio, und wählen Sie das TodoAppService.NET6 Projekt aus.

  1. Klicken Sie mit der rechten Maustaste auf das TodoAppService.NET6 Projekt, und wählen Sie dann "NuGet-Pakete verwalten" aus.

  2. Wählen Sie auf der neuen Registerkarte "Durchsuchen" aus, und geben Sie dann "Microsoft.Identity.Web " in das Suchfeld ein.

    Screenshot of adding the M S A L NuGet in Visual Studio.

  3. Wählen Sie das Microsoft.Identity.Web Paket aus, und drücken Sie dann " Installieren".

  4. Folgen Sie den Anweisungen, um die Installation des Pakets abzuschließen.

  5. Öffnen Sie Program.cs. Fügen Sie der Liste der using Anweisungen Folgendes hinzu:

using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.Identity.Web;
  1. Fügen Sie den folgenden Code direkt über dem Aufruf hinzu:builder.Services.AddDbContext()
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
  .AddMicrosoftIdentityWebApi(builder.Configuration);
builder.Services.AddAuthorization();
  1. Fügen Sie den folgenden Code direkt über dem Aufruf hinzu:app.MapControllers()
app.UseAuthentication();
app.UseAuthorization();

Die Program.cs-Datei sollte jetzt wie folgt aussehen:

using Microsoft.AspNetCore.Datasync;
using Microsoft.EntityFrameworkCore;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.Identity.Web;
using TodoAppService.NET6.Db;
  
var builder = WebApplication.CreateBuilder(args);
var connectionString = builder.Configuration.GetConnectionString("DefaultConnection");
  
if (connectionString == null)
{
  throw new ApplicationException("DefaultConnection is not set");
}
  
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
  .AddMicrosoftIdentityWebApi(builder.Configuration);
builder.Services.AddAuthorization();
builder.Services.AddDbContext<AppDbContext>(options => options.UseSqlServer(connectionString));
builder.Services.AddDatasyncControllers();
  
var app = builder.Build();
  
// Initialize the database
using (var scope = app.Services.CreateScope())
{
  var context = scope.ServiceProvider.GetRequiredService<AppDbContext>();
  await context.InitializeDatabaseAsync().ConfigureAwait(false);
}
  
// Configure and run the web service.
app.UseAuthentication();
app.UseAuthorization();
app.MapControllers();
app.Run();
  1. Bearbeiten Sie die Controllers\TodoItemController.cs. Fügen Sie der Klasse ein [Authorize] Attribut hinzu. Ihr Kurs sollte wie folgt aussehen:
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Datasync;
using Microsoft.AspNetCore.Datasync.EFCore;
using Microsoft.AspNetCore.Mvc;
using TodoAppService.NET6.Db;

namespace TodoAppService.NET6.Controllers
{
  [Authorize]
  [Route("tables/todoitem")]
  public class TodoItemController : TableController<TodoItem>
  {
    public TodoItemController(AppDbContext context)
      : base(new EntityTableRepository<TodoItem>(context))
    {
    }
  }
}
  1. Bearbeiten Sie die appsettings.json. Fügen Sie den folgenden Block hinzu:
  "AzureAd": {
    "Instance": "https://login.microsoftonline.com",
    "ClientId": "<client-id>",
    "TenantId": "common"
  },

Ersetzen Sie die <client-id> zuvor aufgezeichnete Webanwendungs-ID durch die Web-API-Anwendungs-ID . Nach Abschluss sollte es wie folgt aussehen:

{
  "AzureAd": {
    "Instance": "https://login.microsoftonline.com",
    "ClientId": "<client-id>",
    "TenantId": "common"
  },
  "ConnectionStrings": {
    "DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=TodoApp;Trusted_Connection=True"
  },
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "AllowedHosts": "*"
}

Veröffentlichen Sie Ihren Dienst erneut in Azure:

  1. Klicken Sie mit der rechten Maustaste auf das TodoAppService.NET6 Projekt, und wählen Sie dann "Veröffentlichen..." aus.
  2. Wählen Sie in der oberen rechten Ecke der Registerkarte die Schaltfläche "Veröffentlichen " aus.

Öffnen Sie einen Browser unter https://yoursite.azurewebsites.net/tables/todoitem?ZUMO-API-VERSION=3.0.0. Beachten Sie, dass der Dienst jetzt eine 401 Antwort zurückgibt, die angibt, dass die Authentifizierung erforderlich ist.

Screenshot of the browser showing an error.

Registrieren Ihrer App beim Identitätsdienst

Das Microsoft Data sync Framework verfügt über integrierte Unterstützung für jeden Authentifizierungsanbieter, der ein JSON-Webtoken (JWT) in einem Header der HTTP-Transaktion verwendet. Diese Anwendung verwendet die Microsoft Authentication Library (MSAL), um ein solches Token anzufordern und den angemeldeten Benutzer für den Back-End-Dienst zu autorisieren.

Konfigurieren einer nativen Clientanwendung

Sie können native Clients registrieren, um in Ihrer App gehosteten Web-APIs die Authentifizierung mittels einer Clientbibliothek zu gestatten, etwa der Microsoft Identity Library (MSAL).

  1. Wählen Sie im Azure-Portal die Microsoft Entra-ID> App-Registrierungen> Neue Registrierung aus.

  2. Auf der Seite "Anwendung registrieren":

    • geben Sie einen Namen für Ihre App-Registrierung ein. Möglicherweise möchten Sie den Namen native-quickstart verwenden, um diesen von dem namen zu unterscheiden, der von Ihrem Back-End-Dienst verwendet wird.
    • Wählen Sie "Konten" in einem beliebigen Organisationsverzeichnis (beliebiges Microsoft Entra-Verzeichnis – Multitenant) und persönliche Microsoft-Konten (z. B. Skype, Xbox) aus.
    • In Umleitungs-URI:
      • Öffentliches Client auswählen (Mobil und Desktop)
      • Geben Sie die URL ein. quickstart://auth
  3. Wählen Sie Registrieren aus.

  4. Wählen Sie über die Option API-Berechtigungen>Berechtigung hinzufügen>Meine APIs aus.

  5. Wählen Sie die App-Registrierung aus, die Sie zuvor für Ihren Back-End-Dienst erstellt haben. Wenn die App-Registrierung nicht angezeigt wird, stellen Sie sicher, dass Sie den access_as_user Bereich hinzugefügt haben.

    Screenshot of the scope registration in the Azure portal.

  6. Wählen Sie unter "Berechtigungen auswählen" access_as_user und dann "Berechtigungen hinzufügen" aus.

  7. Wählen Sie "Mobile- und Desktopanwendungen für die Authentifizierung>" aus.

  8. Aktivieren Sie das Kontrollkästchen neben https://login.microsoftonline.com/common/oauth2/nativeclient.

  9. Aktivieren Sie das Kontrollkästchen neben msal{client-id}://auth (ersetzen Sie {client-id} durch Ihre Anwendungs-ID).

  10. Wählen Sie "URI hinzufügen" aus, und fügen Sie dann das Feld für zusätzliche URIs hinzuhttp://localhost.

  11. Wählen Sie unten auf der Seite Speichern aus.

  12. Wählen Sie Übersicht aus. Notieren Sie sich die Anwendungs-ID (Client-ID ) (die als native Clientanwendungs-ID bezeichnet wird), da sie zum Konfigurieren der mobilen App benötigt wird.

Wir haben drei Umleitungs-URLs definiert:

  • http://localhost wird von WPF-Anwendungen verwendet.
  • https://login.microsoftonline.com/common/oauth2/nativeclient wird von UWP-Anwendungen verwendet.
  • msal{client-id}://auth wird von mobilen Anwendungen (Android und iOS) verwendet.

Hinzufügen des Microsoft Identity Client zu Ihrer App

Öffnen Sie die TodoApp.sln Projektmappe in Visual Studio, und legen Sie das TodoApp.iOS Projekt als Startprojekt fest. Fügen Sie dem TodoApp.iOS Projekt die Microsoft Identity Library (MSAL) hinzu:

Fügen Sie dem Plattformprojekt die Microsoft Identity Library (MSAL) hinzu:

  1. Klicken Sie mit der rechten Maustaste auf das Projekt, und wählen Sie dann NuGet-Pakete verwalten... aus.

  2. Wählen Sie die Registerkarte Durchsuchen aus.

  3. Geben Sie Microsoft.Identity.Client in das Suchfeld ein, und drücken Sie dann die EINGABETASTE.

  4. Wählen Sie das Ergebnis Microsoft.Identity.Client aus, und klicken Sie dann auf Installieren.

    Screenshot of selecting the MSAL NuGet in Visual Studio.

  5. Akzeptieren Sie den Lizenzvertrag, um die Installation fortzusetzen.

Fügen Sie der Konfiguration die systemeigene Client-ID und den Back-End-Bereich hinzu.

Öffnen Sie das TodoApp.Data Projekt, und bearbeiten Sie die Constants.cs Datei. Hinzufügen von Konstanten für ApplicationId und Scopes:

  public static class Constants
  {
      /// <summary>
      /// The base URI for the Datasync service.
      /// </summary>
      public static string ServiceUri = "https://demo-datasync-quickstart.azurewebsites.net";

      /// <summary>
      /// The application (client) ID for the native app within Microsoft Entra ID
      /// </summary>
      public static string ApplicationId = "<client-id>";

      /// <summary>
      /// The list of scopes to request
      /// </summary>
      public static string[] Scopes = new[]
      {
          "<scope>"
      };
  }

Ersetzen Sie die <client-id> id der nativen Clientanwendung, die Sie beim Registrieren der Clientanwendung in der Microsoft Entra-ID erhalten haben, und den <scope> Web-API-Bereich, den Sie kopiert haben, wenn Sie eine API beim Registrieren der Dienstanwendung verwendet haben.

Öffnen Sie ViewControllers\HomeViewController.cs das TodoApp.iOS Projekt. Fügen Sie die folgenden using -Anweisungen ein:

using Microsoft.Datasync.Client;
using Microsoft.Identity.Client;
using System.Diagnostics;
using System.Linq;

Fügen Sie in der HomeViewController Klasse eine neue Eigenschaft hinzu:

public IPublicClientApplication IdentityClient { get; set; }

Passen Sie den Konstruktor an, um Folgendes zu lesen:

public HomeViewController() {
  Title = "Todo Items";
  TodoService = new RemoteTodoService(GetAuthenticationToken);
  TodoService.TodoItemsUpdated += OnTodoItemsUpdated;
}

Fügen Sie der Klasse die Methode GetAuthenticationToken hinzu:

public async Task<AuthenticationToken> GetAuthenticationToken()
{
    if (IdentityClient == null)
    {
        IdentityClient = PublicClientApplicationBuilder.Create(Constants.ApplicationId)
            .WithAuthority(AzureCloudInstance.AzurePublic, "common")
            .WithRedirectUri($"msal{Constants.ApplicationId}://auth")
            .WithIosKeychainSecurityGroup("com.microsoft.adalcache")
            .Build();
    }

    var accounts = await IdentityClient.GetAccountsAsync();
    AuthenticationResult result = null;
    bool tryInteractiveLogin = false;

    try
    {
        result = await IdentityClient
            .AcquireTokenSilent(Constants.Scopes, accounts.FirstOrDefault())
            .ExecuteAsync();
    }
    catch (MsalUiRequiredException)
    {
        tryInteractiveLogin = true;
    }
    catch (Exception ex)
    {
        Debug.WriteLine($"MSAL Silent Error: {ex.Message}");
    }

    if (tryInteractiveLogin)
    {
        try
        {
            result = await IdentityClient
                .AcquireTokenInteractive(Constants.Scopes)
                .ExecuteAsync()
                .ConfigureAwait(false);
        }
        catch (Exception ex)
        {
            Debug.WriteLine($"MSAL Interactive Error: {ex.Message}");
        }
    }

    return new AuthenticationToken
    {
        DisplayName = result?.Account?.Username ?? "",
        ExpiresOn = result?.ExpiresOn ?? DateTimeOffset.MinValue,
        Token = result?.AccessToken ?? "",
        UserId = result?.Account?.Username ?? ""
    };
}

Die GetAuthenticationToken() Methode arbeitet mit der Microsoft Identity Library (MSAL) zusammen, um ein Zugriffstoken abzurufen, das zum Autorisieren des angemeldeten Benutzers für den Back-End-Dienst geeignet ist. Diese Funktion wird dann an die RemoteTodoService Erstellung des Clients übergeben. Wenn die Authentifizierung erfolgreich ist, werden die Daten erstellt, die AuthenticationToken für die Autorisierung jeder Anforderung erforderlich sind. Wenn nicht, wird stattdessen ein abgelaufenes ungültiges Token erstellt.

Fügen Sie den folgenden Code am Ende der AppDelegate Klasse hinzu:

[Export("application:openURL:options:")]
public bool OpenUrl(UIApplication app, NSUrl url, NSDictionary options)
{
    AuthenticationContinuationHelper.SetAuthenticationContinuationEventArgs(url);
    return true;
}

Hinzufügen des Schlüsselbundzugriffs auf folgendes Entitlements.plist:

  1. Öffnen Sie die Datei Entitlements.plist.

  2. Wählen Sie den Schlüsselbund aus.

  3. Wählen Sie "Neu hinzufügen" in den Schlüsselbundgruppen aus.

  4. Geben Sie com.microsoft.adalcache als Wert ein:

    Screenshot showing the i O S entitlements.

Fügen Sie dem Projekt die benutzerdefinierten Berechtigungen hinzu:

  1. Klicken Sie mit der rechten Maustaste auf das TodoApp.iOS Projekt, und wählen Sie dann "Eigenschaften" aus.

  2. Wählen Sie die iOS-Bündelsignierung aus.

  3. Wählen Sie die Schaltfläche "... " neben dem Feld "Benutzerdefinierte Berechtigungen " aus.

  4. Wählen Sie Entitlementsdann " Öffnen" aus.

  5. Drücken Sie STRG+S , um das Projekt zu speichern.

    Screenshot showing the i O S bundle signing properties.

Testen der App

Hinweis

Da die iOS-App Schlüsselbundzugriff erfordert, müssen Sie ein Bereitstellungsprofil einrichten. Für ein Bereitstellungsprofil ist entweder ein echtes Gerät oder ein kostenpflichtiges Apple Developer-Konto (bei Verwendung des Simulators) erforderlich.

Legen Sie als Startprojekt fest TodoApp.iOS , erstellen Sie die App, und führen Sie sie aus. Wenn die App gestartet wird, werden Sie aufgefordert, sich bei der App anzumelden. Bei der ersten Ausführung werden Sie aufgefordert, der App zuzustimmen. Nach Abschluss der Authentifizierung wird die App normal ausgeführt.

Nächste Schritte

Konfigurieren Sie als Nächstes Ihre Anwendung so, dass sie offline ausgeführt wird, indem Sie einen Offlinespeicher implementieren.

Weitere Informationen