MVC Login İşlemi

16 Temmuz 2013
Posted by Çağatay Yıldız
29660 Views

Bu yazımızıda Asp.Net MVC teknolojisi kullanarak basit bir üye login işlemi gerçekleştireceğiz. Login işleminden sonra sayfalarda kullanıcının login kontrolunu yapacağız. Bu kontrolu aynı zamanda kimi controller seviyelerinde yazacağız.
Öncelikle login işlemimizi gerçekleştirelim. Bunun için model klasörümüz altında bir LoginModel class ı oluşturuyoruz.

    public class LoginModel
    {
        [Required(ErrorMessage = "Lütfen mail adresinizi giriniz.")]
        [Display(Name = "E-Mail")]
        public string EMail { get; set; }

        [Required(ErrorMessage = "Lütfen şifrenizi giriniz.")]
        [DataType(DataType.Password)]
        [Display(Name = "Şifre")]
        public string Password { get; set; }
        

Oluşturduğumuz class lara gördüğünüz gibi validation kontrolleri de ekledik. Bu kontrolleri kullanabilmemiz için namespace lerimize System.ComponentModel.DataAnnotations kütüphanemizi eklememiz gerekmektedir.

using System.ComponentModel.DataAnnotations;

Gelelim login controller ımıza. Oluşturduğumuz controller a login ismini veriyoruz ve yine login isimli bir acitonresult oluşturuyoruz.

        [AllowAnonymous]
        public ActionResult Login()
        {
            if (String.IsNullOrEmpty(HttpContext.User.Identity.Name))
            {
                FormsAuthentication.SignOut();
                return View();
            }
            return Redirect("/Admin/Home");


        }

Oluşturduğumuz action üzerinde görüldüğü gibi bir attribute tanımladık. AllowAnonymous isimli attribute isminden de anlaşılacağı gibi tüm kullanıcılara bir giriş sağlamaktadır. Herhangi bir yetkilendirme dahi yapsak bu controller a tüm kullanıcılar giriş yapabilir. Daha sonra if bloğu içerisinde bir name kontrolu yaptık. Eğer login değilse FormsAuthentication.SignOut isimli metot çalışıyor ve sayfa tekrar view ediliyor. Eğer kullanıcı zaten sistemde olup bu sayfaya giril yapmak isterse belirlediğimiz /Admin/Home sayfasına gitmekte.
Peki kullanıcı nasıl login olmakta ve bilgiler nasıl kaydedilmekte? Bunun için login kontrolümüze içerisine modelimizi alacağı aynı isimli HTTPPost attribute sahip bir action daha yazıyoruz.

        [AllowAnonymous]
        [HttpPost]
        public ActionResult Login(LoginModel model, string returnurl)
        {
            if (ModelState.IsValid)
            {

                RepositoryPortal<AdminUser> rpstryadmn = new RepositoryPortal<AdminUser>();  
                //Aşağıdaki if komutu gönderilen mail ve şifre doğrultusunda kullanıcı kontrolu yapar. Eğer kullanıcı var ise login olur.
                if(rpstryadmn.NesneVarMi( a => a.Email == model.EMail && a.Password == model.password))
                {        
                    FormsAuthentication.SetAuthCookie(model.EMail, true);
                    return RedirectToAction("Index", "Home");                
                }

                else
                {
                    ModelState.AddModelError("", "EMail veya şifre hatalı!");
                }
            }
            return View(model);
        }

Burada bilgilerimizi kontrol kontol ettikten sonra login işlemi FormsAuthentication.SetAuthCookie metodunda gerçekleştirilmekte ve daha sonra anasayfaya yönlendirilmekte. Eğer bir hata meydana gelirse modelimize daha önce yazdığımız validationlar ekranda gözükecek. Bu işlemden sonta web.config kısmına system.web düğümleri arsına aşağıdaki satırı ekliyoruz bu şekilde authentication mode tanımlamış oluyoruz

    <authentication mode="Forms">
      <forms loginUrl="~/Account/Login" timeout="2880" />
    </authentication>

Ön tarafta html kodu ise şu şekilde :

@model OrnekProje.Areas.Admin.Models.LoginModel
@{
    Layout = null;
}
<!DOCTYPE html>
<html>
<head>
    <link href="~/Content/Admin/css/Login/base.css" rel="stylesheet" />

    <meta name="viewport" content="width=device-width" />
    <title>Login</title>
</head>
<body>

<div class="login" style="width:350px !important;margin:0 auto; margin-top:200px;">

<div class="box-header">

<h2> Admin Panel Yönetimi</h2>

  </div>


<div class="box">

<div class="notification tip"><span class="strong"> Admin Panel Giriş</span>@Html.ValidationSummary(false,"")</div>

 @using (Html.BeginForm("Login", "Login",  FormMethod.Post))
 { 

<div class="form col"> 


                        @Html.LabelFor( f => f.EMail)
                        @Html.TextBoxFor(f => f.EMail, new {title = "Kullanıcı adınızı giriniz.",@Value=@ViewBag.user})
                    



                    
                        @Html.LabelFor( f => f.Password)
                        @Html.PasswordFor(f => f.Password, new { title = "Kullanıcı şifrenizi giriniz.",@Value=@ViewBag.password }) 
                    



                        @Html.LabelFor(m=> m.RememberMe)
                        @if(@ViewBag.remember==true)
                        {@Html.CheckBoxFor(m => m.RememberMe, new { @checked="checked"})}
                        else {@Html.CheckBoxFor(m => m.RememberMe )}
                        <button type="submit" class="small fr">Giriş</button><br class="cl" />
                    

     
                </div>

 }                   
  </div>

</div>

</body>
</html>

Login işlemimiz bu şekilde gerçekleştirmek. Login işleminden çıkış için yazdığımız action ise şu şekilde

        public ActionResult LogOff()
        {
            FormsAuthentication.SignOut();
            return RedirectToAction("Login", "Login");
        }

Peki herhangi bir sayfada kullanıcı login ise sayfaya girişine onay nasıl verebiliriz. Bunun yolu oldukça basit. Öncelikle _SessionController adında bir class ekliyoruz projemize. Classımız şu şekilde

    class _SessionControlAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            if (!HttpContext.Current.User.Identity.IsAuthenticated)
            {
                if (!HttpContext.Current.Response.IsRequestBeingRedirected)
                        filterContext.HttpContext.Response.Redirect("/Login/Login");
            }
        }
    }

Bu kontroller ActionFilterAttribute sınıfından miras almakta bunun nedeni ise bu kontroller diğer sayfalarda attribute olarak kullanılacak olması. İçerisindeki kodlar hepimizin bildiği HttpContext sınıfının kodları. Bu sınıf hakkında ayrıntılı bilgi için msdn in şu sayfasına bakabilirsiniz : http://msdn.microsoft.com/tr-tr/library/system.web.httpcontext.aspx
Son olarak herhangi bir kullanıcı kontrol gerektiren sayfamıza bu attribute yazmamız sayfa kontrolu açısından yararlı olacaktır. Bu attribute dilersek controller ın en üst kısmına dilersek herhangi bir action üzerine de yazabiliriz. Yani tamamen attribute mantığıyla işlemekte.

    [_SessionControl]
    public class HomeController : _LayoutController
    {
        public ActionResult Index()
        {
            
            return View();
        }
    }

yukarıda _sessioncontrol isimli attribute en üste yazılmış bulunmakta ve tüm sayfadaki actionlar için login kontrolu yapmakta. Dilersek bunu dediğimiz gibi şu şekilde de yazabiliriz


    public class HomeController : _LayoutController
    {
        [_SessionControl]
        public ActionResult Index()
        {
            
            return View();
        }
    }

Bu şekilde hem login işlemini hemde sayfalardaki login kontrolunu kolayca yapmış olduk. Görüşmek üzere