Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
En esta aplicación de ejemplo, se muestra cómo compilar una .NET MAUIBlazor Hybrid aplicación con un que usa ASP.NET Blazor Web App Core Identity. Muestra cómo compartir una interfaz de usuario común y autenticarse con ASP.NET cuentas locales principales Identity . Aunque se usa ASP.NET Core Identity , puede usar este patrón para cualquier proveedor de autenticación de un cliente MAUI Blazor Hybrid .
El ejemplo :
- Configura la interfaz de usuario para mostrar u ocultar páginas en función de la autenticación del usuario.
- Configura ASP.NET puntos de conexión principales Identity para clientes remotos.
- Inicia y cierra la sesión de los usuarios y actualiza los tokens del cliente MAUI.
- Guarda y recupera tokens en el almacenamiento seguro del dispositivo.
- Llama a un punto de conexión seguro (
/api/weather
) desde el cliente para los datos meteorológicos.
Requisitos previos y pasos preliminares
Para conocer los requisitos previos y los pasos preliminares, consulta Compilar una .NET MAUIBlazor Hybrid aplicación. Se recomienda usar el tutorial de MAUI Blazor Hybrid para configurar el sistema local para el desarrollo de MAUI antes de usar las instrucciones de este artículo y la aplicación de ejemplo.
Aplicación de ejemplo
Obtenga la aplicación de ejemplo en la MauiBlazorWebIdentity
carpeta del repositorio de GitHub deBlazor ejemplos (dotnet/blazor-samples
) (.NET 9 o posterior).
La aplicación de ejemplo es una solución de inicio que contiene una aplicación MAUI Blazor Hybrid nativa y multiplataforma, un Blazor Web App, y una biblioteca de Razor clases (RCL) que contiene la interfaz de usuario compartida (Razor componentes) que usan las aplicaciones nativas y web.
- Clone este repositorio o descargue un archivo ZIP del repositorio. Para obtener más información, consulte Cómo descargar un ejemplo.
- Asegúrese de que tiene .NET 9 y la carga de trabajo MAUI instalada (.NET MAUI documentación).
- Abra la solución en Visual Studio (2022 o posterior) o VS Code con la .NET MAUI extensión instalada.
- Establezca el
MauiBlazorWeb
proyecto MAUI como proyecto de inicio. En Visual Studio, haga clic con el botón secundario en el proyecto y seleccione Establecer como proyecto de inicio. - Inicie el
MauiBlazorWeb.Web
proyecto sin depurar. En Visual Studio, haga clic con el botón secundario en el proyecto y seleccione Depurar>iniciar sin depurar. - Inspeccione los Identity puntos de conexión navegando a
https://localhost:7157/swagger
en un explorador. - Vaya hasta
https://localhost:7157/account/register
para registrar un usuario en el Blazor Web Apparchivo . Inmediatamente después de que el usuario se registre, use el enlace Haga clic aquí para confirmar su cuenta en la interfaz de usuario para confirmar la dirección de correo electrónico del usuario porque un remitente de correo electrónico real no está registrado para la confirmación de la cuenta. - Inicie (
F5
) elMauiBlazorWeb
proyecto MAUI. Puedes establecer el destino de depuración en Windows o en un emulador de Android. - Tenga en cuenta que solo puede ver las
Home
páginas yLogin
. - Inicie sesión con el usuario que registró.
- Observe que ahora puede ver las páginas compartidas
Counter
yWeather
. - Cierre la sesión y observe que solo puede volver a ver las
Home
páginas yLogin
. - Navegue hasta
https://localhost:7157/
en un navegador y la aplicación web se comportará de la misma manera.
Interfaz de usuario compartida
La interfaz de usuario compartida está en el MauiBlazorWeb.Shared
proyecto. Este proyecto contiene los Razor componentes que se comparten entre el MAUI y Blazor Web App los proyectos (Homepáginas , Contador y Tiempo). El componente y Weather
el Counter
componente están protegidos por atributos, por lo que los usuarios no pueden navegar hasta [Authorize]
ellos a menos que hayan iniciado sesión en la aplicación.
En las Razor directivas en la parte superior de los Counter
archivos component (MauiBlazorWeb.Shared/Pages/Counter.razor
) y Weather
component (MauiBlazorWeb.Shared/Pages/Weather.razor
):
@using Microsoft.AspNetCore.Authorization
@attribute [Authorize]
Aplicación MAUI y Blazor Web App enrutamiento
El Routes
componente utiliza un AuthorizeRouteView para enrutar a los usuarios en función de su estado de autenticación. Si un usuario no está autenticado, se le redirige a la Login
página. Para obtener más información, consulte ASP.NET Core Blazor autenticación y autorización.
En MauiBlazorWeb.Web/Components/Routes.razor
:
<AuthorizeRouteView ...>
<Authorizing>
Authorizing...
</Authorizing>
<NotAuthorized>
<Login />
</NotAuthorized>
</AuthorizeRouteView>
El NavMenu
componente contiene el menú de navegación que utiliza un AuthorizeView
componente para mostrar u ocultar vínculos en función del estado de autenticación del usuario.
En MauiBlazorWeb.Web/Components/Layout/NavMenu.razor
:
<AuthorizeView>
<NotAuthorized>
...
</NotAuthorized>
<Authorized>
...
</Authorized>
</AuthorizeView>
Proyecto de servidor
El Blazor Web App proyecto (MauiBlazorWeb.Web
) de la aplicación de muestra contiene las páginas principales Identity ASP.NET y usa la clase de SignInManager<TUser> marco para administrar inicios de sesión y usuarios en el servidor. Para que el cliente MAUI (o cualquier cliente externo) se autentique, los Identity puntos de conexión deben estar registrados y expuestos. En el Program
archivo, Identity los puntos de conexión se configuran con las llamadas a:
- AddIdentityApiEndpoints
- MapIdentityApi
-
MapAdditionalIdentityEndpoints
(MauiBlazorWeb.Web/Components/Account/IdentityComponentsEndpointRouteBuilderExtensions.cs
).
En MauiBlazorWeb.Web/Program.cs
:
builder.Services.AddIdentityApiEndpoints<ApplicationUser>(...)
.AddEntityFrameworkStores<ApplicationDbContext>();
...
app.MapGroup("/identity").MapIdentityApi<ApplicationUser>();
...
app.MapAdditionalIdentityEndpoints();
Importante
ASP.NET páginas principales Identity y la implementación de la SignInManager<TUser> clase de marco para administrar inicios de sesión y usuarios se genera automáticamente al crear un proyecto a partir de la Blazor Web App plantilla de proyecto con cuentas individuales.
Este artículo se centra en el uso de la aplicación de ejemplo proporcionada; Pero al crear un nuevo proyecto a partir de la Blazor Web App plantilla, debe eliminar la llamada generada a AddIdentityCookies ON AddAuthentication. La llamada no es necesaria cuando se implementa la API, como MapAdditionalIdentityEndpoints
en la aplicación de ejemplo, y da como resultado un error si se deja en la aplicación.
Inicie sesión desde el cliente MAUI
El Login
componente (/identity/login
punto final) es donde el usuario inicia sesión. El componente inyecta el MauiAuthenticationStateProvider
(MauiBlazorWeb/Services/MauiAuthenticationStateProvider.cs
) y lo AuthenticationStateProvider utiliza para autenticar al usuario y redirigirlo a la página de inicio si tiene éxito. Cuando cambia el estado, el AuthorizeView
componente muestra los vínculos adecuados en función del estado de autenticación del usuario.
En MauiBlazorWeb/Components/Pages/Login.razor
:
private async Task LoginUser()
{
await AuthStateProvider.LogInAsync(LoginModel);
if (AuthStateProvider.LoginStatus != LoginStatus.Success)
{
loginFailureHidden = false;
return;
}
Navigation.NavigateTo("");
}
Nota:
En este ejemplo solo se implementan las páginas de inicio y cierre de sesión en el cliente MAUI, pero puede crear páginas de registro y otras páginas de administración en los puntos de conexión expuestos Identity para obtener más funcionalidad. Para obtener más información sobre los puntos de Identity conexión, consulte Uso Identity para proteger un back-end de API web para SPA.
Proveedor de estado de autenticación MAUI (MauiAuthenticationStateProvider
)
La MauiAuthenticationStateProvider
clase es responsable de administrar el estado de autenticación del usuario y proporcionar el AuthenticationState a la aplicación. La MauiAuthenticationStateProvider
clase utiliza un HttpClient para realizar solicitudes al servidor para autenticar al usuario. Para obtener más información, consulte ASP.NET Core Blazor Hybrid autenticación y autorización.
En MauiBlazorWeb/Services/MauiAuthenticationStateProvider.cs
:
private async Task<ClaimsPrincipal> LoginWithProviderAsync(LoginRequest loginModel)
{
var authenticatedUser = _defaultUser;
LoginStatus = LoginStatus.None;
try
{
// Call the Login endpoint and pass the email and password
var httpClient = HttpClientHelper.GetHttpClient();
var loginData = new { loginModel.Email, loginModel.Password };
using var response = await httpClient.PostAsJsonAsync(HttpClientHelper.LoginUrl,
loginData);
LoginStatus =
response.IsSuccessStatusCode ? LoginStatus.Success : LoginStatus.Failed;
if (LoginStatus == LoginStatus.Success)
{
// Save token to secure storage so the user doesn't have to login
// every time
var token = await response.Content.ReadAsStringAsync();
_accessToken = await TokenStorage.SaveTokenToSecureStorageAsync(token,
loginModel.Email);
authenticatedUser = CreateAuthenticatedUser(loginModel.Email);
LoginStatus = LoginStatus.Success;
}
else
{
LoginFailureMessage = "Invalid Email or Password. Please try again.";
LoginStatus = LoginStatus.Failed;
}
}
catch (Exception ex)
{
Debug.WriteLine($"Error logging in: {ex}");
LoginFailureMessage = "Server error.";
LoginStatus = LoginStatus.Failed;
}
return authenticatedUser;
}
La MauiAuthenticationStateProvider
clase usa () para controlar las HttpClientHelper
MauiBlazorWeb/Services/HttpClientHelper.cs
llamadas a localhost a través de los emuladores y simuladores para realizar pruebas. Para obtener más información sobre cómo llamar a servicios locales desde emuladores y simuladores, consulta Conexión a servicios web locales desde emuladores de Android y simuladores de iOS (.NET MAUIdocumentación).
El proveedor de estado de autenticación MAUI también usa la clase (MauiBlazorWeb/Services/TokenStorage.cs
) que usa SecureStorage
API (.NET MAUI documentación) para almacenar el token del usuario de forma segura en el dispositivo.TokenStorage
Actualiza el token cerca de la caducidad del token para evitar inicios de sesión de usuario.
Archivo MAUI MauiProgram
El archivo del proyecto MauiProgram
MAUI (MauiProgram.cs
) es donde se MauiAuthenticationStateProvider
registra en el contenedor DI. También se registran los componentes principales de autorización, donde se definen la API, como AuthorizeView
el componente .
En MauiBlazorWeb/MauiProgram.cs
, la funcionalidad principal se agrega llamando a AddAuthorizationCore:
builder.Services.AddAuthorizationCore();
El () personalizado AuthenticationStateProvider de la aplicación se registra en MauiProgram.cs
:MauiAuthenticationStateProvider
builder.Services.AddScoped<MauiAuthenticationStateProvider>();
Úselo MauiAuthenticationStateProvider
cuando la aplicación requiera un AuthenticationStateProvider:
builder.Services.AddScoped<AuthenticationStateProvider>(s =>
(MauiAuthenticationStateProvider)
s.GetRequiredService<MauiAuthenticationStateProvider>());