Megosztás a következőn keresztül:


Hitelesítés hozzáadása a Xamarin.Forms alkalmazáshoz

Jegyzet

Ez a termék ki van állítva. A .NET 8-at vagy újabb verziót használó projektek cseréjét a Community Toolkit Datasync kódtárcímű témakörben talál.

Ebben az oktatóanyagban Microsoft-hitelesítést ad hozzá az alkalmazáshoz a Microsoft Entra ID azonosítójával. Az oktatóanyag elvégzése előtt győződjön meg arról, hogy létrehozta a projektet, és üzembe helyezte a háttérrendszert.

Jegyzet

Mivel az iOS-alkalmazás kulcskarika-hozzáférést igényel, be kell állítania egy iOS kiépítési profilt. A kiépítési profilhoz valódi iOS-eszközre vagy fizetős Apple Fejlesztői fiókra van szükség (ha a szimulátort használja). Kihagyhatja ezt az oktatóanyagot, és továbbléphet arra, hogy offline hozzáférést adjon az alkalmazáshoz, ha a korlátozás miatt nem tudja használni a hitelesítést.

Borravaló

Bár a Hitelesítéshez Microsoft Entra-azonosítót használunk, az Azure Mobile Appsben bármilyen hitelesítési kódtárat használhat.

Hitelesítés hozzáadása a háttérszolgáltatáshoz

A háttérszolgáltatás egy standard ASP.NET 6 szolgáltatás. Minden olyan oktatóanyag, amely bemutatja, hogyan engedélyezheti a hitelesítést egy ASP.NET 6 szolgáltatáshoz, az Azure Mobile Apps szolgáltatással működik.

A Microsoft Entra-hitelesítés háttérszolgáltatáshoz való engedélyezéséhez a következőkre van szükség:

  • Alkalmazás regisztrálása a Microsoft Entra-azonosítóval.
  • Hitelesítési ellenőrzés hozzáadása a ASP.NET 6 háttérprojekthez.

Az alkalmazás regisztrálása

Először regisztrálja a webes API-t a Microsoft Entra-bérlőben, és adjon hozzá egy hatókört az alábbi lépések végrehajtásával:

  1. Jelentkezzen be az Azure Portal.

  2. Ha több bérlőhöz is hozzáfér, a Címtárak + előfizetések szűrővel váltson arra a bérlőre, amelyben regisztrálni szeretné az alkalmazást.

  3. Keresse meg és válassza ki Microsoft Entra-azonosítót.

  4. A Kezelésterületen válassza Alkalmazásregisztrációk>Új regisztrációslehetőséget.

    • Név: adja meg az alkalmazás nevét; például TodoApp gyorsútmutató. Az alkalmazás felhasználói ezt a nevet fogják látni. Később módosíthatja.
    • Támogatott fióktípusok: Bármely szervezeti címtárban (Bármely Microsoft Entra címtár – Több-bérlős) és személyes Microsoft-fiókokban (pl. Skype, Xbox)
  5. Válassza a Regisztráláslehetőséget.

  6. A Kezelésterületen válassza az API->Hatókör hozzáadásalehetőséget.

  7. Az alkalmazásazonosító URI-esetében fogadja el az alapértelmezett beállítást a Mentés ésfolytatása lehetőség kiválasztásával.

  8. Adja meg a következő adatokat:

    • hatókör neve: access_as_user
    • Ki tud hozzájárulni?: rendszergazdák és felhasználók
    • rendszergazdai hozzájárulás megjelenítendő neve: Access TodoApp
    • rendszergazdai hozzájárulás leírása: Allows the app to access TodoApp as the signed-in user.
    • felhasználói hozzájárulás megjelenítendő neve: Access TodoApp
    • felhasználói hozzájárulás leírása: Allow the app to access TodoApp on your behalf.
    • Állapot: Engedélyezett
  9. Válassza a Hatókör hozzáadása lehetőséget a hatókör hozzáadásának befejezéséhez.

  10. Figyelje meg a hatókör értékét, hasonlóan a api://<client-id>/access_as_user (más néven a Webes API-hatókör). Az ügyfél konfigurálásakor szükség van a hatókörre.

  11. Válassza Áttekintéslehetőséget.

  12. Figyelje meg a alkalmazás (ügyfél) azonosítóját az Essentials szakaszban (a továbbiakban: Web API-alkalmazásazonosító). Erre az értékre van szüksége a háttérszolgáltatás konfigurálásához.

Nyissa meg a Visual Studiót, és válassza ki a TodoAppService.NET6 projektet.

  1. Kattintson a jobb gombbal a TodoAppService.NET6 projektre, majd válassza a NuGet-csomagok kezelése...lehetőséget.

  2. Az új lapon válassza a Tallózáslehetőséget, majd írja be Microsoft.Identity.Web a keresőmezőbe.

    Képernyőkép az M S A L NuGet Visual Studióban való hozzáadásáról.

  3. Válassza ki a Microsoft.Identity.Web csomagot, majd nyomja le a Telepítésbillentyűt.

  4. Kövesse az utasításokat a csomag telepítésének befejezéséhez.

  5. Nyissa meg Program.cs. Adja hozzá a következőket using utasítások listájához:

using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.Identity.Web;
  1. Adja hozzá a következő kódot közvetlenül a builder.Services.AddDbContext()hívása fölé:
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
  .AddMicrosoftIdentityWebApi(builder.Configuration);
builder.Services.AddAuthorization();
  1. Adja hozzá a következő kódot közvetlenül a app.MapControllers()hívása fölé:
app.UseAuthentication();
app.UseAuthorization();

A Program.cs a következőképpen kell kinéznie:

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. A Controllers\TodoItemController.csszerkesztése. Adjon hozzá egy [Authorize] attribútumot az osztályhoz. Az osztálynak így kell kinéznie:
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. A appsettings.jsonszerkesztése. Adja hozzá a következő blokkot:
  "AzureAd": {
    "Instance": "https://login.microsoftonline.com",
    "ClientId": "<client-id>",
    "TenantId": "common"
  },

Cserélje le a <client-id> a korábban rögzített webes API-alkalmazásazonosítóra. Ha elkészült, a következőhöz hasonlóan kell kinéznie:

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

A szolgáltatás ismételt közzététele az Azure-ban:

  1. Kattintson a jobb gombbal a TodoAppService.NET6 projektre, majd válassza a Közzététel...lehetőséget.
  2. Válassza a Közzététel gombot a lap jobb felső sarkában.

Nyisson meg egy böngészőt a https://yoursite.azurewebsites.net/tables/todoitem?ZUMO-API-VERSION=3.0.0. Vegye figyelembe, hogy a szolgáltatás most egy 401 választ ad vissza, amely azt jelzi, hogy hitelesítésre van szükség.

A hibaüzenetet megjelenítő böngésző képernyőképe.

Alkalmazás regisztrálása az identitásszolgáltatásban

A Microsoft Data Sync Framework beépített támogatást nyújt minden olyan hitelesítésszolgáltatóhoz, amely Json Web Tokent (JWT) használ a HTTP-tranzakció fejlécén belül. Ez az alkalmazás a Microsoft Authentication Library (MSAL) használatával kéri le az ilyen jogkivonatot, és engedélyezi a bejelentkezett felhasználót a háttérszolgáltatásnak.

Natív ügyfélalkalmazás konfigurálása

Natív ügyfelek regisztrálásával engedélyezheti az alkalmazásban üzemeltetett webes API-k hitelesítését egy ügyfélkódtár, például a Microsoft Identity Library (MSAL) használatával.

  1. Az Azure Portalválassza Microsoft Entra-azonosítótAlkalmazásregisztrációkÚj regisztrációs.

  2. Az Alkalmazás regisztrálása lapon:

    • adjon meg egy név az alkalmazásregisztrációhoz. Érdemes lehet a native-quickstart nevet használni, hogy megkülönböztesse ezt a háttérszolgáltatás által használttól.
    • Válassza a -fiókokat bármely szervezeti könyvtárban (Bármely Microsoft Entra könyvtár – Több-bérlős) és személyes Microsoft-fiókokban (pl. Skype, Xbox).
    • Átirányítási URI:
      • Válassza nyilvános ügyfél (mobil & asztali)
      • Adja meg az URL-quickstart://auth
  3. Válassza a Regisztráláslehetőséget.

  4. Válassza API-engedélyeket,>Engedély hozzáadása>Saját API-k.

  5. Válassza ki a háttérszolgáltatáshoz korábban létrehozott alkalmazásregisztrációt. Ha nem látja az alkalmazásregisztrációt, győződjön meg arról, hogy hozzáadta a access_as_user hatókört.

    Képernyőkép a hatókör regisztrációjáról az Azure Portalon.

  6. Az Engedélyek kiválasztásaterületen válassza a access_as_userlehetőséget, majd válassza az Engedélyek hozzáadásalehetőséget.

  7. Válassza Hitelesítés>Mobil- és asztali alkalmazásoklehetőséget.

  8. Jelölje be a https://login.microsoftonline.com/common/oauth2/nativeclientmelletti jelölőnégyzetet.

  9. Jelölje be a msal{client-id}://auth melletti jelölőnégyzetet (cserélje le a {client-id} az alkalmazásazonosítóra).

  10. Válassza az URI-hozzáadása lehetőséget, majd adjon hozzá http://localhost a mezőben további URI-khoz.

  11. Válassza Mentés a lap alján lehetőséget.

  12. Válassza Áttekintéslehetőséget. Jegyezze fel az alkalmazás (ügyfél) azonosítóját (a natív ügyfélalkalmazás-azonosítót) a mobilalkalmazás konfigurálásához.

Három átirányítási URL-címet határoztunk meg:

  • http://localhost a WPF-alkalmazások használják.
  • https://login.microsoftonline.com/common/oauth2/nativeclient UWP-alkalmazások használják.
  • msal{client-id}://auth mobilalkalmazások (Android és iOS) használják.

A Microsoft Identity-ügyfél hozzáadása az alkalmazáshoz

Nyissa meg a TodoApp.sln megoldást a Visual Studióban, és állítsa be a TodoApp.Forms projektet indítási projektként.

Adja hozzá a Microsoft Identity Library (MSAL) a platformprojekthez:

  1. Kattintson a jobb gombbal a projektre, majd válassza a NuGet-csomagok kezelése...lehetőséget.

  2. Válassza a Tallózás lapot.

  3. Írja be Microsoft.Identity.Client a keresőmezőbe, majd nyomja le az Enter billentyűt.

  4. Jelölje ki a Microsoft.Identity.Client eredményt, majd kattintson a Telepítésgombra.

    Képernyőkép az MSAL NuGet kiválasztásáról a Visual Studióban.

  5. A telepítés folytatásához fogadja el a licencszerződést.

Adja hozzá a natív ügyfélazonosítót és a háttérbeli hatókört a konfigurációhoz.

Nyissa meg a TodoApp.Data projektet, és szerkessze a Constants.cs fájlt. Konstansok hozzáadása ApplicationId és 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>"
      };
  }

Cserélje le a <client-id> az ügyfélalkalmazás Microsoft Entra-azonosítóban való regisztrálásakor kapott natív ügyfélalkalmazás-azonosítóra, a <scope> pedig a webes API-hatókörre, amelyet a szolgáltatásalkalmazás regisztrálása során API- használatakor másolt.

Nyissa meg a TodoApp.Forms projektet. Adjon hozzá egy IPlatform.cs nevű új fájlt a következő tartalommal:

using Microsoft.Identity.Client;

namespace TodoApp.Forms
{
    public interface IPlatform
    {
        IPublicClientApplication GetIdentityClient(string applicationId);
    }
}

Ez a felület később lehetővé teszi a megosztott projekt számára, hogy a platformprojekthez megfelelő identitásügyfélt kérjen a platformtól.

Nyissa meg App.xaml.cs. Adja hozzá a következő using utasításokat:

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

A App osztályban adjon hozzá két új tulajdonságot:

public IPublicClientApplication IdentityClient { get; set; }
public IPlatform PlatformService { get; }

Állítsa be a konstruktort a következőhöz:

public App(IPlatform platformService)
{
    InitializeComponent();

    PlatformService = platformService;
    TodoService = new RemoteTodoService(GetAuthenticationToken);
    MainPage = new NavigationPage(new MainPage(this, TodoService));
}

Adja hozzá a GetAuthenticationToken metódust az osztályhoz:

public async Task<AuthenticationToken> GetAuthenticationToken()
{
    if (IdentityClient == null)
    {
        IdentityClient = PlatformService.GetIdentityClient(Constants.ApplicationId);
    }

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

A GetAuthenticationToken() metódus a Microsoft Identity Library (MSAL) segítségével olyan hozzáférési jogkivonatot kap, amely alkalmas a bejelentkezett felhasználó háttérszolgáltatáshoz való engedélyezésére. Ezt a függvényt ezután a rendszer átadja a RemoteTodoService az ügyfél létrehozásához. Ha a hitelesítés sikeres, a AuthenticationToken az egyes kérések engedélyezéséhez szükséges adatokkal állítják elő. Ha nem, akkor a rendszer ehelyett egy lejárt hibás jogkivonatot hoz létre.

Az Android-alkalmazás konfigurálása hitelesítéshez

Nyissa meg a TodoApp.Forms.Android projektet. Hozzon létre egy új osztály MsalActivity a következő kóddal:

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

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

Cserélje le a {client-id} a natív ügyfél alkalmazásazonosítójára (amely megegyezik Constants.ApplicationId).

Ha a projekt az Android 11-es (API 30-as) vagy újabb verzióját célozza, frissítenie kell a AndroidManifest.xml, hogy megfeleljen az Android-csomagok láthatósági követelményeinek. Nyissa meg TodoApp.Forms.Android/Properties/AndroidManifest.xml, és adja hozzá a következő queries/intent csomópontokat a manifest csomóponthoz:

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

Nyissa meg MainActivity.cs. Adja hozzá a IPlatform a MainActivity osztály definícióját:

public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity, IPlatform

Módosítsa a LoadApplication() hívást a OnCreate() metódusban:

protected override void OnCreate(Bundle savedInstanceState)
{
    base.OnCreate(savedInstanceState);

    Xamarin.Essentials.Platform.Init(this, savedInstanceState);
    global::Xamarin.Forms.Forms.Init(this, savedInstanceState);
    LoadApplication(new App(this));
}

Adja hozzá a következő kódot az osztály aljára:

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

public IPublicClientApplication GetIdentityClient(string applicationId)
{
    var identityClient = PublicClientApplicationBuilder.Create(applicationId)
        .WithAuthority(AzureCloudInstance.AzurePublic, "common")
        .WithRedirectUri($"msal{applicationId}://auth")
        .WithParentActivityOrWindow(() => this)
        .Build();
    return identityClient;
}

Amikor a megosztott projekt hitelesítést igényel, lekérjük az identitásügyfélt a GetIdentityClient(), majd átváltunk egy belső tevékenységre, amely megnyitja a rendszerböngészőt. A hitelesítés befejezése után a rendszerböngésző átirányítja a megadott átirányítási URL-címre (msal{client-id}://auth). A MsalActivity csapdába ejti az átirányítási URL-címet, majd visszavállalja a fő tevékenységre OnActivityResult()meghívásával. Ezután meghívja az MSAL hitelesítési segédet, amely befejezi a tranzakciót.

Az iOS-alkalmazás konfigurálása hitelesítéshez

Nyissa meg a AppDelegate.cs fájlt a TodoApp.Forms.iOS projektben. Adja hozzá a IPlatform a AppDelegate osztály definícióját:

public partial class AppDelegate : global::Xamarin.Forms.Platform.iOS.FormsApplicationDelegate, IPlatform

Módosítsa a FinishedLaunching() metódust olvasásra:

public override bool FinishedLaunching(UIApplication app, NSDictionary options)
{
    global::Xamarin.Forms.Forms.Init();
    LoadApplication(new App(this));
    return base.FinishedLaunching(app, options);
}

Adja hozzá a következő kódot az osztály végéhez:

public override bool OpenUrl(UIApplication app, NSUrl url, NSDictionary options)
{
    bool result = AuthenticationContinuationHelper.SetAuthenticationContinuationEventArgs(url);
    return result || base.OpenUrl(app, url, options);
}

public IPublicClientApplication GetIdentityClient(string applicationId)
{
    var identityClient = PublicClientApplicationBuilder.Create(applicationId)
        .WithIosKeychainSecurityGroup("com.microsoft.adalcache")
        .WithRedirectUri($"msal{applicationId}://auth")
        .Build();
    return identityClient;
}

Kulcskarika-hozzáférés hozzáadása a Entitlements.plist:

  1. Nyissa meg a Entitlements.plist fájlt.

  2. Válassza kulcskarikalehetőséget.

  3. Válassza Új hozzáadása a kulcskarikacsoportokban lehetőséget.

  4. Adja meg a com.microsoft.adalcache értéket:

    Képernyőkép az i O S jogosultságokról.

Adja hozzá az egyéni jogosultságokat a projekthez:

  1. Kattintson a jobb gombbal a TodoApp.Forms.iOS projektre, majd válassza a Tulajdonságoklehetőséget.

  2. Válassza iOS-csomagaláírási.

  3. Válassza a ... gombot az Egyéni jogosultságok mező mellett.

  4. Válassza a Entitlements, majd a Megnyitáslehetőséget.

  5. A projekt mentéséhez nyomja le a Ctrl+S billentyűkombinációt.

    Képernyőkép az i O S-csomag aláírási tulajdonságairól.

Az Android-alkalmazás tesztelése

Állítsa be a TodoApp.Forms.Android indítási projektként, majd nyomja le az F5 billentyűt az alkalmazás létrehozásához és futtatásához. Az alkalmazás indításakor a rendszer kérni fogja, hogy jelentkezzen be az alkalmazásba. Az első futtatáskor a rendszer arra kéri, hogy járuljon hozzá az alkalmazáshoz. A hitelesítés befejezése után az alkalmazás a szokásos módon fut.

Az iOS-alkalmazás tesztelése

Jegyzet

Mivel az iOS-alkalmazás kulcskarika-hozzáférést igényel, be kell állítania egy kiépítési profilt. A kiépítési profilhoz valódi eszközre vagy fizetős Apple Fejlesztői Fiókra van szükség (ha a szimulátort használja). További információ: Eszközkiépítés iOS-.

Állítsa be a TodoApp.Forms.iOS indítási projektként, majd nyomja le az F5 billentyűt az alkalmazás létrehozásához és futtatásához. Az alkalmazás indításakor a rendszer kérni fogja, hogy jelentkezzen be az alkalmazásba. Az első futtatáskor a rendszer arra kéri, hogy járuljon hozzá az alkalmazáshoz. A hitelesítés befejezése után az alkalmazás a szokásos módon fut.

Következő lépések

Ezután konfigurálja az alkalmazást offline működésre egy offline áruházimplementálásával.

További olvasás