Authenticatie toevoegen aan uw Xamarin.iOS-app

In deze zelfstudie voegt u Microsoft-verificatie toe aan het TodoApp-project met behulp van Microsoft Entra-id. Voordat u deze zelfstudie voltooit, moet u ervoor zorgen dat u het project hebt gemaakt en de back-end hebt geïmplementeerd.

Notitie

Omdat voor de iOS-app toegang tot de sleutelhanger is vereist, moet u een iOS-inrichtingsprofiel instellen. Voor een inrichtingsprofiel is een echt iOS-apparaat of een betaald Apple Developer-account vereist (als u de simulator gebruikt). U kunt deze zelfstudie overslaan en doorgaan met het toevoegen van offlinetoegang aan uw app als u geen verificatie kunt gebruiken vanwege deze beperking.

Tip

Hoewel we Microsoft Entra ID gebruiken voor verificatie, kunt u elke gewenste verificatiebibliotheek gebruiken met Azure Mobile Apps.

Verificatie toevoegen aan uw back-endservice

Uw back-endservice is een standaardservice ASP.NET 6. Elke zelfstudie die laat zien hoe u verificatie inschakelt voor een ASP.NET 6-service werkt met Azure Mobile Apps.

Als u Microsoft Entra-verificatie wilt inschakelen voor uw back-endservice, moet u het volgende doen:

  • Een toepassing registreren bij Microsoft Entra ID.
  • Verificatiecontrole toevoegen aan het back-endproject ASP.NET 6.

Registreer de toepassing

Registreer eerst de web-API in uw Microsoft Entra-tenant en voeg een bereik toe door de volgende stappen uit te voeren:

  1. Meld u aan bij de Azure-portal.

  2. Als u toegang hebt tot meerdere tenants, gebruikt u het filter Mappen en abonnementen in het bovenste menu om over te schakelen naar de tenant waarin u de toepassing wilt registreren.

  3. Zoek Microsoft Entra ID en selecteer deze.

  4. Selecteer onder Beheren de optie App-registraties>Nieuwe registratie.

    • Naam: voer een naam in voor uw toepassing, bijvoorbeeld TodoApp Quickstart. Gebruikers van uw app zien deze naam. U kunt deze later wijzigen.
    • Ondersteunde accounttypen: Accounts in elke organisatiedirectory (Elke Microsoft Entra-directory - Multitenant) en persoonlijke Microsoft-accounts (bijvoorbeeld Skype, Xbox)
  5. Selecteer Registreren.

  6. Selecteer onder BeherenEen API beschikbaar maken>Een bereik toevoegen.

  7. Accepteer voor de URI van de toepassings-id de standaardinstelling door Opslaan te selecteren en door te gaan.

  8. Voer de volgende gegevens in:

    • Naam van bereik: access_as_user
    • Wie kan toestemming geven?: Beheer s en gebruikers
    • Weergavenaam van beheerderstoestemming: Access TodoApp
    • Beschrijving van beheerderstoestemming: Allows the app to access TodoApp as the signed-in user.
    • Weergavenaam van gebruikerstoestemming: Access TodoApp
    • Beschrijving van gebruikerstoestemming: Allow the app to access TodoApp on your behalf.
    • Status: ingeschakeld
  9. Selecteer Bereik toevoegen om de toevoeging van het bereik te volt ooien.

  10. Let op de waarde van het bereik, vergelijkbaar met api://<client-id>/access_as_user (aangeduid als het web-API-bereik). U hebt het bereik nodig bij het configureren van de client.

  11. Selecteer Overzicht.

  12. Noteer de toepassings-id (client) in de sectie Essentials (ook wel de web-API-toepassings-id genoemd). U hebt deze waarde nodig om de back-endservice te configureren.

Open Visual Studio en selecteer het TodoAppService.NET6 project.

  1. Klik met de rechtermuisknop op het TodoAppService.NET6 project en selecteer NuGet-pakketten beheren....

  2. Selecteer Bladeren op het nieuwe tabblad en voer Vervolgens Microsoft.Identity.Web in het zoekvak in.

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

  3. Selecteer het Microsoft.Identity.Web pakket en druk op Installeren.

  4. Volg de aanwijzingen om de installatie van het pakket te voltooien.

  5. Program.cs openen. Voeg het volgende toe aan de lijst met using instructies:

using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.Identity.Web;
  1. Voeg de volgende code direct boven de aanroep toe aan builder.Services.AddDbContext():
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
  .AddMicrosoftIdentityWebApi(builder.Configuration);
builder.Services.AddAuthorization();
  1. Voeg de volgende code direct boven de aanroep toe aan app.MapControllers():
app.UseAuthentication();
app.UseAuthorization();

Uw Program.cs ziet er nu als volgt uit:

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. Bewerk de Controllers\TodoItemController.cs. Voeg een [Authorize] kenmerk toe aan de klasse. Uw klas moet er als volgt uitzien:
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. Bewerk de appsettings.json. Voeg het volgende blok toe:
  "AzureAd": {
    "Instance": "https://login.microsoftonline.com",
    "ClientId": "<client-id>",
    "TenantId": "common"
  },

Vervang de id van de <client-id>web-API-toepassing die u eerder hebt vastgelegd. Zodra dit is voltooid, ziet deze er als volgt uit:

{
  "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": "*"
}

Publiceer uw service opnieuw naar Azure:

  1. Klik met de rechtermuisknop op het TodoAppService.NET6 project en selecteer Publiceren....
  2. Selecteer de knop Publiceren in de rechterbovenhoek van het tabblad.

Open een browser naar https://yoursite.azurewebsites.net/tables/todoitem?ZUMO-API-VERSION=3.0.0. Houd er rekening mee dat de service nu een 401 antwoord retourneert, wat aangeeft dat verificatie is vereist.

Screenshot of the browser showing an error.

Uw app registreren bij de identiteitsservice

Het Microsoft Data Sync Framework biedt ingebouwde ondersteuning voor elke verificatieprovider die gebruikmaakt van een Json Web Token (JWT) binnen een header van de HTTP-transactie. Deze toepassing maakt gebruik van de Microsoft Authentication Library (MSAL) om een dergelijk token aan te vragen en de aangemelde gebruiker te autoriseren bij de back-endservice.

Een systeemeigen clienttoepassing configureren

U kunt systeemeigen clients registreren om verificatie toe te staan voor web-API's die worden gehost in uw app met behulp van een clientbibliotheek zoals de Microsoft Identity Library (MSAL).

  1. Selecteer Microsoft Entra ID> App-registraties> Nieuwe registratie in Azure Portal.

  2. Op de pagina Een toepassing registreren :

    • voer een naam in voor uw app-registratie. U kunt de naam gebruiken om deze te onderscheiden van de naam native-quickstart die wordt gebruikt door uw back-endservice.
    • Selecteer Accounts in een organisatiedirectory (Elke Microsoft Entra-directory - Multitenant) en persoonlijke Microsoft-accounts (bijvoorbeeld Skype, Xbox).
    • In omleidings-URI:
      • Openbare client selecteren (mobiel en desktop)
      • Voer de URL in quickstart://auth
  3. Selecteer Registreren.

  4. Selecteer API-machtigingen>Een machtiging toevoegen>Mijn API's.

  5. Selecteer de app-registratie die u eerder hebt gemaakt voor uw back-endservice. Als u de app-registratie niet ziet, controleert u of u het access_as_user bereik hebt toegevoegd.

    Screenshot of the scope registration in the Azure portal.

  6. Selecteer onder Machtigingen selecteren access_as_user en selecteer vervolgens Machtigingen toevoegen.

  7. Selecteer Mobile- en desktoptoepassingen voor verificatie>.

  8. Schakel het selectievakje naast https://login.microsoftonline.com/common/oauth2/nativeclient.

  9. Schakel het selectievakje naast msal{client-id}://auth (vervangen door uw toepassings-id {client-id} ).

  10. Selecteer URI toevoegen en voeg http://localhost vervolgens het veld toe voor extra URI's.

  11. Selecteer Opslaan onder aan de pagina.

  12. Selecteer Overzicht. Noteer de toepassings-id (client) (ook wel de systeemeigen clienttoepassings-id genoemd) zoals u deze nodig hebt om de mobiele app te configureren.

We hebben drie omleidings-URL's gedefinieerd:

  • http://localhost wordt gebruikt door WPF-toepassingen.
  • https://login.microsoftonline.com/common/oauth2/nativeclient wordt gebruikt door UWP-toepassingen.
  • msal{client-id}://auth wordt gebruikt door mobiele toepassingen (Android en iOS).

De Microsoft Identity Client toevoegen aan uw app

Open de TodoApp.sln oplossing in Visual Studio en stel het TodoApp.iOS project in als het opstartproject. Voeg de Microsoft Identity Library (MSAL) toe aan het TodoApp.iOS project:

Voeg de Microsoft Identity Library (MSAL) toe aan het platformproject:

  1. Klik met de rechtermuisknop op het project en selecteer NuGet-pakketten beheren....

  2. Selecteer het tabblad Bladeren.

  3. Voer in Microsoft.Identity.Client het zoekvak in en druk op Enter.

  4. Selecteer het Microsoft.Identity.Client resultaat en klik vervolgens op Installeren.

    Screenshot of selecting the MSAL NuGet in Visual Studio.

  5. Accepteer de gebruiksrechtovereenkomst om door te gaan met de installatie.

Voeg de systeemeigen client-id en het back-endbereik toe aan de configuratie.

Open het TodoApp.Data project en bewerk het Constants.cs bestand. Constanten toevoegen voor ApplicationId en 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>"
      };
  }

Vervang de <client-id> id van de systeemeigen clienttoepassing die u hebt ontvangen bij het registreren van de clienttoepassing in Microsoft Entra-id en het <scope>web-API-bereik dat u hebt gekopieerd toen u een API beschikbaar maakte tijdens het registreren van de servicetoepassing.

Open ViewControllers\HomeViewController.cs het TodoApp.iOS project. Voeg de volgende using instructies toe:

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

Voeg in de HomeViewController klasse een nieuwe eigenschap toe:

public IPublicClientApplication IdentityClient { get; set; }

Pas de constructor aan om te lezen:

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

Voeg de GetAuthenticationToken methode toe aan de klasse:

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

De GetAuthenticationToken() methode werkt met de Microsoft Identity Library (MSAL) om een toegangstoken op te halen dat geschikt is voor het autoriseren van de aangemelde gebruiker naar de back-endservice. Deze functie wordt vervolgens doorgegeven aan de functie voor het RemoteTodoService maken van de client. Als de verificatie is geslaagd, wordt de AuthenticationToken geproduceerd met gegevens die nodig zijn om elke aanvraag te autoriseren. Zo niet, dan wordt in plaats daarvan een verlopen ongeldig token geproduceerd.

Voeg de volgende code toe aan het einde van de AppDelegate klasse:

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

Toegang tot de sleutelhanger toevoegen aan het Entitlements.plistvolgende:

  1. Open het bestand Entitlements.plist.

  2. Selecteer Sleutelhanger.

  3. Selecteer Nieuw toevoegen in de sleutelhangergroepen.

  4. Voer com.microsoft.adalcache in als de waarde:

    Screenshot showing the i O S entitlements.

Voeg de aangepaste rechten toe aan het project:

  1. Klik met de rechtermuisknop op het TodoApp.iOS project en selecteer Eigenschappen.

  2. Selecteer iOS-bundelondertekening.

  3. Selecteer de knop ... naast het veld Aangepaste rechten .

  4. Selecteer Entitlementsen selecteer vervolgens Openen.

  5. Druk op Ctrl+S om het project op te slaan.

    Screenshot showing the i O S bundle signing properties.

De app testen

Notitie

Omdat de iOS-app toegang tot de sleutelhanger vereist, moet u een inrichtingsprofiel instellen. Voor een inrichtingsprofiel is een echt apparaat of een betaald Apple Developer-account vereist (als u de simulator gebruikt).

Stel TodoApp.iOS dit in als het opstartproject en bouw en voer de app uit. Wanneer de app wordt gestart, wordt u gevraagd u aan te melden bij de app. Tijdens de eerste uitvoering wordt u gevraagd om toestemming te geven voor de app. Zodra de verificatie is voltooid, wordt de app uitgevoerd als normaal.

Volgende stappen

Configureer vervolgens uw toepassing om offline te werken door een offlinearchief te implementeren.

Meer lezen