.Net Core MVC Login İşlemi

2 Ağustos 2018
Posted by Çağatay Yıldız
258 Views

Bu yazımızda .Net Core üzerinden Cookie Auth ile bir login işlemi gerçekleştireceğiz. Cookie auth gibi bir çok auth mekanizmasıyla da bu işlemi gerçekleştirmeniz mümkün. ASP.Net Identity, windows auth gibi mekanizlamaları da kullanabilirsiniz.
Öncelikle boş bir .Net Core projesi oluşturuyoruz.

Projemizde cookie auth kullanacağımız için Package Manager Console üzerinden ekliyoruz. Ekleyeceğimiz konut şu şekilde:

InstallI -Package Microsoft.AspNetCore.Authentication.Cookies

Startup classımızdaki configuration metodumuza authentication kullanacağımızı belirtiyoruz. Metodun en tepesine yazdığımız kod şu şekilde:

app.UseAuthentication();

Boş bir proje olduğu için öncelikle ConfigureServices metodumuza MVC yi eklememiz gerekiyor. Daha sonra da AddAuthentication ile Cookie Auth özelliklerimizi ekliyoruz. Mevcut kod bloğumuz şu şekilde:

            services.AddMvc();
            services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
                    .AddCookie(options =>
                    {
                        options.LoginPath = "/Account/Login/";
                    });

Basit bir route yapısı için Configure metodumuza route özelliklerimizi de ekliyoruz.

            app.UseMvc(routes =>
            {
                routes.MapRoute(
                    name: "default",
                    template: "{controller=Home}/{action=Index}/{id?}");
            });

Şimdi sıra geldi mevcut controller, view ve model yapılarımıza. Login işlemi için basit bir model tanımlayalım

    public class LoginModel
    {
        public string Username { get; set; }
        public string Password { get; set; }
    }


Modelimizi ve pek tabi login işlemlerimizi gerçekleştirecek olan accountcontrollumuzu oluşturuyoruz.



    public class AccountController : Controller
    {
        [HttpGet]
        public IActionResult Login()
        {
            return View();
        }

        [HttpPost]
        public async Task<IActionResult> Login(LoginModel loginModel)
        {
            if (LoginUser(loginModel.Username, loginModel.Password))
            {
                var claims = new List<Claim>
            {
                new Claim(ClaimTypes.Name, loginModel.Username)
            };

                var userIdentity = new ClaimsIdentity(claims, "login");

                ClaimsPrincipal principal = new ClaimsPrincipal(userIdentity);
                await HttpContext.SignInAsync(principal);

                //Just redirect to our index after logging in. 
                return RedirectToAction("Index","Home");
            }
            return View();
        }

        public async Task<IActionResult> LogOut()
        {
            await HttpContext.SignOutAsync();

            return RedirectToAction("Index");
        }

        private bool LoginUser(string username, string password)
        {
            if (username == "cagatay" && password == "123")
            {
                return true;
            }
            else
            {
                return false;
            }
           
        }
    }

Yukarıdaki kod bloğunda dikkat etmemiz gereken bazı noktalar var. Öncelikle eklediğimiz Name adında ClaimTypes kullanıcının adını tutmakta. Bunun gibi bir çok claimtpye mevcut. Ayrıca kendinizde custom claim type tanımlayıp tutabilirsiniz. Bununla ilgili ayrıntılı özellik listesini yazının sonunda paylaşıyor olacağım.
Login sayfasının View kısmı şu şekilde:

@{
    Layout = null;
}

<!DOCTYPE html>

<html>
<head>
    <!-- Latest compiled and minified CSS -->
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.1.0/css/bootstrap.min.css">

    <!-- jQuery library -->
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

    <!-- Popper JS -->
    <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.0/umd/popper.min.js"></script>

    <!-- Latest compiled JavaScript -->
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.1.0/js/bootstrap.min.js"></script>

    <meta name="viewport" content="width=device-width" />
    <title>Login</title>
</head>
<body>
    <div class="container">
        <h2>Giriş</h2>

        <form action="/Account/Login" method="post">
            <div class="form-group">
                <label>Kullanıcı Adı</label>
                <input type="text" class="form-control" name="Username" value="" />
            </div>
            <div class="form-group">
                <label>Şifre</label>
                <input type="password" name="Password" class="form-control" value="" />
            </div>
            <div class="form-group"> 
                <input type="submit" class="btn btn-primary" name="name" value="Giriş" />
            </div>

        </form>
    </div>
</body>
</html>

Güvenli sayfa olarak nitelendireceğimiz HomeController isimli controller şu şekilde:

    public class HomeController : Controller
    {
        [Authorize]
        public IActionResult Index()
        {

            var name = User.Claims.Where(c => c.Type == ClaimTypes.Name)
                   .Select(c => c.Value).SingleOrDefault();
            

            return View();
        }
    }

Burada dikkat ederseniz Index metoduna önceki MVC sürümlerinde olduğu gibi bir Authorize attribute ekliyoruz. Örnek olması açısından claim içerisine tanımladığımız değeri Index metodu içerisinde çektim. HomeController a bir kaç ekran eklediğiniz takdirde sayfa erişimlerini kolayca görebileceksiniz.
Özellikle Cookie ekleme özelliklerini anlamak için aşağıdaki Microsoft linki oldukça faydalı. Ayrıca projenin github linkini de aşağıda paylaşıyorum.

https://docs.microsoft.com/en-us/aspnet/core/security/authentication/cookie?view=aspnetcore-2.1&tabs=aspnetcore2x
https://github.com/yakintech/CoreCookieAuth