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:
Jelentkezzen be az Azure Portal
. 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.
Keresse meg és válassza ki Microsoft Entra-azonosítót.
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)
Válassza a Regisztráláslehetőséget.
A Kezelésterületen válassza az API->Hatókör hozzáadásalehetőséget.
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.
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
-
hatókör neve:
Válassza a Hatókör hozzáadása lehetőséget a hatókör hozzáadásának befejezéséhez.
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.Válassza Áttekintéslehetőséget.
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.
Kattintson a jobb gombbal a
TodoAppService.NET6
projektre, majd válassza a NuGet-csomagok kezelése...lehetőséget.Az új lapon válassza a Tallózáslehetőséget, majd írja be Microsoft.Identity.Web a keresőmezőbe.
Válassza ki a
Microsoft.Identity.Web
csomagot, majd nyomja le a Telepítésbillentyűt.Kövesse az utasításokat a csomag telepítésének befejezéséhez.
Nyissa meg
Program.cs
. Adja hozzá a következőketusing
utasítások listájához:
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.Identity.Web;
- 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();
- 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();
- A
Controllers\TodoItemController.cs
szerkeszté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))
{
}
}
}
- A
appsettings.json
szerkeszté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:
- Kattintson a jobb gombbal a
TodoAppService.NET6
projektre, majd válassza a Közzététel...lehetőséget. - 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.
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.
Az Azure Portal
válassza Microsoft Entra-azonosítót Alkalmazásregisztrációk Új regisztrációs .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
- adjon meg egy név az alkalmazásregisztrációhoz. Érdemes lehet a
Válassza a Regisztráláslehetőséget.
Válassza API-engedélyeket,>Engedély hozzáadása>Saját API-k.
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.
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.
Válassza Hitelesítés>Mobil- és asztali alkalmazásoklehetőséget.
Jelölje be a
https://login.microsoftonline.com/common/oauth2/nativeclient
melletti jelölőnégyzetet.Jelölje be a
msal{client-id}://auth
melletti jelölőnégyzetet (cserélje le a{client-id}
az alkalmazásazonosítóra).Válassza az URI-hozzáadása lehetőséget, majd adjon hozzá
http://localhost
a mezőben további URI-khoz.Válassza Mentés a lap alján lehetőséget.
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:
Kattintson a jobb gombbal a projektre, majd válassza a NuGet-csomagok kezelése...lehetőséget.
Válassza a Tallózás lapot.
Írja be
Microsoft.Identity.Client
a keresőmezőbe, majd nyomja le az Enter billentyűt.Jelölje ki a
Microsoft.Identity.Client
eredményt, majd kattintson a Telepítésgombra.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
:
Nyissa meg a
Entitlements.plist
fájlt.Válassza kulcskarikalehetőséget.
Válassza Új hozzáadása a kulcskarikacsoportokban lehetőséget.
Adja meg a
com.microsoft.adalcache
értéket:
Adja hozzá az egyéni jogosultságokat a projekthez:
Kattintson a jobb gombbal a
TodoApp.Forms.iOS
projektre, majd válassza a Tulajdonságoklehetőséget.Válassza iOS-csomagaláírási.
Válassza a ... gombot az Egyéni jogosultságok mező mellett.
Válassza a
Entitlements
, majd a Megnyitáslehetőséget.A projekt mentéséhez nyomja le a Ctrl+S billentyűkombinációt.
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áz