Kayıt ol (Register) işlemini ekleyelim. Öncelikle giriş formunu güncelleyelim.
Login Sayfasını Bootstrap ile Düzenleme
Aşağıdaki gibi Views/Account/Login.cshtml dosyasını güncelle:
@model SchoolManagement.Models.LoginViewModel
<div class="container d-flex justify-content-center align-items-center" style="min-height: 100vh; margin-top: -70px;">
<div class="card shadow p-4" style="width: 400px;">
<h2 class="text-center mb-4">Giriş Yap</h2>
<form asp-action="Login" method="post">
<div class="mb-3">
<label for="Username" class="form-label">Kullanıcı Adı</label>
<input type="text" id="Username" name="Username" class="form-control" required />
</div>
<div class="mb-3">
<label for="Password" class="form-label">Şifre</label>
<input type="password" id="Password" name="Password" class="form-control" required />
</div>
@* <div class="form-check mb-3">
<input asp-for="RememberMe" class="form-check-input" />
<label asp-for="RememberMe" class="form-check-label">Beni Hatırla</label>
</div>
*@
@if (!ViewData.ModelState.IsValid)
{
<div class="alert alert-danger">
<ul>
@foreach (var error in ViewData.ModelState.Values.SelectMany(v => v.Errors))
{
<li>@error.ErrorMessage</li>
}
</ul>
</div>
}
<button type="submit" class="btn btn-primary w-100">Giriş Yap</button>
<div class="text-center mt-3">
<a asp-action="Register" asp-controller="Account">Hesabınız yok mu? Kayıt olun</a>
</div>
</form>
</div>
</div>
Kayıt Ol Sayfası (Register)
Şimdi yeni bir kullanıcı kayıt edebileceğimiz Register sayfasını ekleyelim.
Register ViewModel (Models/RegisterViewModel.cs)
using System.ComponentModel.DataAnnotations;
namespace SchoolManagement.Models
{
public class RegisterViewModel
{
[Required]
public string Username { get; set; }
[Required]
[EmailAddress]
public string Email { get; set; }
[Required]
[DataType(DataType.Password)]
public string Password { get; set; }
[Required]
[Compare("Password", ErrorMessage = "Şifreler uyuşmuyor.")]
public string ConfirmPassword { get; set; }
[Required]
public string Adi { get; set; }
[Required]
public string Soyadi { get; set; }
[Required]
public string Role { get; set; } // Kullanıcı rolü: Admin, Teacher, Student
}
}
AccountController'a Register Metodu Ekle Controllers/AccountController.cs içinde Register metotlarını ekleyelim.
// Kayıt Sayfası
[HttpGet]
public IActionResult Register()
{
return View();
}
// Kayıt İşlemi
[HttpPost]
public async Task<IActionResult> Register(RegisterViewModel model)
{
if (ModelState.IsValid)
{
// Transaction başlatıyoruz
using (var transaction = await _context.Database.BeginTransactionAsync())
{
try
{
// Email kontrolü
var existingEmail = await _userManager.Users.AnyAsync(u => u.Email == model.Email);
if (existingEmail)
{
ModelState.AddModelError("Email", "Bu e-posta adresi zaten kayıtlı.");
return View(model); // Email zaten varsa hata göster
}
// Şifre kontrolü
var users = await _userManager.Users.ToListAsync(); // Kullanıcıları çekiyoruz
var passwordHasher = new PasswordHasher<ApplicationUser>();
foreach (var user in users)
{
var verificationResult = passwordHasher.VerifyHashedPassword(user, user.PasswordHash, model.Password);
// Eğer şifre aynıysa, hata mesajı göster
if (verificationResult == PasswordVerificationResult.Success)
{
ModelState.AddModelError("Password", "Bu şifreyle daha önce bir hesap kaydedilmiştir.");
return View(model); // Şifre aynıysa hata göster
}
}
if (model.Password != model.ConfirmPassword)
{
ModelState.AddModelError("ConfirmPassword", "Şifreler uyuşmuyor.");
return View(model);
}
// Kullanıcıyı Identity tablosuna ekleyelim
var newUser = new ApplicationUser { UserName = model.Username, Email = model.Email };
var result = await _userManager.CreateAsync(newUser, model.Password);
if (result.Succeeded)
{
// Kullanıcıyı bulalım
var createdUser = await _userManager.FindByIdAsync(newUser.Id);
// Şifre hash'ini alalım
var hashedPassword = createdUser?.PasswordHash;
// Rol ataması yapalım
if (model.Role == "Admin")
{
await _userManager.AddToRoleAsync(newUser, "Admin");
var admin = new Yonetici
{
KullaniciAdi = model.Username,
EmailAdresi = model.Email,
Adi = model.Adi,
Soyadi = model.Soyadi,
Rol = model.Role,
Sifre = hashedPassword ?? "default", // Eğer null ise boş string kullan
Durum = 2,
ResimYolu = "images/default.jpg"
};
_context.Yoneticiler.Add(admin);
}
else if (model.Role == "Teacher")
{
await _userManager.AddToRoleAsync(newUser, "Teacher");
var teacher = new Ogretmen
{
KullaniciAdi = model.Username,
EmailAdresi = model.Email,
Adi = model.Adi,
Soyadi = model.Soyadi,
Sifre = hashedPassword ?? "default",
Rol = model.Role,
Durum = 2,
ResimYolu = "images/default.jpg"
};
_context.Ogretmenler.Add(teacher);
}
else if (model.Role == "Student")
{
await _userManager.AddToRoleAsync(newUser, "Student");
var student = new Ogrenci
{
KullaniciAdi = model.Username,
EmailAdresi = model.Email,
Adi = model.Adi,
Soyadi = model.Soyadi,
Sifre = hashedPassword ?? "default",
Rol = model.Role,
Durum = 2,
ResimYolu = "images/default.jpg",
Numara = "0000",
WebAdresi = "https://www.example.com"
};
_context.Ogrenciler.Add(student);
}
await _context.SaveChangesAsync();
await transaction.CommitAsync();
await _signInManager.SignInAsync(newUser, isPersistent: false);
return RedirectToAction("Login", "Account");
}
else
{
ModelState.AddModelError(string.Empty, "Kullanıcı kaydı sırasında hata oluştu.");
await transaction.RollbackAsync();
}
}
catch (Exception ex)
{
await transaction.RollbackAsync();
ModelState.AddModelError(string.Empty, $"Bir hata oluştu: {ex.Message}");
}
}
}
// Model geçerli değilse, formu ve hataları geri gönderiyoruz
return View(model);
}
Register Sayfası (Views/Account/Register.cshtml)
@model SchoolManagement.Models.RegisterViewModel
<div class="container d-flex justify-content-center align-items-center" style="min-height: 100vh;">
<div class="card shadow p-4" style="width: 400px;">
<h2 class="text-center mb-4">Kayıt Ol</h2>
<form asp-action="Register" method="post">
<div class="mb-3">
<label asp-for="Username" class="form-label">Kullanıcı Adı</label>
<input asp-for="Username" class="form-control" required />
<span asp-validation-for="Username" class="text-danger"></span>
</div>
<div class="mb-3">
<label asp-for="Email" class="form-label">E-posta</label>
<input asp-for="Email" class="form-control" required />
<span asp-validation-for="Email" class="text-danger"></span>
</div>
<div class="mb-3">
<label asp-for="Password" class="form-label">Şifre</label>
<input asp-for="Password" type="password" class="form-control" required />
<span asp-validation-for="Password" class="text-danger"></span>
</div>
<div class="mb-3">
<label asp-for="ConfirmPassword" class="form-label">Şifre Tekrarı</label>
<input asp-for="ConfirmPassword" type="password" class="form-control" required />
<span asp-validation-for="ConfirmPassword" class="text-danger"></span>
</div>
<div class="mb-3">
<label asp-for="Adi" class="form-label">Adı</label>
<input asp-for="Adi" class="form-control" required />
<span asp-validation-for="Adi" class="text-danger"></span>
</div>
<div class="mb-3">
<label asp-for="Soyadi" class="form-label">Soyadı</label>
<input asp-for="Soyadi" class="form-control" required />
<span asp-validation-for="Soyadi" class="text-danger"></span>
</div>
<div class="mb-3">
<label asp-for="Role" class="form-label">Rol Seçin</label>
<select asp-for="Role" class="form-control" required>
<option value="Admin">Yönetici</option>
<option value="Teacher">Öğretmen</option>
<option value="Student">Öğrenci</option>
</select>
<span asp-validation-for="Role" class="text-danger"></span>
</div>
@if (!ViewData.ModelState.IsValid)
{
<div class="alert alert-danger">
<ul>
@foreach (var error in ViewData.ModelState.Values.SelectMany(v => v.Errors))
{
<li>@error.ErrorMessage</li>
}
</ul>
</div>
}
<button type="submit" class="btn btn-primary w-100">Kayıt Ol</button>
</form>
</div>
</div>
Kayıt işlemlerini tamamladık. Kullaınıcıların web sayfasına erişim izinlerine göre kayıtları tablolarda saklandı.