Tienda MiCholo utiliza ASP.NET Core Identity para gestionar por completo la autenticación y autorización de sus usuarios. El sistema emplea autenticación basada en cookies, dos roles predefinidos (Documentation Index
Fetch the complete documentation index at: https://mintlify.com/interezante456-pixel/proyecto-dise-o/llms.txt
Use this file to discover all available pages before exploring further.
Admin y Vendedor) y está completamente integrado con EF Core a través de AppDbContext. No existe ningún proveedor de identidad externo: todas las credenciales se almacenan en la base de datos DB_TIENDA_MICHOLO.
Flujo de autenticación
Acceso a una ruta protegida
Cuando un usuario no autenticado intenta visitar cualquier ruta decorada con
[Authorize] (por ejemplo, /Producto/Listar), el middleware de autenticación detecta que no hay una cookie de sesión válida y redirige automáticamente a /Account/Login, la ruta configurada como LoginPath.POST /Account/Login — validación de credenciales
El controlador recibe el
LoginViewModel del formulario y llama a SignInManager.PasswordSignInAsync. Este método verifica el hash de la contraseña almacenado en AspNetUsers y, si es correcto, emite la cookie de autenticación.Controllers/AccountController.cs
Inicio de sesión exitoso — redirección
Si
result.Succeeded es true, la cookie de sesión queda establecida en el navegador y el usuario es redirigido a /Producto/Listar, la página principal de la aplicación.Controllers/AccountController.cs
Inicio de sesión fallido — mensaje de error
Si las credenciales son incorrectas, se agrega un error al
ModelState y la vista de login se vuelve a renderizar con el mensaje de error visible para el usuario.Controllers/AccountController.cs
POST /Account/Logout — cierre de sesión
Al hacer clic en “Cerrar sesión”, el navegador envía una petición
POST a /Account/Logout. El controlador llama a SignInManager.SignOutAsync(), que invalida e elimina la cookie de autenticación. Tras esto, el usuario es redirigido a /Producto/Listar, que a su vez lo enviará de vuelta al login al no estar autenticado.Controllers/AccountController.cs
Configuración de cookies
Las rutas de redirección para autenticación y acceso denegado se configuran enProgram.cs mediante ConfigureApplicationCookie:
Program.cs
| Opción | Valor | Efecto |
|---|---|---|
LoginPath | /Account/Login | Destino de la redirección cuando se requiere autenticación |
AccessDeniedPath | /Account/AccessDenied | Destino cuando el usuario está autenticado pero carece del rol necesario |
Identity con EF Core
AppDbContext extiende IdentityDbContext<IdentityUser>, lo que vincula el sistema de identidad directamente con la base de datos de la tienda. No se requiere una base de datos separada para los usuarios:
Data/AppDbContext.cs
Program.cs:
Program.cs
AddEntityFrameworkStores<AppDbContext>() indica a Identity que debe usar AppDbContext para persistir todas sus entidades (usuarios, roles, claims, tokens) en las tablas AspNet* dentro de DB_TIENDA_MICHOLO.
Middleware de autenticación
El orden en que se registran los middlewares enProgram.cs es estrictamente obligatorio:
Program.cs
UseAuthentication()
Inspecciona la petición entrante en busca de la cookie de sesión, deserializa el
ClaimsPrincipal y lo asigna a HttpContext.User. Sin este paso, HttpContext.User siempre aparece como anónimo.UseAuthorization()
Evalúa los atributos
[Authorize] del controlador o la acción usando la identidad ya establecida en HttpContext.User. Si se ejecuta antes de UseAuthentication, el usuario siempre aparece como no autenticado y todos los recursos protegidos denegarían el acceso.Invertir el orden de estos dos middlewares provocaría que ningún usuario pueda iniciar sesión correctamente, ya que la autorización se evaluaría antes de que la identidad estuviera disponible en el contexto de la petición.
LoginViewModel
El formulario de inicio de sesión está vinculado al siguiente ViewModel, definido enViewModels/LoginViewModel.cs:
ViewModels/LoginViewModel.cs
| Campo | Tipo | Validación | Descripción |
|---|---|---|---|
Email | string | [Required], [EmailAddress] | Identificador único del usuario; se usa como userName en PasswordSignInAsync |
Password | string | [Required], [DataType(Password)] | Contraseña en texto plano; Identity la compara contra el hash almacenado |
RememberMe | bool | Ninguna | Si es true, se pasa como isPersistent: true a PasswordSignInAsync, generando una cookie persistente |
Política de contraseñas
Para facilitar las pruebas durante el desarrollo, la configuración de Identity enProgram.cs relaja los requisitos estándar de contraseña:
Program.cs
| Opción | Valor configurado | Comportamiento |
|---|---|---|
RequireDigit | false | No se exige ningún dígito numérico en la contraseña |
RequireLowercase | false | No se exige ninguna letra minúscula |
RequireNonAlphanumeric | false | No se exige ningún carácter especial (!, @, #, etc.) |
RequireUppercase | false | No se exige ninguna letra mayúscula |
RequiredLength | 6 | La contraseña debe tener al menos 6 caracteres |
SeedData pueden usar contraseñas simples como admin123 y Vendedor123.
Roles y usuarios predeterminados
SeedData.Initialize garantiza que los roles y cuentas de prueba existen desde el primer arranque de la aplicación:
| Usuario | Contraseña | Rol | Permisos |
|---|---|---|---|
admin@micholo.com | admin123 | Admin | Acceso total: productos, proveedores, ventas, usuarios, reportes |
vendedor@micholo.com | Vendedor123 | Vendedor | Acceso restringido: productos y ventas (sin gestión de proveedores ni usuarios) |