Dodawanie uwierzytelniania do aplikacji platformy Xamarin.Forms
W tym samouczku dodasz uwierzytelnianie firmy Microsoft do aplikacji przy użyciu identyfikatora Entra firmy Microsoft. Przed ukończeniem tego samouczka upewnij się , że projekt został utworzony i wdrożony zaplecze.
Uwaga
Ponieważ aplikacja systemu iOS wymaga dostępu łańcucha kluczy, należy skonfigurować profil aprowizacji systemu iOS. Profil aprowizacji wymaga rzeczywistego urządzenia z systemem iOS lub płatnego konta dewelopera firmy Apple (jeśli korzystasz z symulatora). Możesz pominąć ten samouczek i przejść do dodawania dostępu w trybie offline do aplikacji , jeśli nie możesz użyć uwierzytelniania z powodu tego ograniczenia.
Napiwek
Mimo że używamy identyfikatora Entra firmy Microsoft do uwierzytelniania, możesz użyć dowolnej biblioteki uwierzytelniania, która ma być używana w usłudze Azure Mobile Apps.
Dodawanie uwierzytelniania do usługi zaplecza
Usługa zaplecza to standardowa usługa ASP.NET 6. Każdy samouczek przedstawiający sposób włączania uwierzytelniania dla usługi ASP.NET 6 działa z usługą Azure Mobile Apps.
Aby włączyć uwierzytelnianie w usłudze zaplecza firmy Microsoft, należy wykonać następujące kroki:
- Rejestrowanie aplikacji usługi Tożsamości Microsoft Entra.
- Dodaj sprawdzanie uwierzytelniania do projektu zaplecza ASP.NET 6.
Rejestrowanie aplikacji
Najpierw zarejestruj internetowy interfejs API w dzierżawie firmy Microsoft Entra i dodaj zakres, wykonując następujące kroki:
Zaloguj się w witrynie Azure Portal.
Jeśli masz dostęp do wielu dzierżaw, użyj filtru Katalogi i subskrypcje w górnym menu, aby przełączyć się do dzierżawy, w której chcesz zarejestrować aplikację.
Wyszukaj i wybierz Tożsamość Microsoft Entra.
W obszarze Zarządzanie wybierz pozycję Rejestracje aplikacji> Nowa rejestracja.
- Nazwa: wprowadź nazwę aplikacji, na przykład Przewodnik Szybki start aplikacji TodoApp. Użytkownicy aplikacji będą widzieć tę nazwę. Możesz ją później zmienić.
- Obsługiwane typy kont: konta w dowolnym katalogu organizacyjnym (dowolny katalog Firmy Microsoft — multitenant) i osobiste konta Microsoft (np. Skype, Xbox)
Wybierz pozycję Zarejestruj.
W obszarze Zarządzanie wybierz pozycję Uwidaczniaj interfejs API>Dodaj zakres.
W polu Identyfikator URI identyfikatora aplikacji zaakceptuj wartość domyślną, wybierając pozycję Zapisz i kontynuuj.
Wprowadź następujące informacje:
- Nazwa zakresu:
access_as_user
- KtoTo może wyrazić zgodę?: Administracja i użytkowników
- Administracja nazwa wyświetlana zgody:
Access TodoApp
- opis zgody Administracja:
Allows the app to access TodoApp as the signed-in user.
- Nazwa wyświetlana zgody użytkownika:
Access TodoApp
- Opis zgody użytkownika:
Allow the app to access TodoApp on your behalf.
- Stan: Włączone
- Nazwa zakresu:
Wybierz pozycję Dodaj zakres , aby ukończyć dodawanie zakresu.
Zanotuj wartość zakresu, podobną do
api://<client-id>/access_as_user
(nazywaną zakresem internetowego interfejsu API). Zakres jest potrzebny podczas konfigurowania klienta.Wybierz Przegląd.
Zanotuj identyfikator aplikacji (klienta) w sekcji Podstawy (nazywany identyfikatorem aplikacji internetowego interfejsu API). Ta wartość jest potrzebna do skonfigurowania usługi zaplecza.
Otwórz program Visual Studio i wybierz TodoAppService.NET6
projekt.
Kliknij prawym przyciskiem myszy
TodoAppService.NET6
projekt, a następnie wybierz polecenie Zarządzaj pakietami NuGet....Na nowej karcie wybierz pozycję Przeglądaj, a następnie wprowadź ciąg Microsoft.Identity.Web w polu wyszukiwania.
Microsoft.Identity.Web
Wybierz pakiet, a następnie naciśnij przycisk Zainstaluj.Postępuj zgodnie z monitami, aby ukończyć instalację pakietu.
Otwórz
Program.cs
. Dodaj następujące elementy do listy instrukcjiusing
:
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.Identity.Web;
- Dodaj następujący kod bezpośrednio nad wywołaniem metody
builder.Services.AddDbContext()
:
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddMicrosoftIdentityWebApi(builder.Configuration);
builder.Services.AddAuthorization();
- Dodaj następujący kod bezpośrednio nad wywołaniem metody
app.MapControllers()
:
app.UseAuthentication();
app.UseAuthorization();
Plik Program.cs
powinien teraz wyglądać następująco:
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();
- Edytuj plik
Controllers\TodoItemController.cs
.[Authorize]
Dodaj atrybut do klasy. Klasa powinna wyglądać następująco:
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))
{
}
}
}
- Edytuj plik
appsettings.json
. Dodaj następujący blok:
"AzureAd": {
"Instance": "https://login.microsoftonline.com",
"ClientId": "<client-id>",
"TenantId": "common"
},
Zastąp element <client-id>
identyfikatorem zarejestrowanej wcześniej aplikacji internetowego interfejsu API. Po zakończeniu powinno to wyglądać następująco:
{
"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": "*"
}
Ponownie opublikuj usługę na platformie Azure:
- Kliknij prawym przyciskiem myszy
TodoAppService.NET6
projekt, a następnie wybierz polecenie Publikuj.... - Wybierz przycisk Publikuj w prawym górnym rogu karty.
Otwórz przeglądarkę w witrynie https://yoursite.azurewebsites.net/tables/todoitem?ZUMO-API-VERSION=3.0.0
. Pamiętaj, że usługa zwraca 401
teraz odpowiedź, która wskazuje, że wymagane jest uwierzytelnianie.
Rejestrowanie aplikacji w usłudze tożsamości
Struktura synchronizacji danych firmy Microsoft ma wbudowaną obsługę dowolnego dostawcy uwierzytelniania, który używa tokenu internetowego Json (JWT) w nagłówku transakcji HTTP. Ta aplikacja używa biblioteki Microsoft Authentication Library (MSAL), aby zażądać takiego tokenu i autoryzować zalogowanego użytkownika do usługi zaplecza.
Konfigurowanie natywnej aplikacji klienckiej
Możesz zarejestrować klientów natywnych, aby zezwolić na uwierzytelnianie w internetowych interfejsach API hostowanych w aplikacji przy użyciu biblioteki klienta, takiej jak biblioteka tożsamości firmy Microsoft (MSAL).
W witrynie Azure Portal wybierz pozycję Microsoft Entra ID> Rejestracje aplikacji> Nowa rejestracja.
Na stronie Rejestrowanie aplikacji:
- Wprowadź nazwę rejestracji aplikacji. Możesz użyć nazwy
native-quickstart
, aby odróżnić tę nazwę od nazwy używanej przez usługę zaplecza. - Wybierz pozycję Konta w dowolnym katalogu organizacyjnym (dowolny katalog Microsoft Entra — multitenant) i osobiste konta Microsoft (np. Skype, Xbox).
- W identyfikatorze URI przekierowania:
- Wybierz pozycję Klient publiczny (mobilny i klasyczny)
- Wprowadź adres URL
quickstart://auth
- Wprowadź nazwę rejestracji aplikacji. Możesz użyć nazwy
Wybierz pozycję Zarejestruj.
Wybierz pozycję Uprawnienia>interfejsu API Dodaj uprawnienie>Moje interfejsy API.
Wybierz rejestrację aplikacji utworzoną wcześniej dla usługi zaplecza. Jeśli rejestracja aplikacji nie jest widoczna, upewnij się, że dodano zakres access_as_user .
W obszarze Wybierz uprawnienia wybierz pozycję access_as_user, a następnie wybierz pozycję Dodaj uprawnienia.
Wybierz pozycję Uwierzytelnianie>aplikacje mobilne i klasyczne.
Zaznacz pole wyboru obok
https://login.microsoftonline.com/common/oauth2/nativeclient
pozycji .Zaznacz pole wyboru obok
msal{client-id}://auth
(zastępując{client-id}
ciąg identyfikatorem aplikacji).Wybierz pozycję Dodaj identyfikator URI, a następnie dodaj
http://localhost
w polu dodatkowe identyfikatory URI.Wybierz pozycję Zapisz w dolnej części strony.
Wybierz Przegląd. Zanotuj identyfikator aplikacji (klienta) (określany jako natywny identyfikator aplikacji klienckiej), ponieważ jest potrzebny do skonfigurowania aplikacji mobilnej.
Zdefiniowaliśmy trzy adresy URL przekierowania:
http://localhost
jest używany przez aplikacje WPF.https://login.microsoftonline.com/common/oauth2/nativeclient
jest używany przez aplikacje platformy UWP.msal{client-id}://auth
jest używany przez aplikacje mobilne (Android i iOS).
Dodawanie klienta tożsamości firmy Microsoft do aplikacji
TodoApp.sln
Otwórz rozwiązanie w programie Visual Studio i ustaw TodoApp.Forms
projekt jako projekt startowy.
Dodaj bibliotekę Microsoft Identity Library (MSAL) do projektu platformy:
Kliknij prawym przyciskiem myszy projekt, a następnie wybierz polecenie Zarządzaj pakietami NuGet....
Wybierz kartę Przeglądaj.
Wprowadź
Microsoft.Identity.Client
w polu wyszukiwania, a następnie naciśnij klawisz Enter.Microsoft.Identity.Client
Wybierz wynik, a następnie kliknij przycisk Zainstaluj.Zaakceptuj umowę licencyjną, aby kontynuować instalację.
Dodaj identyfikator klienta natywnego i zakres zaplecza do konfiguracji.
TodoApp.Data
Otwórz projekt i edytuj Constants.cs
plik. Dodaj stałe dla ApplicationId
i 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>"
};
}
Zastąp element <client-id>
identyfikatoremnatywnej aplikacji klienckiej otrzymanej podczas rejestrowania aplikacji klienckiej w identyfikatorze Entra firmy Microsoft, a <scope>
element zakresem internetowego interfejsu API skopiowanym podczas korzystania z interfejsu API uwidaczniania podczas rejestrowania aplikacji usługi.
TodoApp.Forms
Otwórz projekt. Dodaj nowy plik o nazwie IPlatform.cs
z następującą zawartością:
using Microsoft.Identity.Client;
namespace TodoApp.Forms
{
public interface IPlatform
{
IPublicClientApplication GetIdentityClient(string applicationId);
}
}
Ten interfejs jest używany później, aby umożliwić projektowi udostępnionemu zapytanie o projekt platformy dla klienta tożsamości odpowiedniego dla platformy.
Otwórz App.xaml.cs
. Dodaj następujące instrukcje using
:
using Microsoft.Datasync.Client;
using Microsoft.Identity.Client;
using System.Diagnostics;
using System.Linq;
using System.Threading.Tasks;
App
W klasie dodaj dwie nowe właściwości:
public IPublicClientApplication IdentityClient { get; set; }
public IPlatform PlatformService { get; }
Dostosuj konstruktor do odczytu:
public App(IPlatform platformService)
{
InitializeComponent();
PlatformService = platformService;
TodoService = new RemoteTodoService(GetAuthenticationToken);
MainPage = new NavigationPage(new MainPage(this, TodoService));
}
Dodaj metodę GetAuthenticationToken
do klasy:
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 ?? ""
};
}
Metoda GetAuthenticationToken()
współpracuje z biblioteką Microsoft Identity Library (MSAL), aby uzyskać token dostępu odpowiedni do autoryzowania zalogowanego użytkownika do usługi zaplecza. Ta funkcja jest następnie przekazywana do elementu do RemoteTodoService
tworzenia klienta. Jeśli uwierzytelnianie zakończy się pomyślnie, AuthenticationToken
zostanie wygenerowana z danymi niezbędnymi do autoryzowania każdego żądania. Jeśli nie, zamiast tego zostanie wygenerowany wygasły nieprawidłowy token.
Konfigurowanie aplikacji systemu Android na potrzeby uwierzytelniania
TodoApp.Forms.Android
Otwórz projekt. Utwórz nową klasę MsalActivity
przy użyciu następującego kodu:
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
{
}
}
Zastąp {client-id}
element identyfikatorem aplikacji klienta natywnego (który jest taki sam jak Constants.ApplicationId
).
Jeśli projekt jest przeznaczony dla systemu Android w wersji 11 (interfejs API w wersji 30) lub nowszej, musisz zaktualizować AndroidManifest.xml
element , aby spełnić wymagania dotyczące widoczności pakietu systemu Android. Otwórz TodoApp.Forms.Android/Properties/AndroidManifest.xml
i dodaj następujące queries/intent
węzły do węzła manifest
:
<manifest>
...
<queries>
<intent>
<action android:name="android.support.customtabs.action.CustomTabsService" />
</intent>
</queries>
</manifest>
Otwórz MainActivity.cs
. Dodaj IPlatform
do definicji MainActivity
klasy:
public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity, IPlatform
Zmień wywołanie LoadApplication()
w metodzie OnCreate()
:
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));
}
Dodaj następujący kod w dolnej części klasy:
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;
}
Gdy udostępniony projekt wymaga uwierzytelniania, uzyskuje klienta tożsamości z GetIdentityClient()
programu , a następnie przełącza się do działania wewnętrznego, które otwiera przeglądarkę systemową. Po zakończeniu uwierzytelniania przeglądarka systemowa przekierowuje do zdefiniowanego adresu URL przekierowania (msal{client-id}://auth
). Wychwytywana MsalActivity
jest adres URL przekierowania, który następnie przełącza się z powrotem do głównego działania przez wywołanie metody OnActivityResult()
. Następnie wywołuje pomocnika uwierzytelniania MSAL, który kończy transakcję.
Konfigurowanie aplikacji systemu iOS na potrzeby uwierzytelniania
AppDelegate.cs
Otwórz plik w projekcieTodoApp.Forms.iOS
. Dodaj IPlatform
do definicji AppDelegate
klasy:
public partial class AppDelegate : global::Xamarin.Forms.Platform.iOS.FormsApplicationDelegate, IPlatform
Zmień metodę FinishedLaunching()
na odczyt:
public override bool FinishedLaunching(UIApplication app, NSDictionary options)
{
global::Xamarin.Forms.Forms.Init();
LoadApplication(new App(this));
return base.FinishedLaunching(app, options);
}
Dodaj następujący kod na końcu klasy:
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;
}
Dodaj dostęp łańcucha kluczy do elementu Entitlements.plist
:
Otwórz plik
Entitlements.plist
.Wybierz pozycję Pęk kluczy.
Wybierz pozycję Dodaj nowy w grupach pęku kluczy.
Wprowadź
com.microsoft.adalcache
jako wartość:
Dodaj uprawnienia niestandardowe do projektu:
Kliknij prawym przyciskiem myszy
TodoApp.Forms.iOS
projekt, a następnie wybierz polecenie Właściwości.Wybierz pozycję Podpisywanie pakietu systemu iOS.
Wybierz przycisk ... obok pola Uprawnienia niestandardowe.
Wybierz pozycję
Entitlements
, a następnie wybierz pozycję Otwórz.Naciśnij klawisze Ctrl+S , aby zapisać projekt.
Testowanie aplikacji systemu Android
Ustaw TodoApp.Forms.Android
jako projekt startowy, a następnie naciśnij klawisz F5 , aby skompilować i uruchomić aplikację. Po uruchomieniu aplikacji zostanie wyświetlony monit o zalogowanie się do aplikacji. W pierwszym uruchomieniu zostanie wyświetlona prośba o wyrażenie zgody na aplikację. Po zakończeniu uwierzytelniania aplikacja działa normalnie.
Testowanie aplikacji systemu iOS
Uwaga
Ponieważ aplikacja systemu iOS wymaga dostępu łańcucha kluczy, należy skonfigurować profil aprowizacji. Profil aprowizacji wymaga rzeczywistego urządzenia lub płatnego konta dewelopera firmy Apple (jeśli korzystasz z symulatora). Aby uzyskać więcej informacji, zobacz Device provisioning for iOS (Aprowizowanie urządzeń dla systemu iOS).
Ustaw TodoApp.Forms.iOS
jako projekt startowy, a następnie naciśnij klawisz F5 , aby skompilować i uruchomić aplikację. Po uruchomieniu aplikacji zostanie wyświetlony monit o zalogowanie się do aplikacji. W pierwszym uruchomieniu zostanie wyświetlona prośba o wyrażenie zgody na aplikację. Po zakończeniu uwierzytelniania aplikacja działa normalnie.
Następne kroki
Następnie skonfiguruj aplikację tak, aby działała w trybie offline, implementując magazyn w trybie offline.
Dalsze informacje
- Szybki start: ochrona internetowego interfejsu API za pomocą Platforma tożsamości Microsoft
- Wymagania dotyczące konfiguracji i porady dotyczące rozwiązywania problemów dotyczące platformy Xamarin Dla systemu Android z MSAL.NET
- Zagadnienia dotyczące korzystania z platformy Xamarin dla systemu iOS z systemem MSAL.NET
- Scenariusz: aplikacja mobilna, która wywołuje internetowe interfejsy API
Opinia
https://aka.ms/ContentUserFeedback.
Dostępne już wkrótce: W 2024 r. będziemy stopniowo wycofywać zgłoszenia z serwisu GitHub jako mechanizm przesyłania opinii na temat zawartości i zastępować go nowym systemem opinii. Aby uzyskać więcej informacji, sprawdź:Prześlij i wyświetl opinię dla