Lägga till autentisering i Xamarin.Android-appen

I den här självstudien lägger du till Microsoft-autentisering i TodoApp-projektet med hjälp av Microsoft Entra-ID. Innan du slutför den här självstudien kontrollerar du att du har skapat projektet och distribuerat serverdelen.

Dricks

Även om vi använder Microsoft Entra-ID för autentisering kan du använda valfritt autentiseringsbibliotek som du vill med Azure Mobile Apps.

Lägga till autentisering i serverdelstjänsten

Din serverdelstjänst är en standardtjänst ASP.NET 6. Alla självstudier som visar hur du aktiverar autentisering för en ASP.NET 6-tjänst fungerar med Azure Mobile Apps.

Om du vill aktivera Microsoft Entra-autentisering för din serverdelstjänst måste du:

  • Registrera ett program med Microsoft Entra ID.
  • Lägg till autentiseringskontroll i ASP.NET 6-serverdelsprojektet.

Registrera programmet

Registrera först webb-API:et i din Microsoft Entra-klientorganisation och lägg till ett omfång genom att följa dessa steg:

  1. Logga in på Azure-portalen.

  2. Om du har åtkomst till flera klienter använder du filtret Kataloger + prenumerationer på den översta menyn för att växla till den klientorganisation där du vill registrera programmet.

  3. Sök efter och markera Microsoft Entra ID.

  4. Under Hantera väljer du Appregistreringar> Ny registrering.

    • Namn: ange ett namn för ditt program, till exempel TodoApp Snabbstart. Användare av din app ser det här namnet. Du kan ändra detta senare.
    • Kontotyper som stöds: Konton i valfri organisationskatalog (Alla Microsoft Entra-kataloger – Multitenant) och personliga Microsoft-konton (t.ex. Skype, Xbox)
  5. Välj Registrera.

  6. Under Hantera väljer du Exponera ett API>Lägg till ett omfång.

  7. För Program-ID-URI accepterar du standardvärdet genom att välja Spara och fortsätta.

  8. Ange följande detaljerad information:

    • Omfångsnamn: access_as_user
    • Vem kan samtycka?: Administratörer och användare
    • Visningsnamn för administratörsmedgivande: Access TodoApp
    • Beskrivning av administratörsmedgivande: Allows the app to access TodoApp as the signed-in user.
    • Visningsnamn för användarmedgivande: Access TodoApp
    • Beskrivning av användarmedgivande: Allow the app to access TodoApp on your behalf.
    • Tillstånd: Aktiverad
  9. Välj Lägg till omfång för att slutföra omfångstillägget.

  10. Observera värdet för omfånget, ungefär som api://<client-id>/access_as_user(kallas webb-API-omfånget). Du behöver omfånget när du konfigurerar klienten.

  11. Välj Översikt.

  12. Observera program-ID:t (klient) i avsnittet Essentials (kallas program-ID för webb-API). Du behöver det här värdet för att konfigurera serverdelstjänsten.

Öppna Visual Studio och välj TodoAppService.NET6 projektet.

  1. Högerklicka på TodoAppService.NET6 projektet och välj sedan Hantera NuGet-paket....

  2. På den nya fliken väljer du Bläddra och anger sedan Microsoft.Identity.Web i sökrutan.

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

  3. Välj paketet Microsoft.Identity.Web och tryck sedan på Installera.

  4. Följ anvisningarna för att slutföra installationen av paketet.

  5. Öppna Program.cs. Lägg till följande i listan med using instruktioner:

using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.Identity.Web;
  1. Lägg till följande kod direkt ovanför anropet till builder.Services.AddDbContext():
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
  .AddMicrosoftIdentityWebApi(builder.Configuration);
builder.Services.AddAuthorization();
  1. Lägg till följande kod direkt ovanför anropet till app.MapControllers():
app.UseAuthentication();
app.UseAuthorization();

Nu bör filen Program.cs se ut så här:

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. Controllers\TodoItemController.csRedigera . Lägg till ett [Authorize] attribut i klassen. Klassen bör se ut så här:
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. appsettings.jsonRedigera . Lägg till följande block:
  "AzureAd": {
    "Instance": "https://login.microsoftonline.com",
    "ClientId": "<client-id>",
    "TenantId": "common"
  },

<client-id> Ersätt med det webb-API-program-ID som du registrerade tidigare. När det är klart bör det se ut så här:

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

Publicera tjänsten till Azure igen:

  1. Högerklicka på TodoAppService.NET6 projektet och välj sedan Publicera....
  2. Välj knappen Publicera i det övre högra hörnet på fliken.

Öppna en webbläsare för https://yoursite.azurewebsites.net/tables/todoitem?ZUMO-API-VERSION=3.0.0. Observera att tjänsten nu returnerar ett 401 svar som anger att autentisering krävs.

Screenshot of the browser showing an error.

Registrera din app med identitetstjänsten

Microsoft Data Sync Framework har inbyggt stöd för alla autentiseringsprovider som använder en Json-webbtoken (JWT) i en rubrik i HTTP-transaktionen. Det här programmet använder Microsoft Authentication Library (MSAL) för att begära en sådan token och auktorisera den inloggade användaren till serverdelstjänsten.

Konfigurera ett internt klientprogram

Du kan registrera interna klienter för att tillåta autentisering till webb-API:er som finns i din app med hjälp av ett klientbibliotek, till exempel Microsoft Identity Library (MSAL).

  1. I Azure-portalen väljer du Microsoft Entra-ID> Appregistreringar> Ny registrering.

  2. På sidan Registrera ett program :

    • ange ett Namn för din appregistrering. Du kanske vill använda namnet native-quickstart för att skilja den här från den som används av serverdelstjänsten.
    • Välj Konton i valfri organisationskatalog (Alla Microsoft Entra-kataloger – Multitenant) och personliga Microsoft-konton (t.ex. Skype, Xbox).
    • I omdirigerings-URI:
      • Välj Offentlig klient (mobil och skrivbord)
      • Ange URL:en quickstart://auth
  3. Välj Registrera.

  4. Välj API-behörigheter>Lägg till en behörighet>Mina API:er.

  5. Välj den appregistrering som du skapade tidigare för serverdelstjänsten. Om du inte ser appregistreringen kontrollerar du att du har lagt till access_as_user omfång.

    Screenshot of the scope registration in the Azure portal.

  6. Under Välj behörigheter väljer du access_as_user och sedan Lägg till behörigheter.

  7. Välj Autentisering>Av mobila program och skrivbordsprogram.

  8. Markera kryssrutan bredvid https://login.microsoftonline.com/common/oauth2/nativeclient.

  9. Markera kryssrutan bredvid msal{client-id}://auth (ersätt med ditt program-ID {client-id} ).

  10. Välj Lägg till URI och lägg sedan till http://localhost i fältet för extra URI:er.

  11. Välj Spara längst ned på sidan.

  12. Välj Översikt. Anteckna program-ID :t (klient-ID :t) (kallas för det interna klientprogram-ID:t) eftersom du behöver det för att konfigurera mobilappen.

Vi har definierat tre omdirigerings-URL:er:

  • http://localhost används av WPF-program.
  • https://login.microsoftonline.com/common/oauth2/nativeclient används av UWP-program.
  • msal{client-id}://auth används av mobila program (Android och iOS).

Lägga till Microsoft Identity Client i din app

TodoApp.sln Öppna lösningen i Visual Studio och ange TodoApp.Android projektet som startprojekt. Lägg till Microsoft Identity Library (MSAL) i TodoApp.Android projektet:

Lägg till Microsoft Identity Library (MSAL) i plattformsprojektet:

  1. Högerklicka på projektet och välj sedan Hantera NuGet-paket....

  2. Välj fliken Bläddra.

  3. Ange Microsoft.Identity.Client i sökrutan och tryck sedan på Retur.

  4. Välj resultatet Microsoft.Identity.Client och klicka sedan på Installera.

    Screenshot of selecting the MSAL NuGet in Visual Studio.

  5. Godkänn licensavtalet för att fortsätta installationen.

Lägg till det interna klient-ID:t och serverdelsomfånget i konfigurationen.

TodoApp.Data Öppna projektet och redigera Constants.cs filen. Lägg till konstanter för ApplicationId och 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> Ersätt med det interna klientprogram-ID som du fick när du registrerade klientprogrammet i Microsoft Entra-ID och <scope> med det webb-API-omfång som du kopierade när du använde Exponera ett API när du registrerade tjänstprogrammet.

MainActivity.cs Öppna filen i TodoApp.Android projektet. Överst i filen lägger du till följande using-instruktioner:

using Android.Content;
using Microsoft.Identity.Client;
using Microsoft.Datasync.Client;
using System.Linq;
using System.Threading.Tasks;
using Debug = System.Diagnostics.Debug;

Lägg till följande fält överst i MainActivity klassen:

public IPublicClientApplication identityClient;

OnCreate() I -metoden ändrar du definitionen av TodoService:

TodoService = new RemoteTodoService(GetAuthenticationToken);

Lägg till följande kod för att definiera GetAuthenticationToken() metoden:

public async Task<AuthenticationToken> GetAuthenticationToken()
{
    if (identityClient == null)
    {
        identityClient = PublicClientApplicationBuilder.Create(Constants.ApplicationId)
            .WithAuthority(AzureCloudInstance.AzurePublic, "common")
            .WithRedirectUri($"msal{Constants.ApplicationId}://auth")
            .WithParentActivityOrWindow(() => this)
            .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 ?? ""
    };
}

Metoden GetAuthenticationToken() fungerar med Microsoft Identity Library (MSAL) för att få en åtkomsttoken som lämpar sig för att auktorisera den inloggade användaren till serverdelstjänsten. Den här funktionen skickas sedan till för att RemoteTodoService skapa klienten. Om autentiseringen lyckas skapas den AuthenticationToken med de data som krävs för att auktorisera varje begäran. Annars skapas en felaktig token som har upphört att gälla i stället.

Hantera återanropet från identitetsklienten genom att lägga till följande metod:

protected override void OnActivityResult(int requestCode, [GeneratedEnum] Result resultCode, Intent data)
{
    base.OnActivityResult(requestCode, resultCode, data);
    // Return control to MSAL
    AuthenticationContinuationHelper.SetAuthenticationContinuationEventArgs(requestCode, resultCode, data);
}

Skapa en ny klass MsalActivity med följande kod:

using Android.App;
using Android.Content;
using Microsoft.Identity.Client;

namespace TodoApp.Android
{
    [Activity(Exported = true)]
    [IntentFilter(new[] { Intent.ActionView },
        Categories = new[] { Intent.CategoryBrowsable, Intent.CategoryDefault },
        DataHost = "auth",
        DataScheme = "msal{client-id}")]
    public class MsalActivity : BrowserTabActivity
    {
    }
}

Ersätt {client-id} med program-ID:t för den interna klienten (som är samma som Constants.ApplicationId).

Om ditt projekt är avsett för Android version 11 (API version 30) eller senare måste du uppdatera ditt AndroidManifest.xml för att uppfylla kraven på synlighet för Android-paketet. Öppna Properties/AndroidManifest.xml och lägg till följande queries/intent noder i manifest noden:

<manifest>
  ...
  <queries>
    <intent>
      <action android:name="android.support.customtabs.action.CustomTabsService" />
    </intent>
  </queries>
</manifest>

Testa appen

Kör eller starta om appen.

När appen körs öppnas en webbläsare för att be dig om autentisering. Om du inte har autentiserats med appen tidigare ber appen dig att samtycka. När autentiseringen är klar stängs systemwebbläsaren och appen körs som tidigare.

Nästa steg

Konfigurera sedan programmet så att det fungerar offline genom att implementera ett offlinearkiv.

Ytterligare läsning