Membuat Website kebanyakan pertama-tama kita dihadapkan dengan menu Login, Kita akan membahas tentang cara membuat Login User Sederhana.
Langkah - langkah yang harus dilakukan antara lain, ialah :1. Membuat Tabel User
/****** Object: Table [dbo].[Users] Script Date: 11/24/2024 9:04:45 ******/SET ANSI_NULLS ONGO
SET QUOTED_IDENTIFIER ONGO
CREATE TABLE [dbo].[Users]( [UserID] [int] IDENTITY(1,1) NOT NULL, [UserName] [nvarchar](50) NOT NULL, [Password] [nvarchar](255) NOT NULL, [RoleID] [int] NOT NULL, [CompanyName] [nvarchar](100) NULL, [Phone] [nvarchar](20) NULL, [FullName] [nvarchar](100) NULL, [EmailAddress] [nvarchar](100) NULL, [CreatedDate] [datetime] NOT NULL, [CreatedBy] [nvarchar](50) NULL, [UpdatedDate] [datetime] NULL, [UpdatedBy] [nvarchar](50) NULL,PRIMARY KEY CLUSTERED ( [UserID] ASC)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]) ON [PRIMARY]GO
using Microsoft.AspNetCore.Authorization;using Microsoft.AspNetCore.Identity;using Microsoft.AspNetCore.Mvc;using System.Threading.Tasks;using ALJEproject.Models; // Sesuaikan namespace berdasarkan struktur proyek Andausing ALJEproject.ViewModels; // Anggap Anda memiliki LoginViewModel untuk detail loginusing ALJEproject.Data;using Microsoft.Extensions.Logging;using System.Linq;using Microsoft.AspNetCore.Http;
namespace ALJEproject.Controllers{ public class AccountController : Controller { private readonly ILogger<AccountController> _logger; private readonly ALJEprojectDbContext _context; private readonly PasswordHasher<User> _passwordHasher;
// Konstruktor yang menggabungkan kedua dependensi public AccountController(ALJEprojectDbContext context, ILogger<AccountController> logger) { _context = context; _logger = logger; _passwordHasher = new PasswordHasher<User>(); }
[HttpGet] [AllowAnonymous] public IActionResult Login() { return View(); }
[HttpPost] [AllowAnonymous] [ValidateAntiForgeryToken] public IActionResult Login(LoginViewModel vm) { if (string.IsNullOrEmpty(vm.Username) || string.IsNullOrEmpty(vm.Password)) { ModelState.AddModelError("", "Username and password are required."); return View(); }
if (SignInMethod(vm.Username, vm.Password)) { // Set session untuk username dan role HttpContext.Session.SetString("Username", vm.Username);
// Misalkan Anda mendapatkan role dari database berdasarkan username var user = _context.UserRoles.SingleOrDefault(u => u.UserName == vm.Username); if (user != null) { HttpContext.Session.SetString("Role", user.RoleName); }
return RedirectToAction("Index", "Home"); }
ModelState.AddModelError("", "Invalid username or password."); return View("Login"); }
[HttpPost] [ValidateAntiForgeryToken] public IActionResult Logout() { HttpContext.Session.Clear(); // Menghapus semua data session return RedirectToAction("Login", "Account"); }
private bool SignInMethod(string username, string password) { var user = _context.Users.SingleOrDefault(u => u.UserName == username);
if (user == null) { return false; // User not found }
var result = _passwordHasher.VerifyHashedPassword(user, user.Password, password); return result == PasswordVerificationResult.Success; } }}
3. Buat ViewModels LoginViewModel
using System.ComponentModel.DataAnnotations;
namespace ALJEproject.ViewModels
{
public class LoginViewModel
{
[Required]
[Display(Name = "Username")]
public string Username { get; set; }
[Required]
[DataType(DataType.Password)]
[Display(Name = "Password")]
public string Password { get; set; }
[Display(Name = "Remember Me")]
public bool RememberMe { get; set; }
}
}
4. Buat Login.cshtml
@model ALJEproject.ViewModels.LoginViewModel@{ Layout = null;}
<html lang="en"><head> <meta charset="utf-8"></meta> <meta content="width=device-width, initial-scale=1.0" name="viewport"></meta> <title>Login</title> <style> body { background-color: #30abd5; height: 100vh; display: flex; justify-content: center; align-items: center; margin: 0; }
.login-card { background: #fff; border-radius: 10px; box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2); max-width: 400px; width: 100%; padding: 2rem; }
.login-card .card-header { background-color: #30abd5; color: white; text-align: center; border-top-left-radius: 10px; border-top-right-radius: 10px; padding: 1rem; }
.btn-primary { background-color: #30abd5; border-color: #30abd5; }
.btn-primary:hover { background-color: #259bb3; border-color: #259bb3; } </style></head><body> <div class="login-card"> <div class="card-header"> <h3 class="card-title mb-0">Login</h3> </div> <div class="card-body"> <form asp-action="Login" method="post"> @Html.AntiForgeryToken() <div class="form-group"> <label asp-for="Username" class="font-weight-bold">Username</label> <input asp-for="Username" class="form-control" placeholder="Enter your username" /> <span asp-validation-for="Username" class="text-danger"></span> </div> <div class="form-group"> <label asp-for="Password" class="font-weight-bold">Password</label> <input asp-for="Password" class="form-control" placeholder="Enter your password" type="password" /> <span asp-validation-for="Password" class="text-danger"></span> </div> <div class="form-group form-check"> <input asp-for="RememberMe" class="form-check-input" id="rememberMeCheckbox" /> <label asp-for="RememberMe" class="form-check-label" for="rememberMeCheckbox">Remember Me</label> </div> <button class="btn btn-primary btn-block" type="submit">Login</button> </form> </div> <div class="card-footer text-center"> <small class="text-muted">Don't have an account? <a class="text-primary" href="/Account/Register">Register</a></small> </div> </div></body></html>
@section Scripts { <partial name="_ValidationScriptsPartial">}
5. Tampilan Login akan sama seperti gambar di atas.
ConversionConversion EmoticonEmoticon