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.
Por Rick Anderson
Este artículo muestra cómo migrar una base de datos y completar una actualización del andamiaje de Identity.
Blazor Identity andamiaje
El generador de esqueletos de ASP.NET Core Identity añade ASP.NET Core Identity a Blazor Web Apps y aplicaciones Blazor Server. Una vez que el scaffolder agrega los IdentityRazor componentes a la aplicación, puede personalizar los componentes para adaptarlos a los requisitos de la aplicación.
Aunque el generador de esqueletos genera el código C# necesario para integrar Identity en la aplicación, debes actualizar la base de datos del proyecto mediante una migración de Entity Framework Core para completar el proceso. En este artículo se describen los pasos para migrar una base de datos.
Después de ejecutar el generador de esqueletos Identity, revisa los cambios. Use GitHub u otro sistema de control de código fuente que muestre los cambios de archivo con una característica de reversión.
Los servicios son necesarios cuando se usan Autenticación de dos factores (2FA), Confirmación de cuenta y recuperación de contraseña y otras características de seguridad con Identity. Los servicios o códigos auxiliares de servicio no se generan al aplicar scaffolding a Identity. Los servicios para habilitar estas características deben agregarse manualmente.
Generación de estructura de Razor Pages y MVC Identity
ASP.NET Core proporciona ASP.NET Core Identity como una Razor biblioteca de clases (RCL). Las aplicaciones que incluyen Identity pueden aplicar la herramienta de generación de estructura para añadir de forma selectiva el código fuente contenido en el Identity RCL. Puede que quiera generar código fuente que le permita modificar un código y cambiar el comportamiento; así, por ejemplo, podría indicar al proveedor de scaffolding que generara el código que se usa en el registro. El código personalizado Identity invalida la implementación predeterminada proporcionada por la RCL de Identity. Para obtener un control completo de la interfaz de usuario y no usar la RCL predeterminada, consulte la sección Crear el código fuente completo de la interfaz de usuario Identity.
Las aplicaciones que no incluyen autenticación pueden aplicar el proveedor de scaffolding para agregar el paquete de Identity de la RCL. Tiene la opción de seleccionar el código Identity que desea generar.
Aunque el proveedor de scaffolding genera la mayor parte del código necesario, debe actualizar el proyecto para completar el proceso. Este artículo muestra los pasos necesarios para completar una actualización de la estructura de Identity. Después de ejecutar el generador de esqueletos Identity, revisa los cambios. Use un sistema de control de código fuente que muestre las diferencias de archivos y le permita volver a salir de los cambios.
Los servicios son necesarios al usar 2FA, la confirmación de la cuenta y la recuperación de contraseñas, y otras características de seguridad con Identity. Los servicios o códigos auxiliares de servicio no se generan al aplicar scaffolding a Identity. Los servicios para habilitar estas características deben agregarse manualmente. Por ejemplo, consulte Configuración de un proveedor de correo electrónico para que la aplicación pueda requerir confirmación por correo electrónico.
Normalmente, las aplicaciones creadas con cuentas individuales no deben crear un nuevo contexto de datos.
Generar la estructura de Identity en un proyecto Blazor
Los procedimientos de generación de estructura descritos en esta sección se aplican a Blazor Web App y a aplicaciones Blazor Server.
Ejecute el proveedor de scaffolding Identity:
En Explorador de soluciones, haga clic con el botón derecho en el proyecto y seleccione Agregar>Nuevo elemento con scaffolding.
En el panel izquierdo del cuadro de diálogo Añadir nuevo elemento generado automáticamente, selecciona Identity.
En el panel central, seleccione Blazor Identityy, a continuación, seleccione Agregar.
En el cuadro de diálogo Agregar BlazorIdentity:
Seleccione el icono más (+) y agregue la clase de contexto de base de datos DbContext.
Seleccione el proveedor de base de datos (proveedor de base de datos), que tiene como valor predeterminado SQL Server.
Seleccione el icono de signo más (+) y añada la clase de usuario, User class.
Selecciona Agregar.
El código de base de datos generado Identity requiere Entity Framework Core Migrations. En los pasos siguientes se explica cómo crear y aplicar una migración a la base de datos.
Visual Studio Connected Services se usan para agregar una migración de Entity Framework Core y actualizar la base de datos.
En el Explorador de soluciones, haga doble clic en Servicios conectados.
En el área SQL Server Express LocalDB de Service Dependencies, seleccione Más acción (... ) >Add migration.
Asigne a la migración un Nombre de migración, como
CreateIdentitySchema, que es un nombre que describe la migración.Espera a que se cargue el contexto de la base de datos en el campo Nombres de clase de DBContext. La acción puede tardar unos segundos.
Seleccione Finalizar para completar la actualización. Una vez finalizada la operación, seleccione Cerrar.
Seleccione Más acciones (...) >Actualizar base de datos.
Se abre el cuadro de diálogo Actualizar la base de datos con la última migración.
Espera a que se actualice el campo Nombres de clase DBContext y a que se carguen las migraciones anteriores. La acción puede tardar unos segundos.
Seleccione Finalizar para completar la actualización. Una vez finalizada la operación, seleccione Cerrar.
El comando update database ejecuta las migraciones del método Up que no se aplican en un archivo de código de migración creado por el generador de esqueletos. En este caso, el comando ejecuta el Up método en el archivo Migrations/{TIME STAMP}_{MIGRATION NAME}.cs , que crea las Identity tablas, restricciones e índices. El marcador {TIME STAMP} es una marca de tiempo, y el marcador {MIGRATION NAME} es el nombre de la migración.
Aplicaciones del cliente Blazor (independientes Blazor WebAssembly)
Las aplicaciones Blazor del lado del cliente (autónomas Blazor WebAssembly) utilizan sus propios enfoques de interfaz de usuario Identity y no pueden utilizar el generador de esqueletos de ASP.NET Core Identity.
Para más información, consulte los Blazor artículos de Seguridad y Identity.
Scaffolding de Identity en un proyecto de Razor sin autorización existente
Instale el Microsoft. VisualStudio.Web.CodeGeneration.Design paquete NuGet.
Nota:
Para obtener instrucciones sobre cómo agregar paquetes a aplicaciones .NET, consulta los artículos de Instalación y administración de paquetes en Flujo de trabajo de consumo de paquetes (documentación de NuGet). Confirme las versiones correctas del paquete en NuGet.org.
Ejecuta el generador de Identity siguiendo estos pasos.
En Explorador de soluciones, haga clic con el botón derecho en el proyecto y seleccione Agregar>Nuevo elemento con scaffolding.
En el panel izquierdo del cuadro de diálogo Añadir nuevo elemento generado automáticamente, selecciona Identity.
En el panel central, seleccione Identityy, a continuación, seleccione Agregar.
En el cuadro de diálogo Agregar Identity , seleccione las opciones que desee:
Si ya tiene una página de diseño personalizada de Identity (_Layout.cshtml), seleccione la página existente para evitar que el scaffolder sobrescriba su diseño con un marcado incorrecto. Por ejemplo, seleccione:
- Pages/Shared/_Layout.cshtml para Razor páginas o Blazor Server proyectos con una infraestructura de Razor páginas ya existente.
- Views/Shared/_Layout.cshtml para proyectos de MVC o proyectos con infraestructura de MVC existente Blazor Server.
Seleccione el icono más (+) y agregue la clase de contexto de base de datos DbContext. Debe seleccionar al menos un archivo para añadir su contexto de datos.
Para crear un contexto de datos, seleccione el icono más (+). Acepte el valor predeterminado o especifique una nueva clase para Identity.
Para crear una nueva clase de usuario, seleccione el icono más (+) para Clase user y especifique la clase (por ejemplo,
ContosoUserpara una empresa denominada "Contoso").
Seleccione Agregar para ejecutar el scaffolder.
Migraciones, UseAuthentication y diseño
El código de base de datos generado Identity requiere Entity Framework Core Migrations. Si una migración para generar el Identity esquema aún no se ha creado y aplicado a la base de datos, use los procedimientos siguientes para crear una migración y actualizar la base de datos.
Los Servicios conectados de Visual Studio se utilizan para agregar una migración EF Core y actualizar la base de datos.
En el Explorador de soluciones, haga doble clic en Servicios conectados.
En el área SQL Server Express LocalDB de Service Dependencies, seleccione More actions (... ) >Add migration.
Asigne a la migración un Nombre de migración, como
CreateIdentitySchema, que es un nombre que describe la migración.Espera a que se cargue el contexto de la base de datos en el campo Nombres de clase de DBContext. La acción puede tardar unos segundos.
Seleccione Finalizar para completar la actualización. Una vez finalizada la operación, seleccione Cerrar.
Seleccione Más acciones (...) >Actualizar base de datos.
Se abre el cuadro de diálogo Actualizar la base de datos con la última migración.
Espera a que se actualice el campo Nombres de clase DBContext y a que se carguen las migraciones anteriores. La acción puede tardar unos segundos.
Seleccione Finalizar para completar la actualización. Una vez finalizada la operación, seleccione Cerrar.
El comando update database ejecuta las migraciones del método Up que no se aplican en un archivo de código de migración creado por el generador de esqueletos. En este caso, el comando ejecuta el Up método en el archivo Migrations/{TIME STAMP}_{MIGRATION NAME}.cs , que crea las Identity tablas, restricciones e índices. El marcador {TIME STAMP} es una marca de tiempo, y el marcador {MIGRATION NAME} es el nombre de la migración.
Si el Identity esquema se crea pero no se aplica a la base de datos, solo tiene que ejecutar el comando para actualizar la base de datos:
En el Explorador de soluciones, haga doble clic en Servicios conectados.
En el área SQL Server Express LocalDB de Service Dependencies, seleccione More actions (... ) >Update database.
Se abre el cuadro de diálogo Actualizar la base de datos con la última migración.
Espera a que se actualice el campo Nombres de clase DBContext y a que se carguen las migraciones anteriores. La acción puede tardar unos segundos.
Seleccione Finalizar para completar la actualización. Una vez finalizada la operación, seleccione Cerrar.
Puede confirmar la aplicación de un esquema Identity con el siguiente comando. La salida del comando incluye una columna "applied" para mostrar qué migraciones se aplican a la base de datos.
En el Visual Studio Administrador de paquetes Console, ejecute el comando Get-Migration:
Get-Migration
Si existe más de un contexto de base de datos, especifique el contexto con el parámetro -Context.
Cambios de diseño
Como opción, puede añadir el fragmento de inicio de sesión (_LoginPartial) al archivo de diseño:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>@ViewData["Title"] - WebRPnoAuth2Auth</title>
<link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.css" />
<link rel="stylesheet" href="~/css/site.css" asp-append-version="true" />
<link rel="stylesheet" href="~/WebRPnoAuth2Auth.styles.css" asp-append-version="true" />
</head>
<body>
<header>
<nav class="navbar navbar-expand-sm navbar-toggleable-sm navbar-light bg-white border-bottom box-shadow mb-3">
<div class="container">
<a class="navbar-brand" asp-area="" asp-page="/Index">WebRPnoAuth2Auth</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target=".navbar-collapse" aria-controls="navbarSupportedContent"
aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="navbar-collapse collapse d-sm-inline-flex justify-content-between">
<ul class="navbar-nav flex-grow-1">
<li class="nav-item">
<a class="nav-link text-dark" asp-area="" asp-page="/Index">Home</a>
</li>
<li class="nav-item">
<a class="nav-link text-dark" asp-area="" asp-page="/Privacy">Privacy</a>
</li>
</ul>
<partial name="_LoginPartial" />
</div>
</div>
</nav>
</header>
<div class="container">
<main role="main" class="pb-3">
@RenderBody()
</main>
</div>
<footer class="border-top footer text-muted">
<div class="container">
© 2021 - WebRPnoAuth2Auth - <a asp-area="" asp-page="/Privacy">Privacy</a>
</div>
</footer>
<script src="~/lib/jquery/dist/jquery.js"></script>
<script src="~/lib/bootstrap/dist/js/bootstrap.bundle.js"></script>
<script src="~/js/site.js" asp-append-version="true"></script>
@await RenderSectionAsync("Scripts", required: false)
</body>
</html>
Integrar Identity en un proyecto Razor con autorización
Instale el Microsoft. VisualStudio.Web.CodeGeneration.Design paquete NuGet.
Nota:
Para obtener instrucciones sobre cómo agregar paquetes a aplicaciones .NET, consulta los artículos de Instalación y administración de paquetes en Flujo de trabajo de consumo de paquetes (documentación de NuGet). Confirme las versiones correctas del paquete en NuGet.org.
Ejecuta el generador de Identity siguiendo estos pasos.
En Explorador de soluciones, haga clic con el botón derecho en el proyecto y seleccione Agregar>Nuevo elemento con scaffolding.
En el panel izquierdo del cuadro de diálogo Añadir nuevo elemento generado automáticamente, selecciona Identity.
En el panel central, seleccione Identityy, a continuación, seleccione Agregar.
En el cuadro de diálogo Agregar Identity , seleccione las opciones que desee:
Si ya tiene una página de diseño personalizada de Identity (_Layout.cshtml), seleccione la página existente para evitar que el scaffolder sobrescriba su diseño con un marcado incorrecto. Por ejemplo, seleccione:
- Pages/Shared/_Layout.cshtml para Razor páginas o Blazor Server proyectos con una infraestructura de Razor páginas ya existente.
- Views/Shared/_Layout.cshtml para proyectos de MVC o proyectos con infraestructura de MVC existente Blazor Server.
Seleccione el icono más (+) y agregue la clase de contexto de base de datos DbContext. Debe seleccionar al menos un archivo para añadir su contexto de datos.
Para crear un contexto de datos, seleccione el icono más (+). Acepte el valor predeterminado o especifique una clase (por ejemplo,
Contoso.Data.ApplicationDbContextpara una empresa denominada "Contoso").Para crear una nueva clase de usuario, seleccione el icono más (+) para Clase user y especifique la clase (por ejemplo,
ContosoUserpara una empresa denominada "Contoso").
Seleccione Agregar para ejecutar el scaffolder.
Scaffolding de Identity en un proyecto de MVC sin autorización existente
Instale el Microsoft. VisualStudio.Web.CodeGeneration.Design paquete NuGet.
Nota:
Para obtener instrucciones sobre cómo agregar paquetes a aplicaciones .NET, consulta los artículos de Instalación y administración de paquetes en Flujo de trabajo de consumo de paquetes (documentación de NuGet). Confirme las versiones correctas del paquete en NuGet.org.
Ejecuta el generador de Identity siguiendo estos pasos.
En Explorador de soluciones, haga clic con el botón derecho en el proyecto y seleccione Agregar>Nuevo elemento con scaffolding.
En el panel izquierdo del cuadro de diálogo Añadir nuevo elemento generado automáticamente, selecciona Identity.
En el panel central, seleccione Identityy, a continuación, seleccione Agregar.
En el cuadro de diálogo Agregar Identity , seleccione las opciones que desee:
Si ya tiene una página de diseño personalizada de Identity (_Layout.cshtml), seleccione la página existente para evitar que el scaffolder sobrescriba su diseño con un marcado incorrecto. Por ejemplo, seleccione:
- Pages/Shared/_Layout.cshtml para Razor páginas o Blazor Server proyectos con una infraestructura de Razor páginas ya existente.
- Views/Shared/_Layout.cshtml para proyectos de MVC o proyectos con infraestructura de MVC existente Blazor Server.
Seleccione el icono más (+) y agregue la clase de contexto de base de datos DbContext. Debe seleccionar al menos un archivo para añadir su contexto de datos.
Para crear un contexto de datos, seleccione el icono más (+). Acepte el valor predeterminado o especifique una nueva clase para Identity.
Para crear una nueva clase de usuario, seleccione el icono más (+) para Clase user y especifique la clase (por ejemplo,
ContosoUserpara una empresa denominada "Contoso").
Seleccione Agregar para ejecutar el scaffolder.
Opcional: agregue el inicio de sesión parcial (_LoginPartial) al archivo de Views/Shared/_Layout.cshtml:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>@ViewData["Title"] - WebRPnoAuth2Auth</title>
<link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.css" />
<link rel="stylesheet" href="~/css/site.css" asp-append-version="true" />
<link rel="stylesheet" href="~/WebRPnoAuth2Auth.styles.css" asp-append-version="true" />
</head>
<body>
<header>
<nav class="navbar navbar-expand-sm navbar-toggleable-sm navbar-light bg-white border-bottom box-shadow mb-3">
<div class="container">
<a class="navbar-brand" asp-area="" asp-page="/Index">WebRPnoAuth2Auth</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target=".navbar-collapse" aria-controls="navbarSupportedContent"
aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="navbar-collapse collapse d-sm-inline-flex justify-content-between">
<ul class="navbar-nav flex-grow-1">
<li class="nav-item">
<a class="nav-link text-dark" asp-area="" asp-page="/Index">Home</a>
</li>
<li class="nav-item">
<a class="nav-link text-dark" asp-area="" asp-page="/Privacy">Privacy</a>
</li>
</ul>
<partial name="_LoginPartial" />
</div>
</div>
</nav>
</header>
<div class="container">
<main role="main" class="pb-3">
@RenderBody()
</main>
</div>
<footer class="border-top footer text-muted">
<div class="container">
© 2021 - WebRPnoAuth2Auth - <a asp-area="" asp-page="/Privacy">Privacy</a>
</div>
</footer>
<script src="~/lib/jquery/dist/jquery.js"></script>
<script src="~/lib/bootstrap/dist/js/bootstrap.bundle.js"></script>
<script src="~/js/site.js" asp-append-version="true"></script>
@await RenderSectionAsync("Scripts", required: false)
</body>
</html>
El código de base de datos generado Identity requiere Entity Framework Core Migrations. Si una migración para generar el Identity esquema aún no se ha creado y aplicado a la base de datos, use los procedimientos siguientes para crear una migración y actualizar la base de datos.
Los Servicios conectados de Visual Studio se utilizan para agregar una migración EF Core y actualizar la base de datos.
En el Explorador de soluciones, haga doble clic en Servicios conectados.
En el área SQL Server Express LocalDB de Service Dependencies, seleccione More actions (... ) >Add migration.
Asigne a la migración un Nombre de migración, como
CreateIdentitySchema, que es un nombre que describe la migración.Espera a que se cargue el contexto de la base de datos en el campo Nombres de clase de DBContext. La acción puede tardar unos segundos.
Seleccione Finalizar para completar la actualización. Una vez finalizada la operación, seleccione Cerrar.
Seleccione Más acciones (...) >Actualizar base de datos.
Se abre el cuadro de diálogo Actualizar la base de datos con la última migración.
Espera a que se actualice el campo Nombres de clase DBContext y a que se carguen las migraciones anteriores. La acción puede tardar unos segundos.
Seleccione Finalizar para completar la actualización. Una vez finalizada la operación, seleccione Cerrar.
El comando update database ejecuta las migraciones del método Up que no se aplican en un archivo de código de migración creado por el generador de esqueletos. En este caso, el comando ejecuta el Up método en el archivo Migrations/{TIME STAMP}_{MIGRATION NAME}.cs , que crea las Identity tablas, restricciones e índices. El marcador {TIME STAMP} es una marca de tiempo, y el marcador {MIGRATION NAME} es el nombre de la migración.
Si el Identity esquema se crea pero no se aplica a la base de datos, solo tiene que ejecutar el comando para actualizar la base de datos:
En el Explorador de soluciones, haga doble clic en Servicios conectados.
En el área SQL Server Express LocalDB de Service Dependencies, seleccione More actions (... ) >Update database.
Se abre el cuadro de diálogo Actualizar la base de datos con la última migración.
Espera a que se actualice el campo Nombres de clase DBContext y a que se carguen las migraciones anteriores. La acción puede tardar unos segundos.
Seleccione Finalizar para completar la actualización. Una vez finalizada la operación, seleccione Cerrar.
Puede confirmar la aplicación de un esquema Identity con el siguiente comando. La salida del comando incluye una columna "applied" para mostrar qué migraciones se aplican a la base de datos.
En el Visual Studio Administrador de paquetes Console, ejecute el comando Get-Migration:
Get-Migration
Si existe más de un contexto de base de datos, especifique el contexto con el parámetro -Context.
Agregue MapRazorPages al archivo Program.cs tal y como se muestra en el código resaltado siguiente:
using Microsoft.AspNetCore.Identity;
using Microsoft.EntityFrameworkCore;
using WebMVCauth.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.AddControllersWithViews();
var app = builder.Build();
if (app.Environment.IsDevelopment())
{
app.UseMigrationsEndPoint();
}
else
{
app.UseExceptionHandler("/Home/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
app.MapRazorPages();
app.Run();
Scaffolding de Identity en un proyecto de MVC con autorización
Instale el Microsoft. VisualStudio.Web.CodeGeneration.Design paquete NuGet.
Nota:
Para obtener instrucciones sobre cómo agregar paquetes a aplicaciones .NET, consulta los artículos de Instalación y administración de paquetes en Flujo de trabajo de consumo de paquetes (documentación de NuGet). Confirme las versiones correctas del paquete en NuGet.org.
Ejecuta el generador de Identity siguiendo estos pasos.
En Explorador de soluciones, haga clic con el botón derecho en el proyecto y seleccione Agregar>Nuevo elemento con scaffolding.
En el panel izquierdo del cuadro de diálogo Añadir nuevo elemento generado automáticamente, selecciona Identity.
En el panel central, seleccione Identityy, a continuación, seleccione Agregar.
En el cuadro de diálogo Agregar Identity , seleccione las opciones que desee:
Si ya tiene una página de diseño personalizada de Identity (_Layout.cshtml), seleccione la página existente para evitar que el scaffolder sobrescriba su diseño con un marcado incorrecto. Por ejemplo, seleccione:
- Pages/Shared/_Layout.cshtml para Razor páginas o Blazor Server proyectos con una infraestructura de Razor páginas ya existente.
- Views/Shared/_Layout.cshtml para proyectos de MVC o proyectos con infraestructura de MVC existente Blazor Server.
Seleccione el icono más (+) y agregue la clase de contexto de base de datos DbContext. Debe seleccionar al menos un archivo para añadir su contexto de datos.
Para crear un contexto de datos, seleccione el icono más (+). Acepte el valor predeterminado o especifique una clase (por ejemplo,
Contoso.Data.ApplicationDbContextpara una empresa denominada "Contoso").Para crear una nueva clase de usuario, seleccione el icono más (+) para Clase user y especifique la clase (por ejemplo,
ContosoUserpara una empresa denominada "Contoso").
Seleccione Agregar para ejecutar el scaffolder.
Crear el código fuente completo de la interfaz de usuario Identity
Para mantener el control total de la interfaz de usuario de Identity, ejecute el proveedor de scaffolding de Identity y seleccione Invalidar todos los archivos.
Configuración de la contraseña
Si PasswordOptions están configurados en Startup.ConfigureServices, es posible que se requiera la configuración de StringLengthAttribute para la propiedad Password en las páginas generadas mediante el generador de esqueletos Identity. El InputModel y sus propiedades Password se encuentran en los archivos siguientes:
- Areas/Identity/Pages/Account/Register.cshtml.cs
- Areas/Identity/Pages/Account/ResetPassword.cshtml.cs
Deshabilitar una página
En esta sección se describe cómo deshabilitar la página de registro, pero puede usar el mismo enfoque para deshabilitar cualquier página.
Para deshabilitar el registro de usuarios:
Aplique scaffolding a Identity. Incluya
Account.Register,Account.Login, yAccount.RegisterConfirmation. Por ejemplo:dotnet aspnet-codegenerator identity -dc RPauth.Data.ApplicationDbContext --files "Account.Register;Account.Login;Account.RegisterConfirmation"Actualice el archivo Areas//IdentityPages/Account/Register.cshtml.cs para que los usuarios no puedan registrarse desde este punto de conexión:
public class RegisterModel : PageModel { public IActionResult OnGet() { return RedirectToPage("Login"); } public IActionResult OnPost() { return RedirectToPage("Login"); } }Actualice el archivo Areas/Identity/Pages/Account/Register.cshtml para que sea coherente con los cambios anteriores:
@page @model RegisterModel @{ ViewData["Title"] = "Go to Login"; } <h1>@ViewData["Title"]</h1> <li class="nav-item"> <a class="nav-link text-dark" asp-area="Identity" asp-page="/Account/Login">Login</a> </li>Comenta o elimina el enlace de registro del archivo Areas/Identity/Pages/Account/Login.cshtml:
@* <p> <a asp-page="./Register" asp-route-returnUrl="@Model.ReturnUrl">Register as a new user</a> </p> *@Actualice la página
Areas/Identity/Pages/Account/RegisterConfirmation.Quite el código y los vínculos del archivo .cshtml .
Quite el código de confirmación de la
PageModelimplementación:
[AllowAnonymous] public class RegisterConfirmationModel : PageModel { public IActionResult OnGet() { return Page(); } }
Uso de otra aplicación para agregar usuarios
Proporcione un mecanismo para agregar usuarios fuera de la aplicación web. Entre las opciones para agregar usuarios se incluyen:
- Una aplicación web de administración dedicada
- Una aplicación de consola
En el código siguiente se describe un enfoque para agregar usuarios:
- Lea la lista de usuarios en memoria.
- Genere una contraseña única segura para cada usuario.
- Agregue el usuario a la base de Identity datos.
- Notifique al usuario que cambie su contraseña.
public class Program
{
public static void Main(string[] args)
{
var host = CreateHostBuilder(args).Build();
using (var scope = host.Services.CreateScope())
{
var services = scope.ServiceProvider;
try
{
var context = services.GetRequiredService<AppDbCntx>();
context.Database.Migrate();
var config = host.Services.GetRequiredService<IConfiguration>();
var userList = config.GetSection("userList").Get<List<string>>();
SeedData.Initialize(services, userList).Wait();
}
catch (Exception ex)
{
var logger = services.GetRequiredService<ILogger<Program>>();
logger.LogError(ex, "An error occurred adding users.");
}
}
host.Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
}
En el código siguiente se describe cómo agregar un usuario:
public static async Task Initialize(IServiceProvider serviceProvider,
List<string> userList)
{
var userManager = serviceProvider.GetService<UserManager<IdentityUser>>();
foreach (var userName in userList)
{
var userPassword = GenerateSecurePassword();
var userId = await EnsureUser(userManager, userName, userPassword);
NotifyUser(userName, userPassword);
}
}
private static async Task<string> EnsureUser(UserManager<IdentityUser> userManager,
string userName, string userPassword)
{
var user = await userManager.FindByNameAsync(userName);
if (user == null)
{
user = new IdentityUser(userName)
{
EmailConfirmed = true
};
await userManager.CreateAsync(user, userPassword);
}
return user.Id;
}
Se puede seguir un enfoque similar para escenarios de producción.
Impedir la publicación de recursos estáticos Identity
Para evitar la publicación de recursos estáticos de Identity en la raíz de la web, consulte Introducción a Identity en ASP.NET Core.
ASP.NET Core proporciona ASP.NET Core Identity como una Razor biblioteca de clases (RCL). Las aplicaciones que incluyen Identity pueden aplicar la herramienta de generación de estructura para añadir de forma selectiva el código fuente contenido en el Identity RCL. Puede que quiera generar código fuente que le permita modificar un código y cambiar el comportamiento; así, por ejemplo, podría indicar al proveedor de scaffolding que generara el código que se usa en el registro. El código generado tiene prioridad sobre el mismo código de la RCL de Identity. Para tener el control total de la interfaz de usuario y no usar la RCL predeterminada, consulte la sección Crear el código fuente completo de la Identity interfaz de usuario.
Las aplicaciones que no incluyen autenticación pueden aplicar el proveedor de scaffolding para agregar el paquete de Identity de la RCL. Tiene la opción de seleccionar el código Identity que se va a generar.
Aunque el proveedor de scaffolding genera la mayor parte del código necesario, debe actualizar el proyecto para completar el proceso. Este documento explica los pasos necesarios para completar una actualización de scaffolding de Identity.
Recomendamos utilizar un sistema de control de código fuente que muestre las diferencias entre archivos y permita dar marcha atrás en los cambios. Inspeccione los cambios después de ejecutar el proveedor de scaffolding de Identity.
Los servicios son necesarios cuando se usan Autenticación de dos factores, Confirmación de cuenta y recuperación de contraseña y otras características de seguridad con Identity. Los servicios o códigos auxiliares de servicio no se generan al aplicar scaffolding a Identity. Los servicios para habilitar estas características deben agregarse manualmente. Por ejemplo, consulte Requerir confirmación por correo electrónico.
Normalmente, las aplicaciones creadas con cuentas individuales no deben crear un nuevo contexto de datos.
Scaffolding de Identity en un proyecto de Razor sin autorización existente
Instale el Microsoft. VisualStudio.Web.CodeGeneration.Design paquete NuGet.
Nota:
Para obtener instrucciones sobre cómo agregar paquetes a aplicaciones .NET, consulta los artículos de Instalación y administración de paquetes en Flujo de trabajo de consumo de paquetes (documentación de NuGet). Confirme las versiones correctas del paquete en NuGet.org.
Ejecuta el generador de Identity siguiendo estos pasos.
En Explorador de soluciones, haga clic con el botón derecho en el proyecto y seleccione Agregar>Nuevo elemento con scaffolding.
En el panel izquierdo del cuadro de diálogo Añadir nuevo elemento generado automáticamente, selecciona Identity.
En el panel central, seleccione Identityy, a continuación, seleccione Agregar.
En el cuadro de diálogo Agregar Identity , seleccione las opciones que desee:
Si ya tiene una página de diseño personalizada de Identity (_Layout.cshtml), seleccione la página existente para evitar que el scaffolder sobrescriba su diseño con un marcado incorrecto. Por ejemplo, seleccione:
- Pages/Shared/_Layout.cshtml para Razor páginas o Blazor Server proyectos con una infraestructura de Razor páginas ya existente.
- Views/Shared/_Layout.cshtml para proyectos de MVC o proyectos con infraestructura de MVC existente Blazor Server.
Seleccione el icono más (+) y agregue la clase de contexto de base de datos DbContext. Debe seleccionar al menos un archivo para añadir su contexto de datos.
Para crear un contexto de datos, seleccione el icono más (+). Acepte el valor predeterminado o especifique una nueva clase para Identity.
Para crear una nueva clase de usuario, seleccione el icono más (+) para Clase user y especifique la clase (por ejemplo,
ContosoUserpara una empresa denominada "Contoso").
Seleccione Agregar para ejecutar el scaffolder.
Migraciones, UseAuthentication y diseño
El código de base de datos generado Identity requiere Entity Framework Core Migrations. Si una migración para generar el Identity esquema aún no se ha creado y aplicado a la base de datos, use los procedimientos siguientes para crear una migración y actualizar la base de datos.
Los Servicios conectados de Visual Studio se utilizan para agregar una migración EF Core y actualizar la base de datos.
En el Explorador de soluciones, haga doble clic en Servicios conectados.
En el área SQL Server Express LocalDB de Service Dependencies, seleccione More actions (... ) >Add migration.
Asigne a la migración un Nombre de migración, como
CreateIdentitySchema, que es un nombre que describe la migración.Espera a que se cargue el contexto de la base de datos en el campo Nombres de clase de DBContext. La acción puede tardar unos segundos.
Seleccione Finalizar para completar la actualización. Una vez finalizada la operación, seleccione Cerrar.
Seleccione Más acciones (...) >Actualizar base de datos.
Se abre el cuadro de diálogo Actualizar la base de datos con la última migración.
Espera a que se actualice el campo Nombres de clase DBContext y a que se carguen las migraciones anteriores. La acción puede tardar unos segundos.
Seleccione Finalizar para completar la actualización. Una vez finalizada la operación, seleccione Cerrar.
El comando update database ejecuta las migraciones del método Up que no se aplican en un archivo de código de migración creado por el generador de esqueletos. En este caso, el comando ejecuta el Up método en el archivo Migrations/{TIME STAMP}_{MIGRATION NAME}.cs , que crea las Identity tablas, restricciones e índices. El marcador {TIME STAMP} es una marca de tiempo, y el marcador {MIGRATION NAME} es el nombre de la migración.
Si el Identity esquema se crea pero no se aplica a la base de datos, solo tiene que ejecutar el comando para actualizar la base de datos:
En el Explorador de soluciones, haga doble clic en Servicios conectados.
En el área SQL Server Express LocalDB de Service Dependencies, seleccione More actions (... ) >Update database.
Se abre el cuadro de diálogo Actualizar la base de datos con la última migración.
Espera a que se actualice el campo Nombres de clase DBContext y a que se carguen las migraciones anteriores. La acción puede tardar unos segundos.
Seleccione Finalizar para completar la actualización. Una vez finalizada la operación, seleccione Cerrar.
Puede confirmar la aplicación de un esquema Identity con el siguiente comando. La salida del comando incluye una columna "applied" para mostrar qué migraciones se aplican a la base de datos.
En el Visual Studio Administrador de paquetes Console, ejecute el comando Get-Migration:
Get-Migration
Si existe más de un contexto de base de datos, especifique el contexto con el parámetro -Context.
Cambios de diseño
Opcional: agregue el inicio de sesión parcial (_LoginPartial) al archivo de diseño:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>@ViewData["Title"] - WebRPnoAuth2Auth</title>
<link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.css" />
<link rel="stylesheet" href="~/css/site.css" asp-append-version="true" />
<link rel="stylesheet" href="~/WebRPnoAuth2Auth.styles.css" asp-append-version="true" />
</head>
<body>
<header>
<nav class="navbar navbar-expand-sm navbar-toggleable-sm navbar-light bg-white border-bottom box-shadow mb-3">
<div class="container">
<a class="navbar-brand" asp-area="" asp-page="/Index">WebRPnoAuth2Auth</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target=".navbar-collapse" aria-controls="navbarSupportedContent"
aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="navbar-collapse collapse d-sm-inline-flex justify-content-between">
<ul class="navbar-nav flex-grow-1">
<li class="nav-item">
<a class="nav-link text-dark" asp-area="" asp-page="/Index">Home</a>
</li>
<li class="nav-item">
<a class="nav-link text-dark" asp-area="" asp-page="/Privacy">Privacy</a>
</li>
</ul>
<partial name="_LoginPartial" />
</div>
</div>
</nav>
</header>
<div class="container">
<main role="main" class="pb-3">
@RenderBody()
</main>
</div>
<footer class="border-top footer text-muted">
<div class="container">
© 2021 - WebRPnoAuth2Auth - <a asp-area="" asp-page="/Privacy">Privacy</a>
</div>
</footer>
<script src="~/lib/jquery/dist/jquery.js"></script>
<script src="~/lib/bootstrap/dist/js/bootstrap.bundle.js"></script>
<script src="~/js/site.js" asp-append-version="true"></script>
@await RenderSectionAsync("Scripts", required: false)
</body>
</html>
Integrar Identity en un proyecto Razor con autorización
Instale el Microsoft. VisualStudio.Web.CodeGeneration.Design paquete NuGet.
Nota:
Para obtener instrucciones sobre cómo agregar paquetes a aplicaciones .NET, consulta los artículos de Instalación y administración de paquetes en Flujo de trabajo de consumo de paquetes (documentación de NuGet). Confirme las versiones correctas del paquete en NuGet.org.
Ejecuta el generador de Identity siguiendo estos pasos.
En Explorador de soluciones, haga clic con el botón derecho en el proyecto y seleccione Agregar>Nuevo elemento con scaffolding.
En el panel izquierdo del cuadro de diálogo Añadir nuevo elemento generado automáticamente, selecciona Identity.
En el panel central, seleccione Identityy, a continuación, seleccione Agregar.
En el cuadro de diálogo Agregar Identity , seleccione las opciones que desee:
Si ya tiene una página de diseño personalizada de Identity (_Layout.cshtml), seleccione la página existente para evitar que el scaffolder sobrescriba su diseño con un marcado incorrecto. Por ejemplo, seleccione:
- Pages/Shared/_Layout.cshtml para Razor páginas o Blazor Server proyectos con una infraestructura de Razor páginas ya existente.
- Views/Shared/_Layout.cshtml para proyectos de MVC o proyectos con infraestructura de MVC existente Blazor Server.
Seleccione el icono más (+) y agregue la clase de contexto de base de datos DbContext. Debe seleccionar al menos un archivo para añadir su contexto de datos.
Para crear un contexto de datos, seleccione el icono más (+). Acepte el valor predeterminado o especifique una clase (por ejemplo,
Contoso.Data.ApplicationDbContextpara una empresa denominada "Contoso").Para crear una nueva clase de usuario, seleccione el icono más (+) para Clase user y especifique la clase (por ejemplo,
ContosoUserpara una empresa denominada "Contoso").
Seleccione Agregar para ejecutar el scaffolder.
Scaffolding de Identity en un proyecto de MVC sin autorización existente
Instale el Microsoft. VisualStudio.Web.CodeGeneration.Design paquete NuGet.
Nota:
Para obtener instrucciones sobre cómo agregar paquetes a aplicaciones .NET, consulta los artículos de Instalación y administración de paquetes en Flujo de trabajo de consumo de paquetes (documentación de NuGet). Confirme las versiones correctas del paquete en NuGet.org.
Ejecuta el generador de Identity siguiendo estos pasos.
En Explorador de soluciones, haga clic con el botón derecho en el proyecto y seleccione Agregar>Nuevo elemento con scaffolding.
En el panel izquierdo del cuadro de diálogo Añadir nuevo elemento generado automáticamente, selecciona Identity.
En el panel central, seleccione Identityy, a continuación, seleccione Agregar.
En el cuadro de diálogo Agregar Identity , seleccione las opciones que desee:
Si ya tiene una página de diseño personalizada de Identity (_Layout.cshtml), seleccione la página existente para evitar que el scaffolder sobrescriba su diseño con un marcado incorrecto. Por ejemplo, seleccione:
- Pages/Shared/_Layout.cshtml para Razor páginas o Blazor Server proyectos con una infraestructura de Razor páginas ya existente.
- Views/Shared/_Layout.cshtml para proyectos de MVC o proyectos con infraestructura de MVC existente Blazor Server.
Seleccione el icono más (+) y agregue la clase de contexto de base de datos DbContext. Debe seleccionar al menos un archivo para añadir su contexto de datos.
Para crear un contexto de datos, seleccione el icono más (+). Acepte el valor predeterminado o especifique una nueva clase para Identity.
Para crear una nueva clase de usuario, seleccione el icono más (+) para Clase user y especifique la clase (por ejemplo,
ContosoUserpara una empresa denominada "Contoso").
Seleccione Agregar para ejecutar el scaffolder.
Opcional: agregue el inicio de sesión parcial (_LoginPartial) al archivo de Views/Shared/_Layout.cshtml:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>@ViewData["Title"] - WebRPnoAuth2Auth</title>
<link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.css" />
<link rel="stylesheet" href="~/css/site.css" asp-append-version="true" />
<link rel="stylesheet" href="~/WebRPnoAuth2Auth.styles.css" asp-append-version="true" />
</head>
<body>
<header>
<nav class="navbar navbar-expand-sm navbar-toggleable-sm navbar-light bg-white border-bottom box-shadow mb-3">
<div class="container">
<a class="navbar-brand" asp-area="" asp-page="/Index">WebRPnoAuth2Auth</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target=".navbar-collapse" aria-controls="navbarSupportedContent"
aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="navbar-collapse collapse d-sm-inline-flex justify-content-between">
<ul class="navbar-nav flex-grow-1">
<li class="nav-item">
<a class="nav-link text-dark" asp-area="" asp-page="/Index">Home</a>
</li>
<li class="nav-item">
<a class="nav-link text-dark" asp-area="" asp-page="/Privacy">Privacy</a>
</li>
</ul>
<partial name="_LoginPartial" />
</div>
</div>
</nav>
</header>
<div class="container">
<main role="main" class="pb-3">
@RenderBody()
</main>
</div>
<footer class="border-top footer text-muted">
<div class="container">
© 2021 - WebRPnoAuth2Auth - <a asp-area="" asp-page="/Privacy">Privacy</a>
</div>
</footer>
<script src="~/lib/jquery/dist/jquery.js"></script>
<script src="~/lib/bootstrap/dist/js/bootstrap.bundle.js"></script>
<script src="~/js/site.js" asp-append-version="true"></script>
@await RenderSectionAsync("Scripts", required: false)
</body>
</html>
El código de base de datos generado Identity requiere Entity Framework Core Migrations. Si una migración para generar el Identity esquema aún no se ha creado y aplicado a la base de datos, use los procedimientos siguientes para crear una migración y actualizar la base de datos.
Los Servicios conectados de Visual Studio se utilizan para agregar una migración EF Core y actualizar la base de datos.
En el Explorador de soluciones, haga doble clic en Servicios conectados.
En el área SQL Server Express LocalDB de Service Dependencies, seleccione More actions (... ) >Add migration.
Asigne a la migración un Nombre de migración, como
CreateIdentitySchema, que es un nombre que describe la migración.Espera a que se cargue el contexto de la base de datos en el campo Nombres de clase de DBContext. La acción puede tardar unos segundos.
Seleccione Finalizar para completar la actualización. Una vez finalizada la operación, seleccione Cerrar.
Seleccione Más acciones (...) >Actualizar base de datos.
Se abre el cuadro de diálogo Actualizar la base de datos con la última migración.
Espera a que se actualice el campo Nombres de clase DBContext y a que se carguen las migraciones anteriores. La acción puede tardar unos segundos.
Seleccione Finalizar para completar la actualización. Una vez finalizada la operación, seleccione Cerrar.
El comando update database ejecuta las migraciones del método Up que no se aplican en un archivo de código de migración creado por el generador de esqueletos. En este caso, el comando ejecuta el Up método en el archivo Migrations/{TIME STAMP}_{MIGRATION NAME}.cs , que crea las Identity tablas, restricciones e índices. El marcador {TIME STAMP} es una marca de tiempo, y el marcador {MIGRATION NAME} es el nombre de la migración.
Si el Identity esquema se crea pero no se aplica a la base de datos, solo tiene que ejecutar el comando para actualizar la base de datos:
En el Explorador de soluciones, haga doble clic en Servicios conectados.
En el área SQL Server Express LocalDB de Service Dependencies, seleccione More actions (... ) >Update database.
Se abre el cuadro de diálogo Actualizar la base de datos con la última migración.
Espera a que se actualice el campo Nombres de clase DBContext y a que se carguen las migraciones anteriores. La acción puede tardar unos segundos.
Seleccione Finalizar para completar la actualización. Una vez finalizada la operación, seleccione Cerrar.
Puede confirmar la aplicación de un esquema Identity con el siguiente comando. La salida del comando incluye una columna "applied" para mostrar qué migraciones se aplican a la base de datos.
En el Visual Studio Administrador de paquetes Console, ejecute el comando Get-Migration:
Get-Migration
Si existe más de un contexto de base de datos, especifique el contexto con el parámetro -Context.
Agregue MapRazorPages a Program.cs como se muestra en el siguiente código resaltado:
using Microsoft.AspNetCore.Identity;
using Microsoft.EntityFrameworkCore;
using WebMVCauth.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.AddControllersWithViews();
var app = builder.Build();
if (app.Environment.IsDevelopment())
{
app.UseMigrationsEndPoint();
}
else
{
app.UseExceptionHandler("/Home/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
app.MapRazorPages();
app.Run();
Scaffolding de Identity en un proyecto de MVC con autorización
Instale el Microsoft. VisualStudio.Web.CodeGeneration.Design paquete NuGet.
Nota:
Para obtener instrucciones sobre cómo agregar paquetes a aplicaciones .NET, consulta los artículos de Instalación y administración de paquetes en Flujo de trabajo de consumo de paquetes (documentación de NuGet). Confirme las versiones correctas del paquete en NuGet.org.
Ejecuta el generador de Identity siguiendo estos pasos.
En Explorador de soluciones, haga clic con el botón derecho en el proyecto y seleccione Agregar>Nuevo elemento con scaffolding.
En el panel izquierdo del cuadro de diálogo Añadir nuevo elemento generado automáticamente, selecciona Identity.
En el panel central, seleccione Identityy, a continuación, seleccione Agregar.
En el cuadro de diálogo Agregar Identity , seleccione las opciones que desee:
Si ya tiene una página de diseño personalizada de Identity (_Layout.cshtml), seleccione la página existente para evitar que el scaffolder sobrescriba su diseño con un marcado incorrecto. Por ejemplo, seleccione:
- Pages/Shared/_Layout.cshtml para Razor páginas o Blazor Server proyectos con una infraestructura de Razor páginas ya existente.
- Views/Shared/_Layout.cshtml para proyectos de MVC o proyectos con infraestructura de MVC existente Blazor Server.
Seleccione el icono más (+) y agregue la clase de contexto de base de datos DbContext. Debe seleccionar al menos un archivo para añadir su contexto de datos.
Para crear un contexto de datos, seleccione el icono más (+). Acepte el valor predeterminado o especifique una clase (por ejemplo,
Contoso.Data.ApplicationDbContextpara una empresa denominada "Contoso").Para crear una nueva clase de usuario, seleccione el icono más (+) para Clase user y especifique la clase (por ejemplo,
ContosoUserpara una empresa denominada "Contoso").
Seleccione Agregar para ejecutar el scaffolder.
Aplicar scaffolding Identity en una aplicación de Blazor del lado del servidor con autorización
Instale el Microsoft. VisualStudio.Web.CodeGeneration.Design paquete NuGet.
Nota:
Para obtener instrucciones sobre cómo agregar paquetes a aplicaciones .NET, consulta los artículos de Instalación y administración de paquetes en Flujo de trabajo de consumo de paquetes (documentación de NuGet). Confirme las versiones correctas del paquete en NuGet.org.
Ejecuta el generador de Identity siguiendo estos pasos.
En Explorador de soluciones, haga clic con el botón derecho en el proyecto y seleccione Agregar>Nuevo elemento con scaffolding.
En el panel izquierdo del cuadro de diálogo Añadir nuevo elemento generado automáticamente, selecciona Identity.
En el panel central, seleccione Identityy, a continuación, seleccione Agregar.
En el cuadro de diálogo Agregar Identity , seleccione las opciones que desee:
Si ya tiene una página de diseño personalizada de Identity (_Layout.cshtml), seleccione la página existente para evitar que el scaffolder sobrescriba su diseño con un marcado incorrecto. Por ejemplo, seleccione:
- Pages/Shared/_Layout.cshtml para Razor páginas o Blazor Server proyectos con una infraestructura de Razor páginas ya existente.
- Views/Shared/_Layout.cshtml para proyectos de MVC o proyectos con infraestructura de MVC existente Blazor Server.
Seleccione el icono más (+) y agregue la clase de contexto de base de datos DbContext. Debe seleccionar al menos un archivo para añadir su contexto de datos.
Para crear un contexto de datos, seleccione el icono más (+). Acepte el valor predeterminado o especifique una clase (por ejemplo,
Contoso.Data.ApplicationDbContextpara una empresa denominada "Contoso").Para crear una nueva clase de usuario, seleccione el icono más (+) para Clase user y especifique la clase (por ejemplo,
ContosoUserpara una empresa denominada "Contoso").
Seleccione Agregar para ejecutar el scaffolder.
Migraciones
El código de base de datos generado Identity requiere Entity Framework Core Migrations. Si una migración para generar el Identity esquema aún no se ha creado y aplicado a la base de datos, use los procedimientos siguientes para crear una migración y actualizar la base de datos.
Los Servicios conectados de Visual Studio se utilizan para agregar una migración EF Core y actualizar la base de datos.
En el Explorador de soluciones, haga doble clic en Servicios conectados.
En el área SQL Server Express LocalDB de Service Dependencies, seleccione More actions (... ) >Add migration.
Asigne a la migración un Nombre de migración, como
CreateIdentitySchema, que es un nombre que describe la migración.Espera a que se cargue el contexto de la base de datos en el campo Nombres de clase de DBContext. La acción puede tardar unos segundos.
Seleccione Finalizar para completar la actualización. Una vez finalizada la operación, seleccione Cerrar.
Seleccione Más acciones (...) >Actualizar base de datos.
Se abre el cuadro de diálogo Actualizar la base de datos con la última migración.
Espera a que se actualice el campo Nombres de clase DBContext y a que se carguen las migraciones anteriores. La acción puede tardar unos segundos.
Seleccione Finalizar para completar la actualización. Una vez finalizada la operación, seleccione Cerrar.
El comando update database ejecuta las migraciones del método Up que no se aplican en un archivo de código de migración creado por el generador de esqueletos. En este caso, el comando ejecuta el Up método en el archivo Migrations/{TIME STAMP}_{MIGRATION NAME}.cs , que crea las Identity tablas, restricciones e índices. El marcador {TIME STAMP} es una marca de tiempo, y el marcador {MIGRATION NAME} es el nombre de la migración.
Si el Identity esquema se crea pero no se aplica a la base de datos, solo tiene que ejecutar el comando para actualizar la base de datos:
En el Explorador de soluciones, haga doble clic en Servicios conectados.
En el área SQL Server Express LocalDB de Service Dependencies, seleccione More actions (... ) >Update database.
Se abre el cuadro de diálogo Actualizar la base de datos con la última migración.
Espera a que se actualice el campo Nombres de clase DBContext y a que se carguen las migraciones anteriores. La acción puede tardar unos segundos.
Seleccione Finalizar para completar la actualización. Una vez finalizada la operación, seleccione Cerrar.
Puede confirmar la aplicación de un esquema Identity con el siguiente comando. La salida del comando incluye una columna "applied" para mostrar qué migraciones se aplican a la base de datos.
En el Visual Studio Administrador de paquetes Console, ejecute el comando Get-Migration:
Get-Migration
Si existe más de un contexto de base de datos, especifique el contexto con el parámetro -Context.
Puntos de conexión de autenticación de estilo
Debido a que las aplicaciones Blazor del lado del servidor usan páginas de Razor Pages Identity, el estilo de la interfaz de usuario cambia cuando un visitante navega entre páginas Identity y componentes. Tiene dos opciones para abordar los estilos incongruentes:
- Componentes personalizados Identity
- Usa un diseño personalizado con los estilos de aplicación de Blazor
Componentes de Identity personalizados
ASP.NET Core Identity está diseñado para funcionar en el contexto de la comunicación de solicitud y respuesta HTTP, que no es el principal modelo de comunicación cliente-servidor en aplicaciones de Blazor. Las aplicaciones ASP.NET Core que usan ASP.NET Core Identity para la gestión de usuarios deben usar Razor Páginas en lugar de componentes Razor para la interfaz de usuario relacionada con Identity, como el registro de usuarios, el inicio de sesión, el cierre de sesión y otras tareas de gestión de usuarios.
Dado que SignInManager<TUser> y UserManager<TUser> no son compatibles en componentes de Razor, recomendamos usar la API web para administrar acciones de Identity desde componentes de Razor a través de una aplicación de ASP.NET Core del lado del servidor habilitada para Identity. Para obtener orientación sobre la creación de API web para aplicaciones de Blazor, consulte Llamar a una API web desde una aplicación de Blazor de ASP.NET Core.
Una forma de usar componentes de Razor para páginas de Identity en lugar de Razor es compilar sus propios componentes personalizados de IdentityRazor, pero Microsoft no recomienda ni brinda soporte para este método. Para obtener contexto adicional, explore las conversaciones siguientes. En las siguientes conversaciones, los ejemplos de código en los comentarios de las incidencias y los ejemplos de código con vínculos cruzados en repositorios de GitHub ajenos a Microsoft no cuentan con el soporte de Microsoft, pero podrían ser útiles para algunos desarrolladores:
- Compatibilidad con el componente de inicio de sesión personalizado al usar Identity (dotnet/aspnetcore #13601)
-
Aclaración sobre la incompatibilidad de
SigninManager<T>con los componentes Razor (dotnet/aspnetcore #34095) - No hay información sobre cómo implementar realmente un formulario de inicio de sesión personalizado para Blazor en el lado del servidor (dotnet/AspNetCore.Docs #16813)
Para obtener ayuda adicional al buscar componentes personalizados de IdentityRazor o buscar componentes de terceros de Razor, se recomiendan los siguientes recursos:
-
Stack Overflow (etiqueta:
blazor) (foro de soporte técnico público) - Equipo de Slack de ASP.NET Core (chat de soporte técnico público)
- Blazor Gitter (chat de soporte técnico público)
- Impresionante Blazor (Enlaces a recursos de Blazor mantenidos por la comunidad)
Usa un diseño personalizado con Blazor estilos de la aplicación
El diseño y los estilos de las páginas de Identity pueden modificarse para producir páginas que usen estilos similares al tema predeterminado de Blazor. Este enfoque no está cubierto por la documentación.
Aplicaciones cliente Blazor
Las aplicaciones de Blazor del lado del cliente usan sus propios métodos de interfaz de usuario de Identity y no pueden usar el scaffolding de Identity de ASP.NET Core. Las aplicaciones de ASP.NET Core del lado del servidor de soluciones de Blazor hospedadas pueden seguir las instrucciones de Razor Pages/MVC de este artículo y se configuran igual que cualquier otro tipo de aplicación de ASP.NET Core compatible con Identity.
El marco de trabajo de Blazor no incluye Razor versiones de componentes de páginas de interfaz de usuario de Identity. Los componentes de la IdentityIURazor pueden desarrollarse a medida u obtenerse de fuentes externas no compatibles.
Para más información, consulte los Blazor artículos de Seguridad y Identity.
Crear el código fuente completo de la interfaz de usuario Identity
Para mantener el control total de la interfaz de usuario de Identity, ejecute el proveedor de scaffolding de Identity y seleccione Invalidar todos los archivos.
Configuración de la contraseña
Si PasswordOptions están configurados en Startup.ConfigureServices, es posible que se requiera la configuración del [StringLength]attribute para la propiedad Password en las páginas Identity generadas automáticamente.
InputModel
Password propiedades se encuentran en los siguientes archivos:
Areas/Identity/Pages/Account/Register.cshtml.csAreas/Identity/Pages/Account/ResetPassword.cshtml.cs
Deshabilitar una página
En esta sección se muestra cómo deshabilitar la página de registro, pero el enfoque se puede usar para deshabilitar cualquier página.
Para deshabilitar el registro de usuarios:
Aplique scaffolding a Identity. Incluya Account.Register, Account.Login y Account.RegisterConfirmation. Por ejemplo:
dotnet aspnet-codegenerator identity -dc RPauth.Data.ApplicationDbContext --files "Account.Register;Account.Login;Account.RegisterConfirmation"Actualice
Areas/Identity/Pages/Account/Register.cshtml.cspara que los usuarios no puedan registrarse desde este punto de conexión:public class RegisterModel : PageModel { public IActionResult OnGet() { return RedirectToPage("Login"); } public IActionResult OnPost() { return RedirectToPage("Login"); } }Actualice
Areas/Identity/Pages/Account/Register.cshtmlpara ser coherente con los cambios anteriores:@page @model RegisterModel @{ ViewData["Title"] = "Go to Login"; } <h1>@ViewData["Title"]</h1> <li class="nav-item"> <a class="nav-link text-dark" asp-area="Identity" asp-page="/Account/Login">Login</a> </li>Comente o elimine el vínculo de registro de
Areas/Identity/Pages/Account/Login.cshtml@* <p> <a asp-page="./Register" asp-route-returnUrl="@Model.ReturnUrl">Register as a new user</a> </p> *@Actualice la página
Areas/Identity/Pages/Account/RegisterConfirmation.- Quite el código y los vínculos del archivo cshtml.
- Quite el código de confirmación de
PageModel:
[AllowAnonymous] public class RegisterConfirmationModel : PageModel { public IActionResult OnGet() { return Page(); } }
Uso de otra aplicación para agregar usuarios
Proporcione un mecanismo para agregar usuarios fuera de la aplicación web. Entre las opciones para agregar usuarios se incluyen:
- Una aplicación web de administración dedicada.
- Una aplicación de consola.
En el código siguiente se describe un enfoque para agregar usuarios:
- Una lista de usuarios se lee en la memoria.
- Se genera una contraseña única segura para cada usuario.
- El usuario se agrega a la base de datos de Identity.
- Se notifica al usuario y se le indica que cambie la contraseña.
public class Program
{
public static void Main(string[] args)
{
var host = CreateHostBuilder(args).Build();
using (var scope = host.Services.CreateScope())
{
var services = scope.ServiceProvider;
try
{
var context = services.GetRequiredService<AppDbCntx>();
context.Database.Migrate();
var config = host.Services.GetRequiredService<IConfiguration>();
var userList = config.GetSection("userList").Get<List<string>>();
SeedData.Initialize(services, userList).Wait();
}
catch (Exception ex)
{
var logger = services.GetRequiredService<ILogger<Program>>();
logger.LogError(ex, "An error occurred adding users.");
}
}
host.Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
}
En el código siguiente se describe cómo agregar un usuario:
public static async Task Initialize(IServiceProvider serviceProvider,
List<string> userList)
{
var userManager = serviceProvider.GetService<UserManager<IdentityUser>>();
foreach (var userName in userList)
{
var userPassword = GenerateSecurePassword();
var userId = await EnsureUser(userManager, userName, userPassword);
NotifyUser(userName, userPassword);
}
}
private static async Task<string> EnsureUser(UserManager<IdentityUser> userManager,
string userName, string userPassword)
{
var user = await userManager.FindByNameAsync(userName);
if (user == null)
{
user = new IdentityUser(userName)
{
EmailConfirmed = true
};
await userManager.CreateAsync(user, userPassword);
}
return user.Id;
}
Se puede seguir un enfoque similar para escenarios de producción.
Impedir la publicación de recursos estáticos Identity
Para evitar la publicación de recursos estáticos de Identity en la raíz de la web, consulte Introducción a Identity en ASP.NET Core.
ASP.NET Core proporciona ASP.NET Core Identity como una Razor biblioteca de clases (RCL). Las aplicaciones que incluyen Identity pueden aplicar la herramienta de generación de estructura para añadir de forma selectiva el código fuente contenido en el Identity RCL. Puede que quiera generar código fuente que le permita modificar un código y cambiar el comportamiento; así, por ejemplo, podría indicar al proveedor de scaffolding que generara el código que se usa en el registro. El código generado tiene prioridad sobre el mismo código de la RCL de Identity. Para tener el control total de la interfaz de usuario y no usar la RCL predeterminada, consulte la sección Crear el código fuente completo de la Identity interfaz de usuario.
Las aplicaciones que no incluyen autenticación pueden aplicar el proveedor de scaffolding para agregar el paquete de Identity de la RCL. Tiene la opción de seleccionar el código Identity que se va a generar.
Aunque el proveedor de scaffolding genera la mayor parte del código necesario, debe actualizar el proyecto para completar el proceso. Este documento explica los pasos necesarios para completar una actualización de scaffolding de Identity.
Recomendamos utilizar un sistema de control de código fuente que muestre las diferencias entre archivos y permita dar marcha atrás en los cambios. Inspeccione los cambios después de ejecutar el proveedor de scaffolding de Identity.
Los servicios son necesarios cuando se usan Autenticación de dos factores, Confirmación de cuenta y recuperación de contraseña y otras características de seguridad con Identity. Los servicios o códigos auxiliares de servicio no se generan al aplicar scaffolding a Identity. Los servicios para habilitar estas características deben agregarse manualmente. Por ejemplo, consulte Requerir confirmación por correo electrónico.
Al generar el andamiaje de Identity con un nuevo contexto de datos en un proyecto con cuentas individuales existentes, abre Startup.ConfigureServices y elimina las llamadas a:
AddDbContextAddDefaultIdentity
Por ejemplo, AddDbContext y AddDefaultIdentity se comentan en el código siguiente:
public void ConfigureServices(IServiceCollection services)
{
//services.AddDbContext<ApplicationDbContext>(options =>
// options.UseSqlServer(
// Configuration.GetConnectionString("DefaultConnection")));
//services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
// .AddEntityFrameworkStores<ApplicationDbContext>();
services.AddControllersWithViews();
services.AddRazorPages();
}
El código anterior comenta el código que está duplicado en Areas/Identity/IdentityHostingStartup.cs
Normalmente, las aplicaciones creadas con cuentas individuales no deben crear un nuevo contexto de datos.
Scaffolding de Identity en un proyecto vacío
Ejecuta el generador de Identity siguiendo estos pasos.
En Explorador de soluciones, haga clic con el botón derecho en el proyecto y seleccione Agregar>Nuevo elemento con scaffolding.
En el panel izquierdo del cuadro de diálogo Añadir nuevo elemento generado automáticamente, selecciona Identity.
En el panel central, seleccione Identityy, a continuación, seleccione Agregar.
En el cuadro de diálogo Agregar Identity , seleccione las opciones que desee:
Si ya tiene una página de diseño personalizada de Identity (_Layout.cshtml), seleccione la página existente para evitar que el scaffolder sobrescriba su diseño con un marcado incorrecto. Por ejemplo, seleccione:
- Pages/Shared/_Layout.cshtml para Razor páginas o Blazor Server proyectos con una infraestructura de Razor páginas ya existente.
- Views/Shared/_Layout.cshtml para proyectos de MVC o proyectos con infraestructura de MVC existente Blazor Server.
Seleccione el icono más (+) y agregue la clase de contexto de base de datos DbContext. Debe seleccionar al menos un archivo para añadir su contexto de datos.
Para crear un contexto de datos, seleccione el icono más (+). Acepte el valor predeterminado o especifique una nueva clase para Identity.
Para crear una nueva clase de usuario, seleccione el icono más (+) para Clase user y especifique la clase (por ejemplo,
ContosoUserpara una empresa denominada "Contoso").
Seleccione Agregar para ejecutar el scaffolder.
Actualice la clase de Startup con un código similar al siguiente:
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
services.AddControllersWithViews();
services.AddRazorPages();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseDatabaseErrorPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
endpoints.MapRazorPages();
});
}
}
Se recomienda UseHsts, pero no es necesario. Para obtener más información, consulte Protocolo de seguridad de transporte estricto HTTP (HSTS).
El código de base de datos generado Identity requiere Entity Framework Core Migrations. Si una migración para generar el Identity esquema aún no se ha creado y aplicado a la base de datos, use los procedimientos siguientes para crear una migración y actualizar la base de datos.
Los Servicios conectados de Visual Studio se utilizan para agregar una migración EF Core y actualizar la base de datos.
En el Explorador de soluciones, haga doble clic en Servicios conectados.
En el área SQL Server Express LocalDB de Service Dependencies, seleccione More actions (... ) >Add migration.
Asigne a la migración un Nombre de migración, como
CreateIdentitySchema, que es un nombre que describe la migración.Espera a que se cargue el contexto de la base de datos en el campo Nombres de clase de DBContext. La acción puede tardar unos segundos.
Seleccione Finalizar para completar la actualización. Una vez finalizada la operación, seleccione Cerrar.
Seleccione Más acciones (...) >Actualizar base de datos.
Se abre el cuadro de diálogo Actualizar la base de datos con la última migración.
Espera a que se actualice el campo Nombres de clase DBContext y a que se carguen las migraciones anteriores. La acción puede tardar unos segundos.
Seleccione Finalizar para completar la actualización. Una vez finalizada la operación, seleccione Cerrar.
El comando update database ejecuta las migraciones del método Up que no se aplican en un archivo de código de migración creado por el generador de esqueletos. En este caso, el comando ejecuta el Up método en el archivo Migrations/{TIME STAMP}_{MIGRATION NAME}.cs , que crea las Identity tablas, restricciones e índices. El marcador {TIME STAMP} es una marca de tiempo, y el marcador {MIGRATION NAME} es el nombre de la migración.
Si el Identity esquema se crea pero no se aplica a la base de datos, solo tiene que ejecutar el comando para actualizar la base de datos:
En el Explorador de soluciones, haga doble clic en Servicios conectados.
En el área SQL Server Express LocalDB de Service Dependencies, seleccione More actions (... ) >Update database.
Se abre el cuadro de diálogo Actualizar la base de datos con la última migración.
Espera a que se actualice el campo Nombres de clase DBContext y a que se carguen las migraciones anteriores. La acción puede tardar unos segundos.
Seleccione Finalizar para completar la actualización. Una vez finalizada la operación, seleccione Cerrar.
Puede confirmar la aplicación de un esquema Identity con el siguiente comando. La salida del comando incluye una columna "applied" para mostrar qué migraciones se aplican a la base de datos.
En el Visual Studio Administrador de paquetes Console, ejecute el comando Get-Migration:
Get-Migration
Si existe más de un contexto de base de datos, especifique el contexto con el parámetro -Context.
Scaffolding de Identity en un proyecto de Razor sin autorización existente
Ejecuta el generador de Identity siguiendo estos pasos.
En Explorador de soluciones, haga clic con el botón derecho en el proyecto y seleccione Agregar>Nuevo elemento con scaffolding.
En el panel izquierdo del cuadro de diálogo Añadir nuevo elemento generado automáticamente, selecciona Identity.
En el panel central, seleccione Identityy, a continuación, seleccione Agregar.
En el cuadro de diálogo Agregar Identity , seleccione las opciones que desee:
Si ya tiene una página de diseño personalizada de Identity (_Layout.cshtml), seleccione la página existente para evitar que el scaffolder sobrescriba su diseño con un marcado incorrecto. Por ejemplo, seleccione:
- Pages/Shared/_Layout.cshtml para Razor páginas o Blazor Server proyectos con una infraestructura de Razor páginas ya existente.
- Views/Shared/_Layout.cshtml para proyectos de MVC o proyectos con infraestructura de MVC existente Blazor Server.
Seleccione el icono más (+) y agregue la clase de contexto de base de datos DbContext. Debe seleccionar al menos un archivo para añadir su contexto de datos.
Para crear un contexto de datos, seleccione el icono más (+). Acepte el valor predeterminado o especifique una nueva clase para Identity.
Para crear una nueva clase de usuario, seleccione el icono más (+) para Clase user y especifique la clase (por ejemplo,
ContosoUserpara una empresa denominada "Contoso").
Seleccione Agregar para ejecutar el scaffolder.
Identity está configurado en Areas/Identity/IdentityHostingStartup.cs. Para obtener más información, vea IHostingStartup.
Migraciones, UseAuthentication y diseño
El código de base de datos generado Identity requiere Entity Framework Core Migrations. Si una migración para generar el Identity esquema aún no se ha creado y aplicado a la base de datos, use los procedimientos siguientes para crear una migración y actualizar la base de datos.
Los Servicios conectados de Visual Studio se utilizan para agregar una migración EF Core y actualizar la base de datos.
En el Explorador de soluciones, haga doble clic en Servicios conectados.
En el área SQL Server Express LocalDB de Service Dependencies, seleccione More actions (... ) >Add migration.
Asigne a la migración un Nombre de migración, como
CreateIdentitySchema, que es un nombre que describe la migración.Espera a que se cargue el contexto de la base de datos en el campo Nombres de clase de DBContext. La acción puede tardar unos segundos.
Seleccione Finalizar para completar la actualización. Una vez finalizada la operación, seleccione Cerrar.
Seleccione Más acciones (...) >Actualizar base de datos.
Se abre el cuadro de diálogo Actualizar la base de datos con la última migración.
Espera a que se actualice el campo Nombres de clase DBContext y a que se carguen las migraciones anteriores. La acción puede tardar unos segundos.
Seleccione Finalizar para completar la actualización. Una vez finalizada la operación, seleccione Cerrar.
El comando update database ejecuta las migraciones del método Up que no se aplican en un archivo de código de migración creado por el generador de esqueletos. En este caso, el comando ejecuta el Up método en el archivo Migrations/{TIME STAMP}_{MIGRATION NAME}.cs , que crea las Identity tablas, restricciones e índices. El marcador {TIME STAMP} es una marca de tiempo, y el marcador {MIGRATION NAME} es el nombre de la migración.
Si el Identity esquema se crea pero no se aplica a la base de datos, solo tiene que ejecutar el comando para actualizar la base de datos:
En el Explorador de soluciones, haga doble clic en Servicios conectados.
En el área SQL Server Express LocalDB de Service Dependencies, seleccione More actions (... ) >Update database.
Se abre el cuadro de diálogo Actualizar la base de datos con la última migración.
Espera a que se actualice el campo Nombres de clase DBContext y a que se carguen las migraciones anteriores. La acción puede tardar unos segundos.
Seleccione Finalizar para completar la actualización. Una vez finalizada la operación, seleccione Cerrar.
Puede confirmar la aplicación de un esquema Identity con el siguiente comando. La salida del comando incluye una columna "applied" para mostrar qué migraciones se aplican a la base de datos.
En el Visual Studio Administrador de paquetes Console, ejecute el comando Get-Migration:
Get-Migration
Si existe más de un contexto de base de datos, especifique el contexto con el parámetro -Context.
Enable authentication (Habilitar autenticación)
Actualice la clase de Startup con un código similar al siguiente:
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
services.AddRazorPages();
}
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();
});
}
}
Se recomienda UseHsts, pero no es necesario. Para obtener más información, consulte Protocolo de seguridad de transporte estricto HTTP (HSTS).
Cambios de diseño
Opcional: agregue el inicio de sesión parcial (_LoginPartial) al archivo de diseño:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>@ViewData["Title"] - WebRP</title>
<link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.css" />
<link rel="stylesheet" href="~/css/site.css" />
</head>
<body>
<header>
<nav class="navbar navbar-expand-sm navbar-toggleable-sm navbar-light bg-white border-bottom box-shadow mb-3">
<div class="container">
<a class="navbar-brand" asp-area="" asp-page="/Index">WebRP</a>
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target=".navbar-collapse" aria-controls="navbarSupportedContent"
aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="navbar-collapse collapse d-sm-inline-flex flex-sm-row-reverse">
<partial name="_LoginPartial" />
<ul class="navbar-nav flex-grow-1">
<li class="nav-item">
<a class="nav-link text-dark" asp-area="" asp-page="/Index">Home</a>
</li>
<li class="nav-item">
<a class="nav-link text-dark" asp-area="" asp-page="/Privacy">Privacy</a>
</li>
</ul>
</div>
</div>
</nav>
</header>
<div class="container">
<main role="main" class="pb-3">
@RenderBody()
</main>
</div>
<footer class="border-top footer text-muted">
<div class="container">
© 2019 - WebRP - <a asp-area="" asp-page="/Privacy">Privacy</a>
</div>
</footer>
<script src="~/lib/jquery/dist/jquery.js"></script>
<script src="~/lib/bootstrap/dist/js/bootstrap.bundle.js"></script>
<script src="~/js/site.js" asp-append-version="true"></script>
@RenderSection("Scripts", required: false)
</body>
</html>
Integrar Identity en un proyecto Razor con autorización
Ejecuta el generador de Identity siguiendo estos pasos.
En Explorador de soluciones, haga clic con el botón derecho en el proyecto y seleccione Agregar>Nuevo elemento con scaffolding.
En el panel izquierdo del cuadro de diálogo Añadir nuevo elemento generado automáticamente, selecciona Identity.
En el panel central, seleccione Identityy, a continuación, seleccione Agregar.
En el cuadro de diálogo Agregar Identity , seleccione las opciones que desee:
Si ya tiene una página de diseño personalizada de Identity (_Layout.cshtml), seleccione la página existente para evitar que el scaffolder sobrescriba su diseño con un marcado incorrecto. Por ejemplo, seleccione:
- Pages/Shared/_Layout.cshtml para Razor páginas o Blazor Server proyectos con una infraestructura de Razor páginas ya existente.
- Views/Shared/_Layout.cshtml para proyectos de MVC o proyectos con infraestructura de MVC existente Blazor Server.
Seleccione el icono más (+) y agregue la clase de contexto de base de datos DbContext. Debe seleccionar al menos un archivo para añadir su contexto de datos.
Para crear un contexto de datos, seleccione el icono más (+). Acepte el valor predeterminado o especifique una clase (por ejemplo,
Contoso.Data.ApplicationDbContextpara una empresa denominada "Contoso").Para crear una nueva clase de usuario, seleccione el icono más (+) para Clase user y especifique la clase (por ejemplo,
ContosoUserpara una empresa denominada "Contoso").
Seleccione Agregar para ejecutar el scaffolder.
Algunas opciones de Identity están configuradas en Areas/Identity/IdentityHostingStartup.cs. Para obtener más información, vea IHostingStartup.
Scaffolding de Identity en un proyecto de MVC sin autorización existente
Ejecuta el generador de Identity siguiendo estos pasos.
En Explorador de soluciones, haga clic con el botón derecho en el proyecto y seleccione Agregar>Nuevo elemento con scaffolding.
En el panel izquierdo del cuadro de diálogo Añadir nuevo elemento generado automáticamente, selecciona Identity.
En el panel central, seleccione Identityy, a continuación, seleccione Agregar.
En el cuadro de diálogo Agregar Identity , seleccione las opciones que desee:
Si ya tiene una página de diseño personalizada de Identity (_Layout.cshtml), seleccione la página existente para evitar que el scaffolder sobrescriba su diseño con un marcado incorrecto. Por ejemplo, seleccione:
- Pages/Shared/_Layout.cshtml para Razor páginas o Blazor Server proyectos con una infraestructura de Razor páginas ya existente.
- Views/Shared/_Layout.cshtml para proyectos de MVC o proyectos con infraestructura de MVC existente Blazor Server.
Seleccione el icono más (+) y agregue la clase de contexto de base de datos DbContext. Debe seleccionar al menos un archivo para añadir su contexto de datos.
Para crear un contexto de datos, seleccione el icono más (+). Acepte el valor predeterminado o especifique una nueva clase para Identity.
Para crear una nueva clase de usuario, seleccione el icono más (+) para Clase user y especifique la clase (por ejemplo,
ContosoUserpara una empresa denominada "Contoso").
Seleccione Agregar para ejecutar el scaffolder.
Opcional: agregue el inicio de sesión parcial (_LoginPartial) al archivo de Views/Shared/_Layout.cshtml:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>@ViewData["Title"] - WebRP</title>
<link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.css" />
<link rel="stylesheet" href="~/css/site.css" />
</head>
<body>
<header>
<nav class="navbar navbar-expand-sm navbar-toggleable-sm navbar-light bg-white border-bottom box-shadow mb-3">
<div class="container">
<a class="navbar-brand" asp-area="" asp-page="/Index">WebRP</a>
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target=".navbar-collapse" aria-controls="navbarSupportedContent"
aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="navbar-collapse collapse d-sm-inline-flex flex-sm-row-reverse">
<partial name="_LoginPartial" />
<ul class="navbar-nav flex-grow-1">
<li class="nav-item">
<a class="nav-link text-dark" asp-area="" asp-page="/Index">Home</a>
</li>
<li class="nav-item">
<a class="nav-link text-dark" asp-area="" asp-page="/Privacy">Privacy</a>
</li>
</ul>
</div>
</div>
</nav>
</header>
<div class="container">
<main role="main" class="pb-3">
@RenderBody()
</main>
</div>
<footer class="border-top footer text-muted">
<div class="container">
© 2019 - WebRP - <a asp-area="" asp-page="/Privacy">Privacy</a>
</div>
</footer>
<script src="~/lib/jquery/dist/jquery.js"></script>
<script src="~/lib/bootstrap/dist/js/bootstrap.bundle.js"></script>
<script src="~/js/site.js" asp-append-version="true"></script>
@RenderSection("Scripts", required: false)
</body>
</html>
Mueva el archivo Pages/Shared/_LoginPartial.cshtml a Views/Shared/_LoginPartial.cshtml.
Identity está configurado en Areas/Identity/IdentityHostingStartup.cs. Para obtener más información, vea IHostingStartup.
El código de base de datos generado Identity requiere Entity Framework Core Migrations. Si una migración para generar el Identity esquema aún no se ha creado y aplicado a la base de datos, use los procedimientos siguientes para crear una migración y actualizar la base de datos.
Los Servicios conectados de Visual Studio se utilizan para agregar una migración EF Core y actualizar la base de datos.
En el Explorador de soluciones, haga doble clic en Servicios conectados.
En el área SQL Server Express LocalDB de Service Dependencies, seleccione More actions (... ) >Add migration.
Asigne a la migración un Nombre de migración, como
CreateIdentitySchema, que es un nombre que describe la migración.Espera a que se cargue el contexto de la base de datos en el campo Nombres de clase de DBContext. La acción puede tardar unos segundos.
Seleccione Finalizar para completar la actualización. Una vez finalizada la operación, seleccione Cerrar.
Seleccione Más acciones (...) >Actualizar base de datos.
Se abre el cuadro de diálogo Actualizar la base de datos con la última migración.
Espera a que se actualice el campo Nombres de clase DBContext y a que se carguen las migraciones anteriores. La acción puede tardar unos segundos.
Seleccione Finalizar para completar la actualización. Una vez finalizada la operación, seleccione Cerrar.
El comando update database ejecuta las migraciones del método Up que no se aplican en un archivo de código de migración creado por el generador de esqueletos. En este caso, el comando ejecuta el Up método en el archivo Migrations/{TIME STAMP}_{MIGRATION NAME}.cs , que crea las Identity tablas, restricciones e índices. El marcador {TIME STAMP} es una marca de tiempo, y el marcador {MIGRATION NAME} es el nombre de la migración.
Si el Identity esquema se crea pero no se aplica a la base de datos, solo tiene que ejecutar el comando para actualizar la base de datos:
En el Explorador de soluciones, haga doble clic en Servicios conectados.
En el área SQL Server Express LocalDB de Service Dependencies, seleccione More actions (... ) >Update database.
Se abre el cuadro de diálogo Actualizar la base de datos con la última migración.
Espera a que se actualice el campo Nombres de clase DBContext y a que se carguen las migraciones anteriores. La acción puede tardar unos segundos.
Seleccione Finalizar para completar la actualización. Una vez finalizada la operación, seleccione Cerrar.
Puede confirmar la aplicación de un esquema Identity con el siguiente comando. La salida del comando incluye una columna "applied" para mostrar qué migraciones se aplican a la base de datos.
En el Visual Studio Administrador de paquetes Console, ejecute el comando Get-Migration:
Get-Migration
Si existe más de un contexto de base de datos, especifique el contexto con el parámetro -Context.
Actualice la clase de Startup con un código similar al siguiente:
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
services.AddControllersWithViews();
services.AddRazorPages();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseDatabaseErrorPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
endpoints.MapRazorPages();
});
}
}
Se recomienda UseHsts, pero no es necesario. Para obtener más información, consulte Protocolo de seguridad de transporte estricto HTTP (HSTS).
Scaffolding de Identity en un proyecto de MVC con autorización
Ejecuta el generador de Identity siguiendo estos pasos.
En Explorador de soluciones, haga clic con el botón derecho en el proyecto y seleccione Agregar>Nuevo elemento con scaffolding.
En el panel izquierdo del cuadro de diálogo Añadir nuevo elemento generado automáticamente, selecciona Identity.
En el panel central, seleccione Identityy, a continuación, seleccione Agregar.
En el cuadro de diálogo Agregar Identity , seleccione las opciones que desee:
Si ya tiene una página de diseño personalizada de Identity (_Layout.cshtml), seleccione la página existente para evitar que el scaffolder sobrescriba su diseño con un marcado incorrecto. Por ejemplo, seleccione:
- Pages/Shared/_Layout.cshtml para Razor páginas o Blazor Server proyectos con una infraestructura de Razor páginas ya existente.
- Views/Shared/_Layout.cshtml para proyectos de MVC o proyectos con infraestructura de MVC existente Blazor Server.
Seleccione el icono más (+) y agregue la clase de contexto de base de datos DbContext. Debe seleccionar al menos un archivo para añadir su contexto de datos.
Para crear un contexto de datos, seleccione el icono más (+). Acepte el valor predeterminado o especifique una clase (por ejemplo,
Contoso.Data.ApplicationDbContextpara una empresa denominada "Contoso").Para crear una nueva clase de usuario, seleccione el icono más (+) para Clase user y especifique la clase (por ejemplo,
ContosoUserpara una empresa denominada "Contoso").
Seleccione Agregar para ejecutar el scaffolder.
Aplicar scaffolding Identity en una aplicación de Blazor sin autorización existente
Ejecuta el generador de Identity siguiendo estos pasos.
En Explorador de soluciones, haga clic con el botón derecho en el proyecto y seleccione Agregar>Nuevo elemento con scaffolding.
En el panel izquierdo del cuadro de diálogo Añadir nuevo elemento generado automáticamente, selecciona Identity.
En el panel central, seleccione Identityy, a continuación, seleccione Agregar.
En el cuadro de diálogo Agregar Identity , seleccione las opciones que desee:
Si ya tiene una página de diseño personalizada de Identity (_Layout.cshtml), seleccione la página existente para evitar que el scaffolder sobrescriba su diseño con un marcado incorrecto. Por ejemplo, seleccione:
- Pages/Shared/_Layout.cshtml para Razor páginas o Blazor Server proyectos con una infraestructura de Razor páginas ya existente.
- Views/Shared/_Layout.cshtml para proyectos de MVC o proyectos con infraestructura de MVC existente Blazor Server.
Seleccione el icono más (+) y agregue la clase de contexto de base de datos DbContext. Debe seleccionar al menos un archivo para añadir su contexto de datos.
Para crear un contexto de datos, seleccione el icono más (+). Acepte el valor predeterminado o especifique una nueva clase para Identity.
Para crear una nueva clase de usuario, seleccione el icono más (+) para Clase user y especifique la clase (por ejemplo,
ContosoUserpara una empresa denominada "Contoso").
Seleccione Agregar para ejecutar el scaffolder.
Identity está configurado en Areas/Identity/IdentityHostingStartup.cs. Para obtener más información, vea IHostingStartup.
Migraciones
El código de base de datos generado Identity requiere Entity Framework Core Migrations. Si una migración para generar el Identity esquema aún no se ha creado y aplicado a la base de datos, use los procedimientos siguientes para crear una migración y actualizar la base de datos.
Los Servicios conectados de Visual Studio se utilizan para agregar una migración EF Core y actualizar la base de datos.
En el Explorador de soluciones, haga doble clic en Servicios conectados.
En el área SQL Server Express LocalDB de Service Dependencies, seleccione More actions (... ) >Add migration.
Asigne a la migración un Nombre de migración, como
CreateIdentitySchema, que es un nombre que describe la migración.Espera a que se cargue el contexto de la base de datos en el campo Nombres de clase de DBContext. La acción puede tardar unos segundos.
Seleccione Finalizar para completar la actualización. Una vez finalizada la operación, seleccione Cerrar.
Seleccione Más acciones (...) >Actualizar base de datos.
Se abre el cuadro de diálogo Actualizar la base de datos con la última migración.
Espera a que se actualice el campo Nombres de clase DBContext y a que se carguen las migraciones anteriores. La acción puede tardar unos segundos.
Seleccione Finalizar para completar la actualización. Una vez finalizada la operación, seleccione Cerrar.
El comando update database ejecuta las migraciones del método Up que no se aplican en un archivo de código de migración creado por el generador de esqueletos. En este caso, el comando ejecuta el Up método en el archivo Migrations/{TIME STAMP}_{MIGRATION NAME}.cs , que crea las Identity tablas, restricciones e índices. El marcador {TIME STAMP} es una marca de tiempo, y el marcador {MIGRATION NAME} es el nombre de la migración.
Si el Identity esquema se crea pero no se aplica a la base de datos, solo tiene que ejecutar el comando para actualizar la base de datos:
En el Explorador de soluciones, haga doble clic en Servicios conectados.
En el área SQL Server Express LocalDB de Service Dependencies, seleccione More actions (... ) >Update database.
Se abre el cuadro de diálogo Actualizar la base de datos con la última migración.
Espera a que se actualice el campo Nombres de clase DBContext y a que se carguen las migraciones anteriores. La acción puede tardar unos segundos.
Seleccione Finalizar para completar la actualización. Una vez finalizada la operación, seleccione Cerrar.
Puede confirmar la aplicación de un esquema Identity con el siguiente comando. La salida del comando incluye una columna "applied" para mostrar qué migraciones se aplican a la base de datos.
En el Visual Studio Administrador de paquetes Console, ejecute el comando Get-Migration:
Get-Migration
Si existe más de un contexto de base de datos, especifique el contexto con el parámetro -Context.
Puntos de conexión de autenticación de estilo
Debido a que las aplicaciones Blazor del lado del servidor usan páginas de Razor Pages Identity, el estilo de la interfaz de usuario cambia cuando un visitante navega entre páginas Identity y componentes. Tiene dos opciones para abordar los estilos incongruentes:
- Componentes personalizados Identity
- Usa un diseño personalizado con los estilos de aplicación de Blazor
Componentes de Identity personalizados
Un enfoque para usar componentes para Identity en lugar de páginas consiste en compilar componentes de Identity. Dado que SignInManager y UserManager no son compatibles en componentes de Razor, use puntos de conexión de la API web en la aplicación de Blazor para procesar las acciones de la cuenta de usuario.
Usa un diseño personalizado con Blazor estilos de la aplicación
El diseño y los estilos de las páginas de Identity pueden modificarse para producir páginas que usen estilos similares al tema predeterminado de Blazor. Este enfoque no está cubierto por la documentación.
Aplicar scaffolding Identity en una aplicación de Blazor del lado del servidor con autorización
Ejecuta el generador de Identity siguiendo estos pasos.
En Explorador de soluciones, haga clic con el botón derecho en el proyecto y seleccione Agregar>Nuevo elemento con scaffolding.
En el panel izquierdo del cuadro de diálogo Añadir nuevo elemento generado automáticamente, selecciona Identity.
En el panel central, seleccione Identityy, a continuación, seleccione Agregar.
En el cuadro de diálogo Agregar Identity , seleccione las opciones que desee:
Si ya tiene una página de diseño personalizada de Identity (_Layout.cshtml), seleccione la página existente para evitar que el scaffolder sobrescriba su diseño con un marcado incorrecto. Por ejemplo, seleccione:
- Pages/Shared/_Layout.cshtml para Razor páginas o Blazor Server proyectos con una infraestructura de Razor páginas ya existente.
- Views/Shared/_Layout.cshtml para proyectos de MVC o proyectos con infraestructura de MVC existente Blazor Server.
Seleccione el icono más (+) y agregue la clase de contexto de base de datos DbContext. Debe seleccionar al menos un archivo para añadir su contexto de datos.
Para crear un contexto de datos, seleccione el icono más (+). Acepte el valor predeterminado o especifique una clase (por ejemplo,
Contoso.Data.ApplicationDbContextpara una empresa denominada "Contoso").Para crear una nueva clase de usuario, seleccione el icono más (+) para Clase user y especifique la clase (por ejemplo,
ContosoUserpara una empresa denominada "Contoso").
Seleccione Agregar para ejecutar el scaffolder.
Algunas opciones de Identity están configuradas en Areas/Identity/IdentityHostingStartup.cs. Para obtener más información, vea IHostingStartup.
Aplicaciones cliente Blazor
Las aplicaciones de Blazor del lado del cliente usan sus propios métodos de interfaz de usuario de Identity y no pueden usar el scaffolding de Identity de ASP.NET Core. Las aplicaciones de ASP.NET Core del lado del servidor de soluciones de Blazor hospedadas pueden seguir las instrucciones de Razor Pages/MVC de este artículo y se configuran igual que cualquier otro tipo de aplicación de ASP.NET Core compatible con Identity.
El marco de trabajo de Blazor no incluye Razor versiones de componentes de páginas de interfaz de usuario de Identity. Los componentes de la IdentityIURazor pueden desarrollarse a medida u obtenerse de fuentes externas no compatibles.
Para más información, consulte los Blazor artículos de Seguridad y Identity.
Crear el código fuente completo de la interfaz de usuario Identity
Para mantener el control total de la interfaz de usuario de Identity, ejecute el proveedor de scaffolding de Identity y seleccione Invalidar todos los archivos.
El siguiente código resaltado muestra los cambios para reemplazar la interfaz de usuario de Identity predeterminada por Identity en una aplicación web de ASP.NET Core 2.1. Es posible que quiera hacer esto para tener un control total de la interfaz de usuario de Identity.
public void ConfigureServices(IServiceCollection services)
{
services.Configure<CookiePolicyOptions>(options =>
{
options.CheckConsentNeeded = context => true;
options.MinimumSameSitePolicy = SameSiteMode.None;
});
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(
Configuration.GetConnectionString("DefaultConnection")));
services.AddIdentity<IdentityUser, IdentityRole>()
// services.AddDefaultIdentity<IdentityUser>()
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();
services.AddMvc()
.AddRazorPagesOptions(options =>
{
options.Conventions.AuthorizeAreaFolder("Identity", "/Account/Manage");
options.Conventions.AuthorizeAreaPage("Identity", "/Account/Logout");
});
services.ConfigureApplicationCookie(options =>
{
options.LoginPath = $"/Identity/Account/Login";
options.LogoutPath = $"/Identity/Account/Logout";
options.AccessDeniedPath = $"/Identity/Account/AccessDenied";
});
// using Microsoft.AspNetCore.Identity.UI.Services;
services.AddSingleton<IEmailSender, EmailSender>();
}
El valor predeterminado Identity se reemplaza en el código siguiente:
services.AddIdentity<IdentityUser, IdentityRole>()
// services.AddDefaultIdentity<IdentityUser>()
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();
El siguiente código establece LoginPath, LogoutPath y AccessDeniedPath):
services.ConfigureApplicationCookie(options =>
{
options.LoginPath = $"/Identity/Account/Login";
options.LogoutPath = $"/Identity/Account/Logout";
options.AccessDeniedPath = $"/Identity/Account/AccessDenied";
});
Registre una implementación de IEmailSender, por ejemplo:
// using Microsoft.AspNetCore.Identity.UI.Services;
services.AddSingleton<IEmailSender, EmailSender>();
public class EmailSender : IEmailSender
{
public Task SendEmailAsync(string email, string subject, string message)
{
return Task.CompletedTask;
}
}
Configuración de la contraseña
Si PasswordOptions están configurados en Startup.ConfigureServices, es posible que se requiera la configuración del [StringLength]attribute para la propiedad Password en las páginas Identity generadas automáticamente.
InputModel
Password propiedades se encuentran en los siguientes archivos:
Areas/Identity/Pages/Account/Register.cshtml.csAreas/Identity/Pages/Account/ResetPassword.cshtml.cs
Deshabilitar una página
En esta sección se muestra cómo deshabilitar la página de registro, pero el enfoque se puede usar para deshabilitar cualquier página.
Para deshabilitar el registro de usuarios:
Aplique scaffolding a Identity. Incluya Account.Register, Account.Login y Account.RegisterConfirmation. Por ejemplo:
dotnet aspnet-codegenerator identity -dc RPauth.Data.ApplicationDbContext --files "Account.Register;Account.Login;Account.RegisterConfirmation"Actualice
Areas/Identity/Pages/Account/Register.cshtml.cspara que los usuarios no puedan registrarse desde este punto de conexión:public class RegisterModel : PageModel { public IActionResult OnGet() { return RedirectToPage("Login"); } public IActionResult OnPost() { return RedirectToPage("Login"); } }Actualice
Areas/Identity/Pages/Account/Register.cshtmlpara ser coherente con los cambios anteriores:@page @model RegisterModel @{ ViewData["Title"] = "Go to Login"; } <h1>@ViewData["Title"]</h1> <li class="nav-item"> <a class="nav-link text-dark" asp-area="Identity" asp-page="/Account/Login">Login</a> </li>Comente o elimine el vínculo de registro de
Areas/Identity/Pages/Account/Login.cshtml@* <p> <a asp-page="./Register" asp-route-returnUrl="@Model.ReturnUrl">Register as a new user</a> </p> *@Actualice la página
Areas/Identity/Pages/Account/RegisterConfirmation.- Quite el código y los vínculos del archivo cshtml.
- Quite el código de confirmación de
PageModel:
[AllowAnonymous] public class RegisterConfirmationModel : PageModel { public IActionResult OnGet() { return Page(); } }
Uso de otra aplicación para agregar usuarios
Proporcione un mecanismo para agregar usuarios fuera de la aplicación web. Entre las opciones para agregar usuarios se incluyen:
- Una aplicación web de administración dedicada.
- Una aplicación de consola.
En el código siguiente se describe un enfoque para agregar usuarios:
- Una lista de usuarios se lee en la memoria.
- Se genera una contraseña única segura para cada usuario.
- El usuario se agrega a la base de datos de Identity.
- Se notifica al usuario y se le indica que cambie la contraseña.
public class Program
{
public static void Main(string[] args)
{
var host = CreateHostBuilder(args).Build();
using (var scope = host.Services.CreateScope())
{
var services = scope.ServiceProvider;
try
{
var context = services.GetRequiredService<AppDbCntx>();
context.Database.Migrate();
var config = host.Services.GetRequiredService<IConfiguration>();
var userList = config.GetSection("userList").Get<List<string>>();
SeedData.Initialize(services, userList).Wait();
}
catch (Exception ex)
{
var logger = services.GetRequiredService<ILogger<Program>>();
logger.LogError(ex, "An error occurred adding users.");
}
}
host.Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
}
En el código siguiente se describe cómo agregar un usuario:
public static async Task Initialize(IServiceProvider serviceProvider,
List<string> userList)
{
var userManager = serviceProvider.GetService<UserManager<IdentityUser>>();
foreach (var userName in userList)
{
var userPassword = GenerateSecurePassword();
var userId = await EnsureUser(userManager, userName, userPassword);
NotifyUser(userName, userPassword);
}
}
private static async Task<string> EnsureUser(UserManager<IdentityUser> userManager,
string userName, string userPassword)
{
var user = await userManager.FindByNameAsync(userName);
if (user == null)
{
user = new IdentityUser(userName)
{
EmailConfirmed = true
};
await userManager.CreateAsync(user, userPassword);
}
return user.Id;
}
Se puede seguir un enfoque similar para escenarios de producción.
Impedir la publicación de recursos estáticos Identity
Para evitar la publicación de recursos estáticos de Identity en la raíz de la web, consulte Introducción a Identity en ASP.NET Core.
Recursos adicionales
Cambios en el código de autenticación en ASP.NET Core 2.1 o posterior