From f95af9873de9f49a0f448b4ab8effa47ee85c98d Mon Sep 17 00:00:00 2001 From: Leandrobftt <149838874+Leandrobftt@users.noreply.github.com> Date: Thu, 28 Nov 2024 22:07:36 -0300 Subject: [PATCH] =?UTF-8?q?Implementa=C3=A7=C3=A3o=20login?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/login/Controllers/HomeController.cs | 64 ++++++++++++++++--- src/login/Models/AppDbContext.cs | 3 +- src/login/Models/Usuario.cs | 43 +++++++++++++ src/login/Program.cs | 43 +++++++++++-- src/login/Views/Home/Index.cshtml | 8 --- src/login/Views/Login/Index.cshtml | 32 ++++++++++ .../Views/{Home => Login}/Privacy.cshtml | 0 7 files changed, 167 insertions(+), 26 deletions(-) create mode 100644 src/login/Models/Usuario.cs delete mode 100644 src/login/Views/Home/Index.cshtml create mode 100644 src/login/Views/Login/Index.cshtml rename src/login/Views/{Home => Login}/Privacy.cshtml (100%) diff --git a/src/login/Controllers/HomeController.cs b/src/login/Controllers/HomeController.cs index 67bd4f3..494b6af 100644 --- a/src/login/Controllers/HomeController.cs +++ b/src/login/Controllers/HomeController.cs @@ -1,32 +1,78 @@ using Microsoft.AspNetCore.Mvc; using projeto_adotapet.Models; -using System.Diagnostics; +using Microsoft.EntityFrameworkCore; +using Microsoft.AspNetCore.Http; +using System.Threading.Tasks; namespace projeto_adotapet.Controllers { - public class HomeController : Controller + public class LoginController : Controller { - private readonly ILogger _logger; + private readonly AppDbContext _context; - public HomeController(ILogger logger) + public LoginController(AppDbContext context) { - _logger = logger; + _context = context; } + // Exibir página de login public IActionResult Index() { return View(); } - public IActionResult Privacy() + // Processar o login + [HttpPost] + public async Task Index(string nome, string senha) + { + var usuario = await _context.Usuarios + .FirstOrDefaultAsync(u => u.Nome == nome); + + if (usuario != null && usuario.VerificarSenha(senha)) + { + // Login bem-sucedido + HttpContext.Session.SetString("UserName", usuario.Nome); // Salvando nome na sessão + return RedirectToAction("Index", "Home"); // Redireciona para a página inicial após login + } + + // Caso falhe + ModelState.AddModelError("", "Nome de usuário ou senha inválidos."); + return View(); + } + + // Exibir página de registro + public IActionResult Register() { return View(); } - [ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)] - public IActionResult Error() + // Processar o registro de um novo usuário + [HttpPost] + public async Task Register(Usuario usuario, string ConfirmSenha) + { + if (ModelState.IsValid) + { + // Verificar se as senhas coincidem + if (usuario.Senha != ConfirmSenha) + { + ModelState.AddModelError("", "As senhas não coincidem."); + return View(usuario); + } + + // Criptografar a senha antes de salvar no banco + usuario.SetSenha(usuario.Senha); + _context.Usuarios.Add(usuario); + await _context.SaveChangesAsync(); + return RedirectToAction("Index"); // Redireciona para a página de login após o registro + } + return View(usuario); + } + + // Logout + public IActionResult Logout() { - return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier }); + HttpContext.Session.Remove("UserName"); // Remover o nome de usuário da sessão + return RedirectToAction("Index", "Login"); // Redireciona para a página de login } } } diff --git a/src/login/Models/AppDbContext.cs b/src/login/Models/AppDbContext.cs index ef58f68..640f04f 100644 --- a/src/login/Models/AppDbContext.cs +++ b/src/login/Models/AppDbContext.cs @@ -6,7 +6,6 @@ public class AppDbContext : DbContext { public AppDbContext(DbContextOptions options) : base(options) { } - public DbSet Veiculos { get; set; } - + public DbSet Usuarios { get; set; } } } diff --git a/src/login/Models/Usuario.cs b/src/login/Models/Usuario.cs new file mode 100644 index 0000000..f507e60 --- /dev/null +++ b/src/login/Models/Usuario.cs @@ -0,0 +1,43 @@ +// Importando o namespace do BCrypt.Net +using BCrypt.Net; + +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace projeto_adotapet.Models +{ + [Table("Usuarios")] + public class Usuario + { + [Key] + public int Id { get; set; } + + [Required(ErrorMessage = "Obrigatório informar o nome")] + public string Nome { get; set; } + + [Required(ErrorMessage = "Obrigatório informar a senha")] + [DataType(DataType.Password)] + public string Senha { get; set; } + + [Required(ErrorMessage = "Obrigatório informar o perfil")] + public Perfil Perfil { get; set; } + + // Método para criar hash da senha + public void SetSenha(string senha) + { + this.Senha = BCrypt.Net.BCrypt.HashPassword(senha); // Usando BCrypt para gerar o hash da senha + } + + // Método para verificar a senha fornecida + public bool VerificarSenha(string senha) + { + return BCrypt.Net.BCrypt.Verify(senha, this.Senha); // Verificando a senha com o hash + } + } + + public enum Perfil + { + Admin, + User + } +} diff --git a/src/login/Program.cs b/src/login/Program.cs index bd08f85..88f1ca4 100644 --- a/src/login/Program.cs +++ b/src/login/Program.cs @@ -1,23 +1,48 @@ using projeto_adotapet.Models; +using Microsoft.EntityFrameworkCore; +using Microsoft.AspNetCore.Builder; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.Hosting; +using System; var builder = WebApplication.CreateBuilder(args); -// Add services to the container. +// Adicionando os serviços ao container builder.Services.AddControllersWithViews(); builder.Services.AddRazorPages().AddRazorRuntimeCompilation(); +// Configuração do banco de dados (SQL Server) builder.Services.AddDbContext(options => -options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection"))); + options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection"))); + +// Configuração de Autenticação por Cookie +builder.Services.AddAuthentication("CookieAuth") + .AddCookie("CookieAuth", options => + { + options.LoginPath = "/Login/Index"; // Página de login + options.LogoutPath = "/Login/Logout"; // Página de logout + options.ExpireTimeSpan = TimeSpan.FromMinutes(60); // Tempo de expiração do cookie + options.SlidingExpiration = true; // Expiração deslizante do cookie + }); + +// Configuração de Sessões +builder.Services.AddDistributedMemoryCache(); +builder.Services.AddSession(options => +{ + options.IdleTimeout = TimeSpan.FromMinutes(30); // Tempo de expiração da sessão + options.Cookie.HttpOnly = true; // Segurança adicional para o cookie de sessão + options.Cookie.IsEssential = true; // O cookie é essencial para a aplicação funcionar +}); var app = builder.Build(); -// Configure the HTTP request pipeline. +// Configuração do pipeline de requisições HTTP if (!app.Environment.IsDevelopment()) { app.UseExceptionHandler("/Home/Error"); - // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts. - app.UseHsts(); + app.UseHsts(); // HSTS (HTTP Strict Transport Security) } app.UseHttpsRedirection(); @@ -25,10 +50,14 @@ app.UseRouting(); -app.UseAuthorization(); +// Ordem dos middlewares +app.UseSession(); // Coloque UseSession antes de UseAuthentication +app.UseAuthentication(); // Autenticação +app.UseAuthorization(); // Autorização +// Configuração das rotas app.MapControllerRoute( name: "default", - pattern: "{controller=Home}/{action=Index}/{id?}"); + pattern: "{controller=Login}/{action=Index}/{id?}"); // Alterado para LoginController app.Run(); diff --git a/src/login/Views/Home/Index.cshtml b/src/login/Views/Home/Index.cshtml deleted file mode 100644 index 925357f..0000000 --- a/src/login/Views/Home/Index.cshtml +++ /dev/null @@ -1,8 +0,0 @@ -@{ - ViewData["Title"] = "Home Page"; -} - -
-

Login

-

Learn about building Web apps with ASP.NET Core.

-
diff --git a/src/login/Views/Login/Index.cshtml b/src/login/Views/Login/Index.cshtml new file mode 100644 index 0000000..4af2c3e --- /dev/null +++ b/src/login/Views/Login/Index.cshtml @@ -0,0 +1,32 @@ +@{ + ViewData["Title"] = "Login"; +} + +

Login

+ + +@if (!ViewData.ModelState.IsValid) +{ +
+
    + @foreach (var error in ViewData.ModelState.Values.SelectMany(v => v.Errors)) + { +
  • @error.ErrorMessage
  • + } +
+
+} + +
+
+ + +
+
+ + +
+ +
+ +

Realizar Cadastro

diff --git a/src/login/Views/Home/Privacy.cshtml b/src/login/Views/Login/Privacy.cshtml similarity index 100% rename from src/login/Views/Home/Privacy.cshtml rename to src/login/Views/Login/Privacy.cshtml