Şimdi giriş kontrolü (authentication) ve yetkilendirme (authorization) işlemlerini yapacağız. Kullanıcılar ve roller zaten veritabanına eklendiğine göre, artık giriş işlemi ve sayfalara erişim kısıtlamalarını oluşturabiliriz.
Kullanıcı Girişi (Login)
Öncelikle AccountController oluşturup giriş işlemini gerçekleştirelim.
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Mvc;
using SchoolManagement.Models;
using System.Threading.Tasks;
namespace SchoolManagement.Controllers
{
public class AccountController : Controller
{
private readonly SignInManager<ApplicationUser> _signInManager;
private readonly UserManager<ApplicationUser> _userManager;
public AccountController(SignInManager<ApplicationUser> signInManager, UserManager<ApplicationUser> userManager)
{
_signInManager = signInManager;
_userManager = userManager;
}
// Giriş Yapma
[HttpGet]
public IActionResult Login()
{
return View();
}
[HttpPost]
public async Task<IActionResult> Login(LoginViewModel model)
{
if (ModelState.IsValid)
{
var user = await _userManager.FindByNameAsync(model.Username);
if (user != null)
{
var result = await _signInManager.PasswordSignInAsync(user, model.Password, false, false);
if (result.Succeeded)
{
// Rol kontrolü ve yönlendirme
if (await _userManager.IsInRoleAsync(user, "Admin"))
{
return RedirectToAction("Dashboard", "Admin");
}
else if (await _userManager.IsInRoleAsync(user, "Teacher"))
{
return RedirectToAction("Dashboard", "Teacher");
}
else if (await _userManager.IsInRoleAsync(user, "Student"))
{
return RedirectToAction("Dashboard", "Student");
}
}
else
{
ModelState.AddModelError(string.Empty, "Geçersiz giriş.");
}
}
else
{
ModelState.AddModelError(string.Empty, "Kullanıcı bulunamadı.");
}
}
return View(model);
}
// Çıkış Yapma
public async Task<IActionResult> Logout()
{
await _signInManager.SignOutAsync();
return RedirectToAction("Index", "Home");
}
public IActionResult AccessDenied()
{
return View();
}
}
}
Bu controller, kullanıcı girişini gerçekleştirir. Eğer giriş başarılıysa kullanıcı yetkili olduğu sayfata yönlendirilir.
Kullanıcı Giriş Sayfası (Login View)
@model SchoolManagement.Models.LoginViewModel
<h2>Giriş Yap</h2>
<form asp-action="Login" method="post">
<div class="form-group">
<label for="Username">Kullanıcı Adı</label>
<input type="text" id="Username" name="Username" class="form-control" required />
</div>
<div class="form-group">
<label for="Password">Şifre</label>
<input type="password" id="Password" name="Password" class="form-control" required />
</div>
<button type="submit" class="btn btn-primary">Giriş Yap</button>
</form>
Kullanıcı Modeli (ViewModel)
using System.ComponentModel.DataAnnotations;
namespace SchoolManagement.Models
{
public class LoginViewModel
{
[Required]
public string Username { get; set; }
[Required]
[DataType(DataType.Password)]
public string Password { get; set; }
public bool RememberMe { get; set; }
}
}
Yetkilendirme (Authorization)
Şimdi her rol için yetkilendirme işlemlerini yapacağız.
Admin Paneli (Sadece Admin Girebilir)
Controllers/Admin/AdminController.cs
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
namespace SchoolManagement.Controllers.Admin
{
[Authorize(Roles = "Admin")]
public class AdminController : Controller
{
public IActionResult Dashboard()
{
return View();
}
}
}
Öğretmen Paneli (Sadece Öğretmenler Girebilir)
Controllers/Teacher/TeacherController.cs
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
namespace SchoolManagement.Controllers.Teacher
{
[Authorize(Roles = "Teacher")]
public class TeacherController : Controller
{
public IActionResult Dashboard()
{
return View();
}
}
}
Öğrenci Paneli (Sadece Öğrenciler Girebilir)
Controllers/Student/StudentController.cs
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
namespace SchoolManagement.Controllers.Student
{
[Authorize(Roles = "Student")]
public class StudentController : Controller
{
public IActionResult Dashboard()
{
return View();
}
}
}
Yetkisiz Erişim Sayfası
Eğer bir kullanıcı yetkisi olmayan bir sayfaya erişmeye çalışırsa, AccessDenied sayfasına yönlendirilmesini sağlayalım.
Controllers/AccountController.cs (Güncelle)
public IActionResult AccessDenied()
{
return View();
}
Views/Account/AccessDenied.cshtml
<h2>Yetkisiz Erişim</h2>
<p>Bu sayfaya erişme yetkiniz bulunmamaktadır.</p>
<a href="/">Ana Sayfa'ya Dön</a>
Yetkisiz erişimde bu sayfa gösterilecektir.
Yetkilendirme Kurallarının Etkinleştirilmesi
Son olarak Program.cs dosyasında yetkilendirme yapılandırmasını yapalım.
app.UseAuthentication();
app.UseAuthorization();
app.UseStatusCodePagesWithRedirects("/Account/AccessDenied");
Bu kod, yetkisiz kullanıcıların AccessDenied sayfasına yönlendirilmesini sağlar.