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.
ASP.NET Core Identity:
- Es una API que admite la funcionalidad de inicio de sesión de la interfaz de usuario (UI).
- Administra usuarios, contraseñas, datos de perfil, roles, notificaciones, tokens, confirmación por correo electrónico, etc.
Los usuarios pueden crear una cuenta con la información de inicio de sesión almacenada en o pueden usar un proveedor de inicio de sesión externo. Los proveedores de inicios de sesión externos admitidos incluyen Facebook, Google, Cuenta microsoft y Twitter.
Para obtener información sobre cómo requerir autenticación para todos los usuarios de la aplicación, consulte Crear una aplicación de ASP.NET Core con datos de usuario protegidos por autorización.
El código fuente Identity está disponible en GitHub. Andamio y ver los archivos generados para revisar la interacción de la plantilla con .
Identity se configura normalmente mediante una base de datos de SQL Server para almacenar nombres de usuario, contraseñas y datos de perfil. Como alternativa, se puede usar otro almacén persistente, por ejemplo, Azure table Storage.
En este tema, obtendrás información sobre cómo usar para registrar un usuario e iniciar o cerrar su sesión. Nota: las plantillas tratan el nombre de usuario y el correo electrónico como los mismos para los usuarios. Para obtener instrucciones más detalladas sobre cómo crear aplicaciones que usan , consulte Pasos siguientes.
Para obtener más información sobre Identity en aplicaciones Blazor, consulte ASP.NET Core Blazor Autenticación y Autorización y los artículos siguientes en la documentación de Blazor.
ASP.NET Core Identity no está relacionado con la plataforma de identidad de Microsoft. La plataforma de identidad de Microsoft es:
- Evolución de la plataforma para desarrolladores de Azure Active Directory (Azure AD).
- Una solución de identidad alternativa para la autenticación y autorización en ASP.NET Core aplicaciones.
ASP.NET Core Identity agrega la funcionalidad de inicio de sesión de la interfaz de usuario (UI) a ASP.NET Core Web Apps. Para proteger las API web y las SPA, usa una de las siguientes opciones:
- Microsoft Entra ID
- Servidor Duende
Duende Identity Server es un framework OpenID Connect y OAuth 2.0 para ASP.NET Core. Duende Server permite las siguientes características de seguridad:
- Autenticación como servicio (AaaS)
- Inicio de sesión único (SSO) mediante varios tipos de aplicaciones
- Control de acceso para APIs
- Puerta de enlace de federación
Important
Duende Software puede requerir que pague una tarifa de licencia para el uso de producción de Duende Server. Para obtener más información, vea Migrate de ASP.NET Core en .NET 5 a .NET 6.
Para obtener más información, consulte la documentación de Duende Server (sitio web de Duende Software).
Vea o descargue el código de ejemplo (instrucciones para descargar).
Creación de una con autenticación
Cree un ASP.NET Core Blazor Web App project con cuentas individuales.
Note
Para obtener una experiencia de Pages, vea la sección Crear una aplicación Pages con autenticación.
Para obtener una experiencia de MVC, consulte la sección Creación de una aplicación MVC con autenticación .
- Seleccione la plantilla. Seleccione Siguiente.
- Realice las siguientes selecciones:
- Tipo de autenticación: Cuentas individuales
- Modo de representación interactiva: Servidor
- Ubicación de interactividad: Global
- Selecciona Crear.
El proyecto generado incluye IdentityRazor componentes. Los componentes se encuentran en la carpeta Components/Account del servidor project. Por ejemplo:
Components/Account/Pages/Register.razorComponents/Account/Pages/Login.razorComponents/Account/Pages/Manage/ChangePassword.razor
Los componentes se describen individualmente en la documentación de casos de uso específicos y están sujetos a cambios en cada versión. Al generar un Blazor Web App con cuentas individuales, los componentes IdentityRazor se incluyen en el proyecto generado. Los componentes IdentityRazor también se pueden inspeccionar en la carpeta Components/Account del proyecto del servidor en la plantilla de proyecto Blazor Web App (en el repositorio de GitHub dotnet/aspnetcore).
Note
Los vínculos de documentación sobre el origen de referencia de .NET suelen cargar la rama por defecto del repositorio, que muestra el desarrollo actual hacia la próxima versión de .NET. Para seleccionar una etiqueta para una versión específica, use la lista desplegable Cambiar ramas o etiquetas . Para obtener más información, vea Cómo seleccionar una etiqueta de versión de ASP.NET Core código fuente (dotnet/AspNetCore.Docs #26205).
Para obtener más información, vea ASP.NET Core Blazor autenticación y autorización y los artículos siguientes en la documentación de Blazor. La mayoría de los artículos de la Security y Identity área de la documentación principal de ASP.NET Core se aplican a las aplicaciones de Blazor. Sin embargo, el conjunto de documentación contiene artículos e instrucciones que reemplazan o agregan información. Se recomienda estudiar primero la documentación general ASP.NET Core establecida, seguida de acceder a los artículos de la documentación BlazorSecurity y Identity.
Crea una aplicación Pages con autenticación
Cree un proyecto de aplicación web de ASP.NET Core (Razor Pages) con cuentas individuales.
- Seleccione la plantilla ASP.NET Core Web App (Razor Pages). Seleccione Siguiente.
- En Tipo de autenticación, seleccione Cuentas individuales.
- Selecciona Crear.
El proyecto generado proporciona ASP.NET Core Identity como Razor biblioteca de clases (RCL). La biblioteca de clases expone puntos de conexión con el área . Por ejemplo:
Areas/Identity/Pages/Account/RegisterAreas/Identity/Pages/Account/LoginAreas/Identity/Pages/Account/Manage/ChangePassword
Las páginas se describen individualmente en la documentación de casos de uso específicos y están sujetas a cambios en cada versión. Para ver todas las páginas de la RCL, consulte el ASP.NET Core origen de referencia (dotnet/aspnetcore GitHub repositorio, Identity/UI/src/Areas/Identity/Pages carpeta). Puede estructurar páginas individuales o todas las páginas dentro de la aplicación. Para obtener más información, vea Scaffold Identity en proyectos de ASP.NET Core.
Creación de una aplicación MVC con autenticación
Cree un ASP.NET Core MVC project con cuentas individuales.
- Seleccione la plantilla ASP.NET Core Web App (Model-View-Controller). Seleccione Siguiente.
- En Tipo de autenticación, seleccione Cuentas individuales.
- Selecciona Crear.
El proyecto generado proporciona ASP.NET Core Identity, como Razor biblioteca de clases (RCL). La biblioteca de clases se basa en Pages y expone puntos de conexión con el área . Por ejemplo:
Areas/Identity/Pages/Account/RegisterAreas/Identity/Pages/Account/LoginAreas/Identity/Pages/Account/Manage/ChangePassword
Las páginas se describen individualmente en la documentación de casos de uso específicos y están sujetas a cambios en cada versión. Para ver todas las páginas de la RCL, consulte el ASP.NET Core origen de referencia (dotnet/aspnetcore GitHub repositorio, Identity/UI/src/Areas/Identity/Pages carpeta). Puede estructurar páginas individuales o todas las páginas dentro de la aplicación. Para obtener más información, vea Scaffold Identity en proyectos de ASP.NET Core.
Aplicar migraciones
Aplica las migraciones para inicializar la base de datos.
Ejecute el siguiente comando en la consola de Administrador de paquetes (PMC):
Update-Database
Prueba del registro e inicio de sesión
Ejecuta la aplicación y registra un usuario. Según el tamaño de la pantalla, es posible que tenga que seleccionar el botón de alternancia de navegación para ver los vínculos Registrar e Iniciar sesión .
Ver la base de datos
- En el menú View, seleccione SQL Server Explorador de objetos (SSOX).
- Vaya a (localdb)MSSQLLocalDB(SQL Server 13). Haga clic con el botón derecho en dbo.AspNetUsersVer datos:
menú 
Configuración de servicios de
Los servicios se agregan en . El patrón típico es llamar a métodos en el orden siguiente:
Add{Service}builder.Services.Configure{Service}
using Microsoft.AspNetCore.Identity;
using Microsoft.EntityFrameworkCore;
using WebApp1.Data;
var builder = WebApplication.CreateBuilder(args);
var connectionString = builder.Configuration.GetConnectionString("DefaultConnection");
builder.Services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(connectionString));
builder.Services.AddDatabaseDeveloperPageExceptionFilter();
builder.Services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
.AddEntityFrameworkStores<ApplicationDbContext>();
builder.Services.AddRazorPages();
builder.Services.Configure<IdentityOptions>(options =>
{
// Password settings.
options.Password.RequireDigit = true;
options.Password.RequireLowercase = true;
options.Password.RequireNonAlphanumeric = true;
options.Password.RequireUppercase = true;
options.Password.RequiredLength = 6;
options.Password.RequiredUniqueChars = 1;
// Lockout settings.
options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(5);
options.Lockout.MaxFailedAccessAttempts = 5;
options.Lockout.AllowedForNewUsers = true;
// User settings.
options.User.AllowedUserNameCharacters =
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._@+";
options.User.RequireUniqueEmail = false;
});
builder.Services.ConfigureApplicationCookie(options =>
{
// Cookie settings
options.Cookie.HttpOnly = true;
options.ExpireTimeSpan = TimeSpan.FromMinutes(5);
options.LoginPath = "/Identity/Account/Login";
options.AccessDeniedPath = "/Identity/Account/AccessDenied";
options.SlidingExpiration = true;
});
var app = builder.Build();
if (app.Environment.IsDevelopment())
{
app.UseMigrationsEndPoint();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.MapRazorPages();
app.Run();
El código anterior configura con los valores predeterminados de las opciones. Los servicios están disponibles para la aplicación a través de la inserción de dependencias.
se habilita llamando a . agrega middleware de autenticación a la canalización de solicitudes.
La aplicación generada por plantillas no usa la autorización. se incluye para asegurar que se agrega en el orden correcto en caso de que la aplicación agregue la autorización. Se debe llamar a , y en el orden mostrado en el código anterior.
Para obtener más información sobre , vea y Inicio de la aplicación.
métricas de ASP.NET Core Identity
ASP.NET Core Identity métricas proporcionan funcionalidades de supervisión para los procesos de autenticación y administración de usuarios. Estas métricas le ayudan a detectar patrones de inicio de sesión inusuales que podrían indicar amenazas de seguridad, realizar un seguimiento del rendimiento de las operaciones de identidad y comprender cómo interactúan los usuarios con las características de autenticación, como la autenticación en dos fases. Esta observabilidad es especialmente valiosa para las aplicaciones con estrictos requisitos de seguridad o aquellos que experimentan un tráfico de autenticación elevado.
Para obtener información detallada sobre las métricas disponibles y cómo usarlas, consulte ASP.NET Core métricas.
Scaffold Register, Login, LogOut y RegisterConfirmation
Agrega los archivos , , y . Siga las instrucciones de la identidad Scaffold en un proyecto con las instrucciones de autorización para generar el código que se muestra en esta sección.
Examen del registro
Cuando un usuario hace clic en el botón Registrar de la página, se invoca la acción. El usuario es creado por en el objeto :
public async Task<IActionResult> OnPostAsync(string returnUrl = null)
{
returnUrl = returnUrl ?? Url.Content("~/");
ExternalLogins = (await _signInManager.GetExternalAuthenticationSchemesAsync())
.ToList();
if (ModelState.IsValid)
{
var user = new IdentityUser { UserName = Input.Email, Email = Input.Email };
var result = await _userManager.CreateAsync(user, Input.Password);
if (result.Succeeded)
{
_logger.LogInformation("User created a new account with password.");
var code = await _userManager.GenerateEmailConfirmationTokenAsync(user);
code = WebEncoders.Base64UrlEncode(Encoding.UTF8.GetBytes(code));
var callbackUrl = Url.Page(
"/Account/ConfirmEmail",
pageHandler: null,
values: new { area = "Identity", userId = user.Id, code = code },
protocol: Request.Scheme);
await _emailSender.SendEmailAsync(Input.Email, "Confirm your email",
$"Please confirm your account by <a href='{HtmlEncoder.Default.Encode(callbackUrl)}'>clicking here</a>.");
if (_userManager.Options.SignIn.RequireConfirmedAccount)
{
return RedirectToPage("RegisterConfirmation",
new { email = Input.Email });
}
else
{
await _signInManager.SignInAsync(user, isPersistent: false);
return LocalRedirect(returnUrl);
}
}
foreach (var error in result.Errors)
{
ModelState.AddModelError(string.Empty, error.Description);
}
}
// If we got this far, something failed, redisplay form
return Page();
}
Deshabilitar la verificación de la cuenta predeterminada
Con las plantillas predeterminadas, se redirige al usuario al donde puede seleccionar un vínculo para que se confirme la cuenta. El valor predeterminado solo se usa para las pruebas, la comprobación automática de la cuenta debe deshabilitarse en una aplicación de producción.
Para requerir una cuenta confirmada e impedir el inicio de sesión inmediato en el registro, establezca en :
[AllowAnonymous]
public class RegisterConfirmationModel : PageModel
{
private readonly UserManager<IdentityUser> _userManager;
private readonly IEmailSender _sender;
public RegisterConfirmationModel(UserManager<IdentityUser> userManager, IEmailSender sender)
{
_userManager = userManager;
_sender = sender;
}
public string Email { get; set; }
public bool DisplayConfirmAccountLink { get; set; }
public string EmailConfirmationUrl { get; set; }
public async Task<IActionResult> OnGetAsync(string email, string returnUrl = null)
{
if (email == null)
{
return RedirectToPage("/Index");
}
var user = await _userManager.FindByEmailAsync(email);
if (user == null)
{
return NotFound($"Unable to load user with email '{email}'.");
}
Email = email;
// Once you add a real email sender, you should remove this code that lets you confirm the account
DisplayConfirmAccountLink = false;
if (DisplayConfirmAccountLink)
{
var userId = await _userManager.GetUserIdAsync(user);
var code = await _userManager.GenerateEmailConfirmationTokenAsync(user);
code = WebEncoders.Base64UrlEncode(Encoding.UTF8.GetBytes(code));
EmailConfirmationUrl = Url.Page(
"/Account/ConfirmEmail",
pageHandler: null,
values: new { area = "Identity", userId = userId, code = code, returnUrl = returnUrl },
protocol: Request.Scheme);
}
return Page();
}
}
Iniciar sesión
El formulario de inicio de sesión aparece cuando:
- El vínculo Iniciar sesión está seleccionado.
- Un usuario intenta acceder a una página restringida a la que no está autorizado a acceder o cuando el sistema no lo haya autenticado.
Cuando se envía el formulario en la página Inicio de sesión, se llama a la acción . Se llama a en el objeto .
public async Task<IActionResult> OnPostAsync(string returnUrl = null)
{
returnUrl = returnUrl ?? Url.Content("~/");
if (ModelState.IsValid)
{
// This doesn't count login failures towards account lockout
// To enable password failures to trigger account lockout,
// set lockoutOnFailure: true
var result = await _signInManager.PasswordSignInAsync(Input.Email,
Input.Password, Input.RememberMe, lockoutOnFailure: true);
if (result.Succeeded)
{
_logger.LogInformation("User logged in.");
return LocalRedirect(returnUrl);
}
if (result.RequiresTwoFactor)
{
return RedirectToPage("./LoginWith2fa", new
{
ReturnUrl = returnUrl,
RememberMe = Input.RememberMe
});
}
if (result.IsLockedOut)
{
_logger.LogWarning("User account locked out.");
return RedirectToPage("./Lockout");
}
else
{
ModelState.AddModelError(string.Empty, "Invalid login attempt.");
return Page();
}
}
// If we got this far, something failed, redisplay form
return Page();
}
Para obtener información sobre cómo tomar decisiones de autorización, consulte Introducción a la autorización en ASP.NET Core.
Cerrar sesión
El vínculo Cerrar sesión invoca la acción.
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.Extensions.Logging;
using System.Threading.Tasks;
namespace WebApp1.Areas.Identity.Pages.Account
{
[AllowAnonymous]
public class LogoutModel : PageModel
{
private readonly SignInManager<IdentityUser> _signInManager;
private readonly ILogger<LogoutModel> _logger;
public LogoutModel(SignInManager<IdentityUser> signInManager, ILogger<LogoutModel> logger)
{
_signInManager = signInManager;
_logger = logger;
}
public void OnGet()
{
}
public async Task<IActionResult> OnPost(string returnUrl = null)
{
await _signInManager.SignOutAsync();
_logger.LogInformation("User logged out.");
if (returnUrl != null)
{
return LocalRedirect(returnUrl);
}
else
{
return RedirectToPage();
}
}
}
}
En el código anterior, el código debe ser una redirección para que el explorador realice una nueva solicitud y la identidad del usuario se actualice.
borra las notificaciones del usuario almacenadas en .
La publicación se especifica en :
@using Microsoft.AspNetCore.Identity
@inject SignInManager<IdentityUser> SignInManager
@inject UserManager<IdentityUser> UserManager
<ul class="navbar-nav">
@if (SignInManager.IsSignedIn(User))
{
<li class="nav-item">
<a class="nav-link text-dark" asp-area="Identity" asp-page="/Account/Manage/Index"
title="Manage">Hello @User.Identity.Name!</a>
</li>
<li class="nav-item">
<form class="form-inline" asp-area="Identity" asp-page="/Account/Logout"
asp-route-returnUrl="@Url.Page("/", new { area = "" })"
method="post" >
<button type="submit" class="nav-link btn btn-link text-dark">Logout</button>
</form>
</li>
}
else
{
<li class="nav-item">
<a class="nav-link text-dark" asp-area="Identity" asp-page="/Account/Register">Register</a>
</li>
<li class="nav-item">
<a class="nav-link text-dark" asp-area="Identity" asp-page="/Account/Login">Login</a>
</li>
}
</ul>
Probar
Las plantillas de proyectos web predeterminadas permiten acceso anónimo a las páginas de inicio. Para probar , agregue :
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.Extensions.Logging;
namespace WebApp1.Pages
{
[Authorize]
public class PrivacyModel : PageModel
{
private readonly ILogger<PrivacyModel> _logger;
public PrivacyModel(ILogger<PrivacyModel> logger)
{
_logger = logger;
}
public void OnGet()
{
}
}
}
Si ha iniciado sesión, cierre la sesión. Ejecute la aplicación y seleccione el vínculo . Se le redirige a la página de inicio de sesión.
Explorar
Para explorar con más detalle:
- Creación de un origen completo de la interfaz de usuario de identidad
- Examine el código fuente de cada página y pase paso a paso por el depurador.
Componentes
Todos los paquetes NuGet dependientes de Identity se incluyen en el marco compartido ASP.NET Core.
El paquete principal de es Microsoft.AspNetCore.. Este paquete contiene el conjunto básico de interfaces para ASP.NET Core Identity y se incluye en Microsoft.AspNetCore.Identity.EntityFrameworkCore.
Migración a ASP.NET Core Identity
Para obtener más información e instrucciones sobre cómo migrar el almacén existente , consulte Migración de la autenticación y .
Establecimiento de la seguridad de la contraseña
Consulte Configuración para obtener un ejemplo que establezca los requisitos mínimos de contraseña.
AddDefaultIdentity y AddIdentity
AddDefaultIdentity se introdujo en ASP.NET Core 2.1. Llamar a es similar a llamar a lo siguiente:
Consulte AddDefaultIdentity source para obtener más información.
Impedir la publicación de recursos estáticos
Para evitar la publicación de recursos estáticos Identity (hojas de estilo y archivos JavaScript para Identity UI) en la raíz del servidor web, agregue la siguiente propiedad ResolveStaticWebAssetsInputsDependsOn y destino RemoveIdentityAssets al archivo de proyecto de la aplicación:
<PropertyGroup>
<ResolveStaticWebAssetsInputsDependsOn>RemoveIdentityAssets</ResolveStaticWebAssetsInputsDependsOn>
</PropertyGroup>
<Target Name="RemoveIdentityAssets">
<ItemGroup>
<StaticWebAsset Remove="@(StaticWebAsset)" Condition="%(SourceId) == 'Microsoft.AspNetCore.Identity.UI'" />
</ItemGroup>
</Target>
Pasos siguientes
- ASP.NET Core Blazor autenticación y autorización
- ASP.NET Core Identity código fuente
- Cómo trabajar con roles en ASP.NET Core Identity
- Para obtener información sobre cómo configurar Identity mediante SQLite, vea Cómo configurar Identity para SQLite (
dotnet/AspNetCore.Docs#5131). - Configurar
- Crear una aplicación de ASP.NET Core con datos de usuario protegidos por autorización
- Agregar, descargar y eliminar datos de usuario para Identity en un ASP.NET Core project
- Habilitar la generación de códigos QR para aplicaciones de autenticación TOTP en ASP.NET Core
- Migrar autenticación y Identity a ASP.NET Core
- Confirmación de cuenta y recuperación de contraseña en ASP.NET Core
- Autenticación multifactor en ASP.NET Core
- Host ASP.NET Core en una granja de servidores web
Por Rick Anderson
ASP.NET Core Identity:
- Es una API que admite la funcionalidad de inicio de sesión de la interfaz de usuario (UI).
- Administra usuarios, contraseñas, datos de perfil, roles, notificaciones, tokens, confirmación por correo electrónico, etc.
Los usuarios pueden crear una cuenta con la información de inicio de sesión almacenada en o pueden usar un proveedor de inicio de sesión externo. Los proveedores de inicios de sesión externos admitidos incluyen Facebook, Google, Cuenta microsoft y Twitter.
Para obtener información sobre cómo requerir autenticación para todos los usuarios de la aplicación, consulte Crear una aplicación de ASP.NET Core con datos de usuario protegidos por autorización.
El código fuente Identity está disponible en GitHub. Andamio y ver los archivos generados para revisar la interacción de la plantilla con .
Identity se configura normalmente mediante una base de datos de SQL Server para almacenar nombres de usuario, contraseñas y datos de perfil. Como alternativa, se puede usar otro almacén persistente, por ejemplo, Azure table Storage.
En este tema, obtendrás información sobre cómo usar para registrar un usuario e iniciar o cerrar su sesión. Nota: las plantillas tratan el nombre de usuario y el correo electrónico como los mismos para los usuarios. Para obtener instrucciones más detalladas sobre cómo crear aplicaciones que usan , consulte Pasos siguientes.
ASP.NET Core Identity no está relacionado con la plataforma de identidad de Microsoft. La plataforma de identidad de Microsoft es:
- Evolución de la plataforma para desarrolladores de Azure Active Directory (Azure AD).
- Una solución de identidad alternativa para la autenticación y autorización en ASP.NET Core aplicaciones.
ASP.NET Core Identity agrega la funcionalidad de inicio de sesión de la interfaz de usuario (UI) a ASP.NET Core Web Apps. Para proteger las API web y las SPA, usa una de las siguientes opciones:
- Microsoft Entra ID
- Servidor Duende
Duende Identity Server es un framework OpenID Connect y OAuth 2.0 para ASP.NET Core. Duende Server permite las siguientes características de seguridad:
- Autenticación como servicio (AaaS)
- Inicio de sesión único (SSO) mediante varios tipos de aplicaciones
- Control de acceso para APIs
- Puerta de enlace de federación
Important
Duende Software puede requerir que pague una tarifa de licencia para el uso de producción de Duende Server. Para obtener más información, vea Migrate de ASP.NET Core en .NET 5 a .NET 6.
Para obtener más información, consulte la documentación de Duende Server (sitio web de Duende Software).
Vea o descargue el código de ejemplo (instrucciones para descargar).
Creación de una aplicación web con autenticación
Cree una aplicación web ASP.NET Core project con cuentas de usuario individuales.
- Seleccione la plantilla ASP.NET Core Web App. Asigne el nombre WebApp1 al proyecto para que tenga el mismo espacio de nombres que el proyecto descargado. Haz clic en Aceptar.
- En la entrada Tipo de autenticación , seleccione Cuentas de usuario individuales.
El proyecto generado proporciona ASP.NET Core Identity como Razor biblioteca de clases. La biblioteca de clases expone puntos de conexión con el área . Por ejemplo:
- //Account/Login
- //Account/Logout
- //Cuenta/Administrar
Aplicar migraciones
Aplica las migraciones para inicializar la base de datos.
Ejecute el siguiente comando en la consola de Administrador de paquetes (PMC):
Update-Database
Prueba del registro e inicio de sesión
Ejecuta la aplicación y registra un usuario. Según el tamaño de la pantalla, es posible que tenga que seleccionar el botón de alternancia de navegación para ver los vínculos Registrar e Iniciar sesión .
Ver la base de datos
- En el menú View, seleccione SQL Server Explorador de objetos (SSOX).
- Vaya a (localdb)MSSQLLocalDB(SQL Server 13). Haga clic con el botón derecho en dbo.AspNetUsersVer datos:
menú 
Configuración de servicios de
Los servicios se agregan en . El patrón típico es llamar a métodos en el orden siguiente:
Add{Service}builder.Services.Configure{Service}
using Microsoft.AspNetCore.Identity;
using Microsoft.EntityFrameworkCore;
using WebApp1.Data;
var builder = WebApplication.CreateBuilder(args);
var connectionString = builder.Configuration.GetConnectionString("DefaultConnection");
builder.Services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(connectionString));
builder.Services.AddDatabaseDeveloperPageExceptionFilter();
builder.Services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
.AddEntityFrameworkStores<ApplicationDbContext>();
builder.Services.AddRazorPages();
builder.Services.Configure<IdentityOptions>(options =>
{
// Password settings.
options.Password.RequireDigit = true;
options.Password.RequireLowercase = true;
options.Password.RequireNonAlphanumeric = true;
options.Password.RequireUppercase = true;
options.Password.RequiredLength = 6;
options.Password.RequiredUniqueChars = 1;
// Lockout settings.
options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(5);
options.Lockout.MaxFailedAccessAttempts = 5;
options.Lockout.AllowedForNewUsers = true;
// User settings.
options.User.AllowedUserNameCharacters =
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._@+";
options.User.RequireUniqueEmail = false;
});
builder.Services.ConfigureApplicationCookie(options =>
{
// Cookie settings
options.Cookie.HttpOnly = true;
options.ExpireTimeSpan = TimeSpan.FromMinutes(5);
options.LoginPath = "/Identity/Account/Login";
options.AccessDeniedPath = "/Identity/Account/AccessDenied";
options.SlidingExpiration = true;
});
var app = builder.Build();
if (app.Environment.IsDevelopment())
{
app.UseMigrationsEndPoint();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.MapRazorPages();
app.Run();
El código anterior configura con los valores predeterminados de las opciones. Los servicios están disponibles para la aplicación a través de la inserción de dependencias.
se habilita llamando a . agrega middleware de autenticación a la canalización de solicitudes.
La aplicación generada por plantillas no usa la autorización. se incluye para asegurar que se agrega en el orden correcto en caso de que la aplicación agregue la autorización. Se debe llamar a , y en el orden mostrado en el código anterior.
Para obtener más información sobre , vea y Inicio de la aplicación.
Scaffold Register, Login, LogOut y RegisterConfirmation
Agrega los archivos , , y . Siga las instrucciones de la identidad Scaffold en un proyecto con las instrucciones de autorización para generar el código que se muestra en esta sección.
Examen del registro
Cuando un usuario hace clic en el botón Registrar de la página, se invoca la acción. El usuario es creado por en el objeto :
public async Task<IActionResult> OnPostAsync(string returnUrl = null)
{
returnUrl = returnUrl ?? Url.Content("~/");
ExternalLogins = (await _signInManager.GetExternalAuthenticationSchemesAsync())
.ToList();
if (ModelState.IsValid)
{
var user = new IdentityUser { UserName = Input.Email, Email = Input.Email };
var result = await _userManager.CreateAsync(user, Input.Password);
if (result.Succeeded)
{
_logger.LogInformation("User created a new account with password.");
var code = await _userManager.GenerateEmailConfirmationTokenAsync(user);
code = WebEncoders.Base64UrlEncode(Encoding.UTF8.GetBytes(code));
var callbackUrl = Url.Page(
"/Account/ConfirmEmail",
pageHandler: null,
values: new { area = "Identity", userId = user.Id, code = code },
protocol: Request.Scheme);
await _emailSender.SendEmailAsync(Input.Email, "Confirm your email",
$"Please confirm your account by <a href='{HtmlEncoder.Default.Encode(callbackUrl)}'>clicking here</a>.");
if (_userManager.Options.SignIn.RequireConfirmedAccount)
{
return RedirectToPage("RegisterConfirmation",
new { email = Input.Email });
}
else
{
await _signInManager.SignInAsync(user, isPersistent: false);
return LocalRedirect(returnUrl);
}
}
foreach (var error in result.Errors)
{
ModelState.AddModelError(string.Empty, error.Description);
}
}
// If we got this far, something failed, redisplay form
return Page();
}
Deshabilitar la verificación de la cuenta predeterminada
Con las plantillas predeterminadas, se redirige al usuario al donde puede seleccionar un vínculo para que se confirme la cuenta. El valor predeterminado solo se usa para las pruebas, la comprobación automática de la cuenta debe deshabilitarse en una aplicación de producción.
Para requerir una cuenta confirmada e impedir el inicio de sesión inmediato en el registro, establezca en :
[AllowAnonymous]
public class RegisterConfirmationModel : PageModel
{
private readonly UserManager<IdentityUser> _userManager;
private readonly IEmailSender _sender;
public RegisterConfirmationModel(UserManager<IdentityUser> userManager, IEmailSender sender)
{
_userManager = userManager;
_sender = sender;
}
public string Email { get; set; }
public bool DisplayConfirmAccountLink { get; set; }
public string EmailConfirmationUrl { get; set; }
public async Task<IActionResult> OnGetAsync(string email, string returnUrl = null)
{
if (email == null)
{
return RedirectToPage("/Index");
}
var user = await _userManager.FindByEmailAsync(email);
if (user == null)
{
return NotFound($"Unable to load user with email '{email}'.");
}
Email = email;
// Once you add a real email sender, you should remove this code that lets you confirm the account
DisplayConfirmAccountLink = false;
if (DisplayConfirmAccountLink)
{
var userId = await _userManager.GetUserIdAsync(user);
var code = await _userManager.GenerateEmailConfirmationTokenAsync(user);
code = WebEncoders.Base64UrlEncode(Encoding.UTF8.GetBytes(code));
EmailConfirmationUrl = Url.Page(
"/Account/ConfirmEmail",
pageHandler: null,
values: new { area = "Identity", userId = userId, code = code, returnUrl = returnUrl },
protocol: Request.Scheme);
}
return Page();
}
}
Iniciar sesión
El formulario de inicio de sesión aparece cuando:
- El vínculo Iniciar sesión está seleccionado.
- Un usuario intenta acceder a una página restringida a la que no está autorizado a acceder o cuando el sistema no lo haya autenticado.
Cuando se envía el formulario en la página Inicio de sesión, se llama a la acción . Se llama a en el objeto .
public async Task<IActionResult> OnPostAsync(string returnUrl = null)
{
returnUrl = returnUrl ?? Url.Content("~/");
if (ModelState.IsValid)
{
// This doesn't count login failures towards account lockout
// To enable password failures to trigger account lockout,
// set lockoutOnFailure: true
var result = await _signInManager.PasswordSignInAsync(Input.Email,
Input.Password, Input.RememberMe, lockoutOnFailure: true);
if (result.Succeeded)
{
_logger.LogInformation("User logged in.");
return LocalRedirect(returnUrl);
}
if (result.RequiresTwoFactor)
{
return RedirectToPage("./LoginWith2fa", new
{
ReturnUrl = returnUrl,
RememberMe = Input.RememberMe
});
}
if (result.IsLockedOut)
{
_logger.LogWarning("User account locked out.");
return RedirectToPage("./Lockout");
}
else
{
ModelState.AddModelError(string.Empty, "Invalid login attempt.");
return Page();
}
}
// If we got this far, something failed, redisplay form
return Page();
}
Para obtener información sobre cómo tomar decisiones de autorización, consulte Introducción a la autorización en ASP.NET Core.
Cerrar sesión
El vínculo Cerrar sesión invoca la acción.
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.Extensions.Logging;
using System.Threading.Tasks;
namespace WebApp1.Areas.Identity.Pages.Account
{
[AllowAnonymous]
public class LogoutModel : PageModel
{
private readonly SignInManager<IdentityUser> _signInManager;
private readonly ILogger<LogoutModel> _logger;
public LogoutModel(SignInManager<IdentityUser> signInManager, ILogger<LogoutModel> logger)
{
_signInManager = signInManager;
_logger = logger;
}
public void OnGet()
{
}
public async Task<IActionResult> OnPost(string returnUrl = null)
{
await _signInManager.SignOutAsync();
_logger.LogInformation("User logged out.");
if (returnUrl != null)
{
return LocalRedirect(returnUrl);
}
else
{
return RedirectToPage();
}
}
}
}
En el código anterior, el código debe ser una redirección para que el explorador realice una nueva solicitud y la identidad del usuario se actualice.
borra las notificaciones del usuario almacenadas en .
La publicación se especifica en :
@using Microsoft.AspNetCore.Identity
@inject SignInManager<IdentityUser> SignInManager
@inject UserManager<IdentityUser> UserManager
<ul class="navbar-nav">
@if (SignInManager.IsSignedIn(User))
{
<li class="nav-item">
<a class="nav-link text-dark" asp-area="Identity" asp-page="/Account/Manage/Index"
title="Manage">Hello @User.Identity.Name!</a>
</li>
<li class="nav-item">
<form class="form-inline" asp-area="Identity" asp-page="/Account/Logout"
asp-route-returnUrl="@Url.Page("/", new { area = "" })"
method="post" >
<button type="submit" class="nav-link btn btn-link text-dark">Logout</button>
</form>
</li>
}
else
{
<li class="nav-item">
<a class="nav-link text-dark" asp-area="Identity" asp-page="/Account/Register">Register</a>
</li>
<li class="nav-item">
<a class="nav-link text-dark" asp-area="Identity" asp-page="/Account/Login">Login</a>
</li>
}
</ul>
Probar
Las plantillas de proyectos web predeterminadas permiten acceso anónimo a las páginas de inicio. Para probar , agregue :
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.Extensions.Logging;
namespace WebApp1.Pages
{
[Authorize]
public class PrivacyModel : PageModel
{
private readonly ILogger<PrivacyModel> _logger;
public PrivacyModel(ILogger<PrivacyModel> logger)
{
_logger = logger;
}
public void OnGet()
{
}
}
}
Si ha iniciado sesión, cierre la sesión. Ejecute la aplicación y seleccione el vínculo . Se le redirige a la página de inicio de sesión.
Explorar
Para explorar con más detalle:
- Creación de un origen completo de la interfaz de usuario de identidad
- Examine el código fuente de cada página y pase paso a paso por el depurador.
Componentes
Todos los paquetes NuGet dependientes de Identity se incluyen en el marco compartido ASP.NET Core.
El paquete principal de es Microsoft.AspNetCore.. Este paquete contiene el conjunto básico de interfaces para ASP.NET Core Identity y se incluye en Microsoft.AspNetCore.Identity.EntityFrameworkCore.
Migración a ASP.NET Core Identity
Para obtener más información e instrucciones sobre cómo migrar el almacén existente , consulte Migración de la autenticación y .
Establecimiento de la seguridad de la contraseña
Consulte Configuración para obtener un ejemplo que establezca los requisitos mínimos de contraseña.
AddDefaultIdentity y AddIdentity
AddDefaultIdentity se introdujo en ASP.NET Core 2.1. Llamar a es similar a llamar a lo siguiente:
Consulte AddDefaultIdentity source para obtener más información.
Impedir la publicación de recursos estáticos
Para evitar la publicación de recursos estáticos Identity (hojas de estilo y archivos JavaScript para Identity UI) en la raíz del servidor web, agregue la siguiente propiedad ResolveStaticWebAssetsInputsDependsOn y destino RemoveIdentityAssets al archivo de proyecto de la aplicación:
<PropertyGroup>
<ResolveStaticWebAssetsInputsDependsOn>RemoveIdentityAssets</ResolveStaticWebAssetsInputsDependsOn>
</PropertyGroup>
<Target Name="RemoveIdentityAssets">
<ItemGroup>
<StaticWebAsset Remove="@(StaticWebAsset)" Condition="%(SourceId) == 'Microsoft.AspNetCore.Identity.UI'" />
</ItemGroup>
</Target>
Pasos siguientes
- Consulte este problema GitHub para obtener información sobre cómo configurar Identity mediante SQLite.
- Configurar
- Crear una aplicación de ASP.NET Core con datos de usuario protegidos por autorización
- Agregar, descargar y eliminar datos de usuario para Identity en un ASP.NET Core project
- Habilitar la generación de códigos QR para aplicaciones de autenticación TOTP en ASP.NET Core
- Migrar autenticación y Identity a ASP.NET Core
- Confirmación de cuenta y recuperación de contraseña en ASP.NET Core
- Autenticación de dos factores con SMS en ASP.NET Core
- Host ASP.NET Core en una granja de servidores web
Por Rick Anderson
ASP.NET Core Identity:
- Es una API que admite la funcionalidad de inicio de sesión de la interfaz de usuario (UI).
- Administra usuarios, contraseñas, datos de perfil, roles, notificaciones, tokens, confirmación por correo electrónico, etc.
Los usuarios pueden crear una cuenta con la información de inicio de sesión almacenada en o pueden usar un proveedor de inicio de sesión externo. Los proveedores de inicios de sesión externos admitidos incluyen Facebook, Google, Cuenta microsoft y Twitter.
Para obtener información sobre cómo requerir autenticación para todos los usuarios de la aplicación, consulte Crear una aplicación de ASP.NET Core con datos de usuario protegidos por autorización.
El código fuente Identity está disponible en GitHub. Andamio y ver los archivos generados para revisar la interacción de la plantilla con .
Identity se configura normalmente mediante una base de datos de SQL Server para almacenar nombres de usuario, contraseñas y datos de perfil. Como alternativa, se puede usar otro almacén persistente, por ejemplo, Azure table Storage.
En este tema, obtendrás información sobre cómo usar para registrar un usuario e iniciar o cerrar su sesión. Nota: las plantillas tratan el nombre de usuario y el correo electrónico como los mismos para los usuarios. Para obtener instrucciones más detalladas sobre cómo crear aplicaciones que usan , consulte Pasos siguientes.
Plataforma de identidad deMicrosoft es:
- Evolución de la plataforma para desarrolladores de Azure Active Directory (Azure AD).
- Una solución de identidad alternativa para la autenticación y autorización en ASP.NET Core aplicaciones.
- No está relacionado con ASP.NET Core Identity.
ASP.NET Core Identity agrega la funcionalidad de inicio de sesión de la interfaz de usuario (UI) a ASP.NET Core Web Apps. Para proteger las API web y las SPA, usa una de las siguientes opciones:
- Microsoft Entra ID
- Duende IdentityServer. Duende IdentityServer es un producto de terceros.
Duende IdentityServer es un marco openID Connect y OAuth 2.0 para ASP.NET Core. Duende IdentityServer habilita las siguientes características de seguridad:
- Autenticación como servicio (AaaS)
- Inicio de sesión único (SSO) mediante varios tipos de aplicaciones
- Control de acceso para APIs
- Puerta de enlace de federación
Para obtener más información, consulte Introducción a Duende IdentityServer.
Para obtener más información sobre otros proveedores de autenticación, consulte Opciones de autenticación de OSS de la comunidad para ASP.NET Core.
Vea o descargue el código de ejemplo (instrucciones para descargar).
Creación de una aplicación web con autenticación
Cree una aplicación web ASP.NET Core project con cuentas de usuario individuales.
- Seleccione File>New>Project.
- Seleccione ASP.NET Core Aplicación web. Asigne el nombre WebApp1 al proyecto para que tenga el mismo espacio de nombres que el proyecto descargado. Haz clic en Aceptar.
- Seleccione un ASP.NET Core Web Application y, a continuación, seleccione Change Authentication.
- Seleccione Cuentas de usuario individuales y haga clic en Aceptar.
El proyecto generado proporciona ASP.NET Core Identity como Razor biblioteca de clases. La biblioteca de clases expone puntos de conexión con el área . Por ejemplo:
- //Account/Login
- //Account/Logout
- //Cuenta/Administrar
Aplicar migraciones
Aplica las migraciones para inicializar la base de datos.
Ejecute el siguiente comando en la consola de Administrador de paquetes (PMC):
PM> Update-Database
Prueba del registro e inicio de sesión
Ejecuta la aplicación y registra un usuario. Según el tamaño de la pantalla, es posible que tenga que seleccionar el botón de alternancia de navegación para ver los vínculos Registrar e Iniciar sesión .
Ver la base de datos
- En el menú View, seleccione SQL Server Explorador de objetos (SSOX).
- Vaya a (localdb)MSSQLLocalDB(SQL Server 13). Haga clic con el botón derecho en dbo.AspNetUsersVer datos:
menú 
Configuración de servicios de
Los servicios se agregan en . El patrón habitual consiste en llamar a todos los métodos y, luego, a todos los métodos .
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<ApplicationDbContext>(options =>
// options.UseSqlite(
options.UseSqlServer(
Configuration.GetConnectionString("DefaultConnection")));
services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
.AddEntityFrameworkStores<ApplicationDbContext>();
services.AddRazorPages();
services.Configure<IdentityOptions>(options =>
{
// Password settings.
options.Password.RequireDigit = true;
options.Password.RequireLowercase = true;
options.Password.RequireNonAlphanumeric = true;
options.Password.RequireUppercase = true;
options.Password.RequiredLength = 6;
options.Password.RequiredUniqueChars = 1;
// Lockout settings.
options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(5);
options.Lockout.MaxFailedAccessAttempts = 5;
options.Lockout.AllowedForNewUsers = true;
// User settings.
options.User.AllowedUserNameCharacters =
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._@+";
options.User.RequireUniqueEmail = false;
});
services.ConfigureApplicationCookie(options =>
{
// Cookie settings
options.Cookie.HttpOnly = true;
options.ExpireTimeSpan = TimeSpan.FromMinutes(5);
options.LoginPath = "/Identity/Account/Login";
options.AccessDeniedPath = "/Identity/Account/AccessDenied";
options.SlidingExpiration = true;
});
}
El código resaltado anterior configura con los valores predeterminados de las opciones. Los servicios están disponibles para la aplicación a través de la inserción de dependencias.
se habilita llamando a . agrega middleware de autenticación a la canalización de solicitudes.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseDatabaseErrorPage();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
});
}
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<ApplicationDbContext>(options =>
// options.UseSqlite(
options.UseSqlServer(
Configuration.GetConnectionString("DefaultConnection")));
services.AddDatabaseDeveloperPageExceptionFilter();
services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
.AddEntityFrameworkStores<ApplicationDbContext>();
services.AddRazorPages();
services.Configure<IdentityOptions>(options =>
{
// Password settings.
options.Password.RequireDigit = true;
options.Password.RequireLowercase = true;
options.Password.RequireNonAlphanumeric = true;
options.Password.RequireUppercase = true;
options.Password.RequiredLength = 6;
options.Password.RequiredUniqueChars = 1;
// Lockout settings.
options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(5);
options.Lockout.MaxFailedAccessAttempts = 5;
options.Lockout.AllowedForNewUsers = true;
// User settings.
options.User.AllowedUserNameCharacters =
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._@+";
options.User.RequireUniqueEmail = false;
});
services.ConfigureApplicationCookie(options =>
{
// Cookie settings
options.Cookie.HttpOnly = true;
options.ExpireTimeSpan = TimeSpan.FromMinutes(5);
options.LoginPath = "/Identity/Account/Login";
options.AccessDeniedPath = "/Identity/Account/AccessDenied";
options.SlidingExpiration = true;
});
}
El código anterior configura con los valores predeterminados de las opciones. Los servicios están disponibles para la aplicación a través de la inserción de dependencias.
se habilita llamando a . agrega middleware de autenticación a la canalización de solicitudes.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseMigrationsEndPoint();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
});
}
La aplicación generada por plantillas no usa la autorización. se incluye para asegurar que se agrega en el orden correcto en caso de que la aplicación agregue la autorización. Se debe llamar a , , y en el orden mostrado en el código anterior.
Para obtener más información sobre y , vea y Inicio de la aplicación.
Scaffold Register, Login, LogOut y RegisterConfirmation
Agrega los archivos , , y . Siga las instrucciones de la identidad Scaffold en un proyecto con las instrucciones de autorización para generar el código que se muestra en esta sección.
Examen del registro
Cuando un usuario hace clic en el botón Registrar de la página, se invoca la acción. El usuario es creado por en el objeto :
public async Task<IActionResult> OnPostAsync(string returnUrl = null)
{
returnUrl = returnUrl ?? Url.Content("~/");
ExternalLogins = (await _signInManager.GetExternalAuthenticationSchemesAsync())
.ToList();
if (ModelState.IsValid)
{
var user = new IdentityUser { UserName = Input.Email, Email = Input.Email };
var result = await _userManager.CreateAsync(user, Input.Password);
if (result.Succeeded)
{
_logger.LogInformation("User created a new account with password.");
var code = await _userManager.GenerateEmailConfirmationTokenAsync(user);
code = WebEncoders.Base64UrlEncode(Encoding.UTF8.GetBytes(code));
var callbackUrl = Url.Page(
"/Account/ConfirmEmail",
pageHandler: null,
values: new { area = "Identity", userId = user.Id, code = code },
protocol: Request.Scheme);
await _emailSender.SendEmailAsync(Input.Email, "Confirm your email",
$"Please confirm your account by <a href='{HtmlEncoder.Default.Encode(callbackUrl)}'>clicking here</a>.");
if (_userManager.Options.SignIn.RequireConfirmedAccount)
{
return RedirectToPage("RegisterConfirmation",
new { email = Input.Email });
}
else
{
await _signInManager.SignInAsync(user, isPersistent: false);
return LocalRedirect(returnUrl);
}
}
foreach (var error in result.Errors)
{
ModelState.AddModelError(string.Empty, error.Description);
}
}
// If we got this far, something failed, redisplay form
return Page();
}
Deshabilitar la verificación de la cuenta predeterminada
Con las plantillas predeterminadas, se redirige al usuario al donde puede seleccionar un vínculo para que se confirme la cuenta. El valor predeterminado solo se usa para las pruebas, la comprobación automática de la cuenta debe deshabilitarse en una aplicación de producción.
Para requerir una cuenta confirmada e impedir el inicio de sesión inmediato en el registro, establezca en :
[AllowAnonymous]
public class RegisterConfirmationModel : PageModel
{
private readonly UserManager<IdentityUser> _userManager;
private readonly IEmailSender _sender;
public RegisterConfirmationModel(UserManager<IdentityUser> userManager, IEmailSender sender)
{
_userManager = userManager;
_sender = sender;
}
public string Email { get; set; }
public bool DisplayConfirmAccountLink { get; set; }
public string EmailConfirmationUrl { get; set; }
public async Task<IActionResult> OnGetAsync(string email, string returnUrl = null)
{
if (email == null)
{
return RedirectToPage("/Index");
}
var user = await _userManager.FindByEmailAsync(email);
if (user == null)
{
return NotFound($"Unable to load user with email '{email}'.");
}
Email = email;
// Once you add a real email sender, you should remove this code that lets you confirm the account
DisplayConfirmAccountLink = false;
if (DisplayConfirmAccountLink)
{
var userId = await _userManager.GetUserIdAsync(user);
var code = await _userManager.GenerateEmailConfirmationTokenAsync(user);
code = WebEncoders.Base64UrlEncode(Encoding.UTF8.GetBytes(code));
EmailConfirmationUrl = Url.Page(
"/Account/ConfirmEmail",
pageHandler: null,
values: new { area = "Identity", userId = userId, code = code, returnUrl = returnUrl },
protocol: Request.Scheme);
}
return Page();
}
}
Iniciar sesión
El formulario de inicio de sesión aparece cuando:
- El vínculo Iniciar sesión está seleccionado.
- Un usuario intenta acceder a una página restringida a la que no está autorizado a acceder o cuando el sistema no lo haya autenticado.
Cuando se envía el formulario en la página Inicio de sesión, se llama a la acción . Se llama a en el objeto .
public async Task<IActionResult> OnPostAsync(string returnUrl = null)
{
returnUrl = returnUrl ?? Url.Content("~/");
if (ModelState.IsValid)
{
// This doesn't count login failures towards account lockout
// To enable password failures to trigger account lockout,
// set lockoutOnFailure: true
var result = await _signInManager.PasswordSignInAsync(Input.Email,
Input.Password, Input.RememberMe, lockoutOnFailure: true);
if (result.Succeeded)
{
_logger.LogInformation("User logged in.");
return LocalRedirect(returnUrl);
}
if (result.RequiresTwoFactor)
{
return RedirectToPage("./LoginWith2fa", new
{
ReturnUrl = returnUrl,
RememberMe = Input.RememberMe
});
}
if (result.IsLockedOut)
{
_logger.LogWarning("User account locked out.");
return RedirectToPage("./Lockout");
}
else
{
ModelState.AddModelError(string.Empty, "Invalid login attempt.");
return Page();
}
}
// If we got this far, something failed, redisplay form
return Page();
}
Para obtener información sobre cómo tomar decisiones de autorización, consulte Introducción a la autorización en ASP.NET Core.
Cerrar sesión
El vínculo Cerrar sesión invoca la acción.
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.Extensions.Logging;
using System.Threading.Tasks;
namespace WebApp1.Areas.Identity.Pages.Account
{
[AllowAnonymous]
public class LogoutModel : PageModel
{
private readonly SignInManager<IdentityUser> _signInManager;
private readonly ILogger<LogoutModel> _logger;
public LogoutModel(SignInManager<IdentityUser> signInManager, ILogger<LogoutModel> logger)
{
_signInManager = signInManager;
_logger = logger;
}
public void OnGet()
{
}
public async Task<IActionResult> OnPost(string returnUrl = null)
{
await _signInManager.SignOutAsync();
_logger.LogInformation("User logged out.");
if (returnUrl != null)
{
return LocalRedirect(returnUrl);
}
else
{
return RedirectToPage();
}
}
}
}
En el código anterior, el código debe ser una redirección para que el explorador realice una nueva solicitud y la identidad del usuario se actualice.
borra las notificaciones del usuario almacenadas en .
La publicación se especifica en :
@using Microsoft.AspNetCore.Identity
@inject SignInManager<IdentityUser> SignInManager
@inject UserManager<IdentityUser> UserManager
<ul class="navbar-nav">
@if (SignInManager.IsSignedIn(User))
{
<li class="nav-item">
<a class="nav-link text-dark" asp-area="Identity" asp-page="/Account/Manage/Index"
title="Manage">Hello @User.Identity.Name!</a>
</li>
<li class="nav-item">
<form class="form-inline" asp-area="Identity" asp-page="/Account/Logout"
asp-route-returnUrl="@Url.Page("/", new { area = "" })"
method="post" >
<button type="submit" class="nav-link btn btn-link text-dark">Logout</button>
</form>
</li>
}
else
{
<li class="nav-item">
<a class="nav-link text-dark" asp-area="Identity" asp-page="/Account/Register">Register</a>
</li>
<li class="nav-item">
<a class="nav-link text-dark" asp-area="Identity" asp-page="/Account/Login">Login</a>
</li>
}
</ul>
Probar
Las plantillas de proyectos web predeterminadas permiten acceso anónimo a las páginas de inicio. Para probar , agregue :
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.Extensions.Logging;
namespace WebApp1.Pages
{
[Authorize]
public class PrivacyModel : PageModel
{
private readonly ILogger<PrivacyModel> _logger;
public PrivacyModel(ILogger<PrivacyModel> logger)
{
_logger = logger;
}
public void OnGet()
{
}
}
}
Si ha iniciado sesión, cierre la sesión. Ejecute la aplicación y seleccione el vínculo . Se le redirige a la página de inicio de sesión.
Explorar
Para explorar con más detalle:
- Creación de un origen completo de la interfaz de usuario de identidad
- Examine el código fuente de cada página y pase paso a paso por el depurador.
Componentes
Todos los paquetes NuGet dependientes de Identity se incluyen en el marco compartido ASP.NET Core.
El paquete principal de es Microsoft.AspNetCore.. Este paquete contiene el conjunto básico de interfaces para ASP.NET Core Identity y se incluye en Microsoft.AspNetCore.Identity.EntityFrameworkCore.
Migración a ASP.NET Core Identity
Para obtener más información e instrucciones sobre cómo migrar el almacén existente , consulte Migración de la autenticación y .
Establecimiento de la seguridad de la contraseña
Consulte Configuración para obtener un ejemplo que establezca los requisitos mínimos de contraseña.
Impedir la publicación de recursos estáticos
Para evitar la publicación de recursos estáticos Identity (hojas de estilo y archivos JavaScript para Identity UI) en la raíz del servidor web, agregue la siguiente propiedad ResolveStaticWebAssetsInputsDependsOn y destino RemoveIdentityAssets al archivo de proyecto de la aplicación:
<PropertyGroup>
<ResolveStaticWebAssetsInputsDependsOn>RemoveIdentityAssets</ResolveStaticWebAssetsInputsDependsOn>
</PropertyGroup>
<Target Name="RemoveIdentityAssets">
<ItemGroup>
<StaticWebAsset Remove="@(StaticWebAsset)" Condition="%(SourceId) == 'Microsoft.AspNetCore.Identity.UI'" />
</ItemGroup>
</Target>
Pasos siguientes
- ASP.NET Core Identity código fuente
- origen AddDefaultIdentity
- Consulte este problema GitHub para obtener información sobre cómo configurar Identity mediante SQLite.
- Configurar
- Crear una aplicación de ASP.NET Core con datos de usuario protegidos por autorización
- Agregar, descargar y eliminar datos de usuario para Identity en un ASP.NET Core project
- Habilitar la generación de códigos QR para aplicaciones de autenticación TOTP en ASP.NET Core
- Migrar autenticación y Identity a ASP.NET Core
- Confirmación de cuenta y recuperación de contraseña en ASP.NET Core
- Autenticación de dos factores con SMS en ASP.NET Core
- Host ASP.NET Core en una granja de servidores web