Přidání ověřování do aplikace Xamarin.iOS

V tomto kurzu přidáte ověřování Microsoftu do projektu TodoApp pomocí ID Microsoft Entra. Před dokončením tohoto kurzu se ujistěte, že jste vytvořili projekt a nasadili back-end.

Poznámka:

Vzhledem k tomu, že aplikace pro iOS vyžaduje přístup ke klíčence, budete muset nastavit zřizovací profil pro iOS. Zřizovací profil vyžaduje skutečné zařízení s iOSem nebo placený vývojářský účet Apple (pokud používáte simulátor). Tento kurz můžete přeskočit a přejít k přidání offline přístupu k aplikaci , pokud kvůli tomuto omezení nemůžete použít ověřování.

Tip

I když pro ověřování používáme ID Microsoft Entra, můžete v Azure Mobile Apps použít libovolnou knihovnu ověřování, kterou si přejete.

Přidání ověřování do back-endové služby

Vaše back-endová služba je standardní služba ASP.NET 6. Všechny kurzy, které ukazují, jak povolit ověřování pro službu ASP.NET 6, funguje s Azure Mobile Apps.

Pokud chcete povolit ověřování Microsoft Entra pro vaši back-endovou službu, musíte:

  • Registrace aplikace pomocí Microsoft Entra ID.
  • Přidejte kontrolu ověřování do back-endového projektu ASP.NET 6.

Registrace aplikace

Nejprve zaregistrujte webové rozhraní API v tenantovi Microsoft Entra a přidejte rozsah podle následujících kroků:

  1. Přihlaste se k portálu Azure.

  2. Pokud máte přístup k více tenantům, pomocí filtru adresářů a předplatných v horní nabídce přepněte na tenanta, ve kterém chcete aplikaci zaregistrovat.

  3. Vyhledejte a vyberte Microsoft Entra ID.

  4. V části Spravovat vyberte Registrace aplikací> Nová registrace.

    • Název: zadejte název vaší aplikace, například Rychlý start aplikace TodoApp. Uživatelé vaší aplikace uvidí tento název. Ten můžete později změnit.
    • Podporované typy účtů: Účty v libovolném organizačním adresáři (Jakýkoli adresář Microsoft Entra – Víceklient) a osobní účty Microsoft (např. Skype, Xbox)
  5. Vyberte Zaregistrovat.

  6. V části Spravovat vyberte Zveřejnit rozhraní API>Přidat obor.

  7. U identifikátoru URI ID aplikace přijměte výchozí nastavení výběrem možnosti Uložit a pokračovat.

  8. Zadejte následující údaje:

    • Název oboru: access_as_user
    • Kdo může souhlasit?: Správa a uživatelé
    • zobrazovaný název Správa souhlasu:Access TodoApp
    • popis souhlasu Správa:Allows the app to access TodoApp as the signed-in user.
    • Zobrazované jméno souhlasu uživatele: Access TodoApp
    • Popis souhlasu uživatele: Allow the app to access TodoApp on your behalf.
    • Stav: Povoleno
  9. Chcete-li dokončit přidání oboru, vyberte Přidat obor .

  10. Poznamenejte si hodnotu oboru, podobně jako api://<client-id>/access_as_user (označovaný jako obor webového rozhraní API). Při konfiguraci klienta potřebujete obor.

  11. Vyberte Přehled.

  12. Poznamenejte si ID aplikace (klienta) v části Základy (označované jako ID aplikace webového rozhraní API). Tuto hodnotu potřebujete ke konfiguraci back-endové služby.

Otevřete Visual Studio a vyberte TodoAppService.NET6 projekt.

  1. Klikněte pravým tlačítkem myši na TodoAppService.NET6 projekt a pak vyberte Spravovat balíčky NuGet....

  2. Na nové kartě vyberte Procházet a do vyhledávacího pole zadejte Microsoft.Identity.Web .

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

  3. Microsoft.Identity.Web Vyberte balíček a stiskněte Nainstalovat.

  4. Podle pokynů dokončete instalaci balíčku.

  5. Otevře záznam typu Program.cs. Do seznamu using příkazů přidejte následující položky:

using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.Identity.Web;
  1. Přidejte následující kód přímo nad volání:builder.Services.AddDbContext()
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
  .AddMicrosoftIdentityWebApi(builder.Configuration);
builder.Services.AddAuthorization();
  1. Přidejte následující kód přímo nad volání:app.MapControllers()
app.UseAuthentication();
app.UseAuthorization();

Váš soubor Program.cs by teď měl vypadat takto:

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. Upravte soubor Controllers\TodoItemController.cs. [Authorize] Přidejte do třídy atribut. Vaše třída by měla vypadat takto:
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. Upravte soubor appsettings.json. Přidejte následující blok:
  "AzureAd": {
    "Instance": "https://login.microsoftonline.com",
    "ClientId": "<client-id>",
    "TenantId": "common"
  },

<client-id> Nahraďte ID aplikace webového rozhraní API, které jste si poznamenali dříve. Po dokončení by měl vypadat takto:

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

Znovu publikujte službu do Azure:

  1. Klikněte pravým tlačítkem myši na TodoAppService.NET6 projekt a pak vyberte Publikovat....
  2. Vyberte tlačítko Publikovat v pravém horním rohu karty.

Otevřete prohlížeč.https://yoursite.azurewebsites.net/tables/todoitem?ZUMO-API-VERSION=3.0.0 Všimněte si, že služba teď vrací 401 odpověď, která indikuje, že se vyžaduje ověřování.

Screenshot of the browser showing an error.

Registrace aplikace ve službě identit

Rozhraní Microsoft Data Sync Framework má integrovanou podporu pro libovolného zprostředkovatele ověřování, který používá webový token JSON (JWT) v hlavičce transakce HTTP. Tato aplikace používá knihovnu MSAL (Microsoft Authentication Library) k vyžádání takového tokenu a autorizaci přihlášeného uživatele do back-endové služby.

Konfigurace nativní klientské aplikace

Můžete registrovat nativní klienty, abyste povolili ověřování webových rozhraní API hostovaných ve vaší aplikaci pomocí klientské knihovny, jako je knihovna Microsoft Identity Library (MSAL).

  1. Na webu Azure Portal vyberte ID> Microsoft Entra Registrace aplikací> New registration.

  2. Na stránce Registrace aplikace :

    • zadejte název registrace aplikace. Název můžete použít k odlišení od názvu native-quickstart , který používá vaše back-endová služba.
    • Vyberte účty v libovolném organizačním adresáři (libovolný adresář Microsoft Entra – Víceklient) a osobní účty Microsoft (např. Skype, Xbox).
    • V identifikátoru URI přesměrování:
      • Výběr veřejného klienta (mobilní a desktopová verze)
      • Zadejte adresu URL. quickstart://auth
  3. Vyberte Zaregistrovat.

  4. Vyberte oprávnění>rozhraní API Přidat oprávnění>Moje rozhraní API.

  5. Vyberte registraci aplikace, kterou jste vytvořili dříve pro vaši back-endovou službu. Pokud registraci aplikace nevidíte, ujistěte se, že jste přidali rozsah access_as_user .

    Screenshot of the scope registration in the Azure portal.

  6. V části Vybrat oprávnění vyberte access_as_user a pak vyberte Přidat oprávnění.

  7. Vyberte Ověřování>mobilních a desktopových aplikací.

  8. Zaškrtněte políčko vedle https://login.microsoftonline.com/common/oauth2/nativeclientpoložky .

  9. Zaškrtněte políčko vedle msal{client-id}://auth položky (nahrazení {client-id} ID vaší aplikace).

  10. Vyberte Přidat identifikátor URI a pak do pole přidejte http://localhost další identifikátory URI.

  11. Vyberte Uložit v dolní části stránky.

  12. Vyberte Přehled. Poznamenejte si ID aplikace (klienta) (označované jako ID nativní klientské aplikace), protože ho potřebujete ke konfiguraci mobilní aplikace.

Definovali jsme tři adresy URL přesměrování:

  • http://localhost používá aplikace WPF.
  • https://login.microsoftonline.com/common/oauth2/nativeclient používá aplikace pro UPW.
  • msal{client-id}://auth používá se mobilními aplikacemi (Android a iOS).

Přidání klienta Microsoft Identity Do aplikace

TodoApp.sln Otevřete řešení v sadě Visual Studio a nastavte projekt jako spouštěný TodoApp.iOS projekt. Přidejte do projektu knihovnu TodoApp.iOS Microsoft Identity Library (MSAL):

Přidejte knihovnu Microsoft Identity Library (MSAL) do projektu platformy:

  1. Klikněte pravým tlačítkem myši na projekt a pak vyberte Spravovat balíčky NuGet....

  2. Vyberte kartu Procházet.

  3. Do vyhledávacího pole zadejte Microsoft.Identity.Client a stiskněte Enter.

  4. Microsoft.Identity.Client Vyberte výsledek a klikněte na Nainstalovat.

    Screenshot of selecting the MSAL NuGet in Visual Studio.

  5. Přijměte licenční smlouvu a pokračujte v instalaci.

Přidejte do konfigurace nativní ID klienta a back-endový obor.

TodoApp.Data Otevřete projekt a upravte Constants.cs soubor. Přidat konstanty pro ApplicationId a 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>"
      };
  }

<client-id> Nahraďte IDnativní klientské aplikace, které jste obdrželi při registraci klientské aplikace v Microsoft Entra ID, a <scope> obor webového rozhraní API, který jste zkopírovali při použití Vystavit rozhraní API při registraci aplikace služby.

Otevřete ViewControllers\HomeViewController.cs v TodoApp.iOS projektu. Přidejte následující příkazy using:

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

HomeViewController Do třídy přidejte novou vlastnost:

public IPublicClientApplication IdentityClient { get; set; }

Upravte konstruktor tak, aby četl:

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

Přidejte metodu GetAuthenticationToken do třídy:

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

Metoda GetAuthenticationToken() pracuje s knihovnou Microsoft Identity Library (MSAL) a získá přístupový token vhodný pro autorizaci přihlášeného uživatele do back-endové služby. Tato funkce se pak předá do objektu RemoteTodoService pro vytvoření klienta. Pokud je ověřování úspěšné, vytvoří AuthenticationToken se s daty potřebnými k autorizaci jednotlivých požadavků. Pokud ne, vytvoří se místo toho chybný token s vypršenou platností.

Do dolní části AppDelegate třídy přidejte následující kód:

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

Přidejte přístup ke klíčence:Entitlements.plist

  1. Otevřete soubor Entitlements.plist.

  2. Vyberte řetězce klíčů.

  3. Ve skupinách řetězce klíčů vyberte Přidat nový .

  4. Zadejte com.microsoft.adalcache jako hodnotu:

    Screenshot showing the i O S entitlements.

Přidejte do projektu vlastní oprávnění:

  1. Klikněte pravým tlačítkem myši na TodoApp.iOS projekt a pak vyberte Vlastnosti.

  2. Vyberte podepisování balíčků pro iOS.

  3. Vyberte tlačítko ... vedle pole Vlastní nároky.

  4. Vyberte Entitlementsa pak vyberte Otevřít.

  5. Stisknutím kombinace kláves Ctrl+S uložte projekt.

    Screenshot showing the i O S bundle signing properties.

Otestování aplikace

Poznámka:

Vzhledem k tomu, že aplikace pro iOS vyžaduje přístup ke klíčence, budete muset nastavit zřizovací profil. Zřizovací profil vyžaduje skutečné zařízení nebo placený vývojářský účet Apple (pokud používáte simulátor).

Nastavte TodoApp.iOS jako spouštěný projekt a pak sestavte a spusťte aplikaci. Po spuštění aplikace se zobrazí výzva k přihlášení k aplikaci. Při prvním spuštění se zobrazí výzva k vyjádření souhlasu s aplikací. Po dokončení ověřování se aplikace spustí normálně.

Další kroky

Dále nakonfigurujte aplikaci tak, aby fungovala offline implementací offline úložiště.

Další texty