ben

OMÜ , Bilgisayar Mühendisliği, 13'

21 Eylül 2022 Çarşamba

Authentication (Log in) İşlemi

 Giriş işleminden önce kullanıcının db de olup olmadığı bilgisi varsa bilgierini getirip sorgulamak için BLL katmanına UserRepository ve ınterface olarakda IUserRepository oluşturmamız gerekiyor. Concrete altına UserRepository olarak bir class açalım.

 public class UserRepository : Repository<User>, IUserRepository
    {
        MyDbContext _db;
        public UserRepository(MyDbContext db) : base(db)
        {
            _db = db;
        }
        public User IsUserLogin(string Username)
        {
            return _db.Users.Where(x => x.Status != DataStatus.Deleted && x.UserName == Username).FirstOrDefault();
        }
    }

Interface altına ise IUserRepository class açalım:

   public interface IUserRepository : IRepository<User>
    {
        User IsUserLogin(string Username);
    }

Yazdığımız bu Repolardan UI katmanının haber olması gerekiyor , Her Bir repo için Startup.cs dosyasına bildirmemiz grekiyor. Startup.cs dosyasına ConfigureServices altına aşağıdaki şekilde scope ekleyelim.

   services.AddScoped<IUserRepository, UserRepository>();


Altyapımızı oluşturduğumza göre UI Katmanındaki UserController yapısına gelelim, Formdan veri almak için ya tek bir model yada tupple nesnesi olarak göndermemiz gerekiyor.  Formdan gelen verileri karşılamak için ise aynı isimde httppost methodu yazacağız.. Bir de Usercontroller ın constructor yapısında reposyu implement etmemiz lazım ki yazdığımız sorguları görebileim,  Bu işlemleri yaptığımızda  controller yapımız aşağıdaki şekilde olacaktır.


 public class UserController : Controller
    {
        IUserRepository _repoUser;
        public UserController(IUserRepository repoUser)
        {
            _repoUser = repoUser;
        }
        public IActionResult SignIn()
        {
            return View(new User());
        }
        [HttpPost]
        public IActionResult SignIn(User user)
        {
            // Formdan gelen veri ile log in işlemi yapılacak
            return View();
        }
        public IActionResult SignUp()
        {
            
            return View();
        }
    }

Şimde SignIn view dosyasına gidip formu gelen bu modele bağlayalım..


@model User
<section id="get-a-quote" class="get-a-quote">
      <div class="container" data-aos="fade-up">
        <div class="row g-0 ">
          <div class="col-lg-2"></div>
          <div class="col-lg-4 quote-bg" style="background-image: url(/img/quote-bg.jpg);"></div>
          <div class="col-lg-5">
                <form method="post" asp-controller="User" asp-action="SignIn" role="form" class="php-email-form">
               <h2 style="text-align: center;"> Giriş Yapın</h2>
                <div class="row gy-4 mt-5">
                    <div class="col-md-12">
                      <input type="text" asp-for="@Model.UserName" class=" form-control" placeholder="Kullanıcı Adınızı Giriniz" required>
                    </div>
                    <div class="col-md-12">
                      <input type="password" asp-for="@Model.Password" class="form-control" placeholder="Şifrenizi Giriniz" required>
                    </div>
                    <div class="col-md-12 text-center">
                      <button type="submit">Giriş Yap</button>
                    </div>
              </div>       
            </form>      
          </div>
        </div>
      </div>
    </section>

UserController'a gidip bakalım verilerimiz geliyormu? Burda validate.js üzerinde hata aldığımız için wwwroot altındaki vendor klasörü altındaki php-form-ile başlayan klasörü kaldırdık..


Formdan aldığımız bu verileri şimdi repositoryde yazdığımız fonksiyon ile kontrol edelim, db de bu kullanıcı varmı?

UserController 'ımıza geçelim ve post methodu altındaki fonksiyonu geliştirelim...


        public IActionResult SignIn(User user)
        {
            if (!ModelState.IsValid)
            {  //validasyonlardan geçemedi
                return View(new User());
            }
            User luser = _repoUser.IsUserLogin(user.UserName);
            if (luser != null)
            {
                //şifreyi karşılaştır
                bool isvalid = BCrypt.Net.BCrypt.Verify(user.Password, luser.Password);
                if (isvalid)
                {
                   // geçerli kullanıcı oturum açma işlemi

                    return RedirectToAction("Index", "Home");
                }
                else
                {
                    //şifre hatalı
                    return View(new User());
                }
            }
            else
            {
                //Bulunamadı
                return View(new User());
            }
        }

Post fonksiyonumuzun iskeleti hazır , Öncelikle ilgli hataları kullanıcıya geri döndürebilmemiz için Layout sayfasına hata için uyarı tasarımı yapalım. RenderBody'nin hemen üstüne yerleştirelim  ki sayfalardan gelen hataları üst kısımda gösterebilelim.

         @if(@ViewBag.Message != null)
         { <div class="alert alert-@ViewBag.CssClassName alert-dismissible fade show" role="alert" >
                   @ViewBag.Message
                  <button type="button" class="close" data-dismiss="alert" aria-label="Close">
                    <span aria-hidden="true">&times;</span>
                  </button>
                </div>
          }
                @RenderBody()


Yeniden Login Fonksiyonuna Gelip hata mesajlarını gösterelim. User controllerdaki SignIn fonksiyonları aşağıdaki gibi olacaktır.

 public IActionResult SignIn()
        {
            if (TempData["Message"] != null)
            {
                ViewBag.CssClassName = TempData["CssClassName"];
                ViewBag.Message = TempData["Message"];
            }
            return View(new User());
        }
        [HttpPost]
        public IActionResult SignIn(User user)
        {
            if (!ModelState.IsValid)
            {  //validasyonlardan geçemedi
                return View(new User());
            }
            User luser = _repoUser.IsUserLogin(user.UserName);
            if (luser != null)
            {
                bool isvalid = BCrypt.Net.BCrypt.Verify(user.Password, luser.Password);
                if (isvalid)
                {
                   // geçerli kullanıcı oturum açma işlemi
                    return RedirectToAction("Index", "Home");
                }
                else
                {
                    ViewBag.CssClassName = "danger"; ;
                    ViewBag.Message = "Şifrenizi Hatalı Girdiniz!";
                    return View(new User());
                }
            }
            else
            {
                ViewBag.CssClassName = "danger"; ;
                ViewBag.Message = "Kullanıcı Bulunamadı!";
                return View(new User());
            }
        } 

Şimdi herşey yolundaysa bir sonraki yazıda  if(isvalid) blogunda oturum açtıralım..

Hiç yorum yok: