TECRÜBEMİZİ YAZILIMCILARLA
PAYLAŞIYORUZ.
BİLGİ PAYLAŞTIKÇA ÇOĞALIR
BLOG
ASP.NET MVC Projelerinde Authentication İşlemi
Bir ASP.NET MVC projesinde kullanıcı girişlerini yönetmek
için iki farklı yol.vardır. Bunlardan biri Windows Authentication diğeri ise
Forms Authenticationdır. Windows Authentication adı üzerinde Windows giriş
bilgilerinizi kullanarak bir uygulama üzerinde oturum açmanıza olanak sağlar,
farklı şekilde ise Forms Authentication uygulamanız üzerinde herhangi bir form
aracılığı ile örneğin “Account/Login” sayfanızdaki form bazlı oturum açma
yöntemidir. Yani Windows kullanıcı bilgilerine bakmayıp, sadece sizin
uygulamanız üzerine kurduğunuz, veritabanı içinde sorguladığınız bu
kullanıcılar sisteminize girebilmek için belirli şeylere sahip olmalıdırlar. Bu
bilgiler, dilerseniz Session dediğimiz sunucu taraflı bir bellek üzerinde
tutulabilir ya da Cookie denilen çerezler aracılığı ile kullanıcının
tarayıcısında tutulur. Siz bu bilgileri her sorgulamada kontrol eder ve
kullanıcı oturumunun hayatta kalıp kalmadığını kontrol edersiniz. Forms
Authentication’u daha da anlamak gerekir ise, kendi kullanıcılarınızın
oturumlarını yönetmenizi sağlayan Authentication metodudur.
Forms Authentication’a Başlarken
Web.config dosyanzda aşağıdaki tanımlamayı yapmalıyız.
Aşağıdaki tanımlama uygulamamızın forms authentication kullanıldığını bilmesini
sağlar.
<system.web>
<authentication mode="Forms">
<forms name="OTOS_User" path="/" protection="All" slidingExpiration="true" timeout="30" defaultUrl="/" loginUrl="/Account/Login" />
</authentication>
</system.web>
Daha sonra projemizde bu şekilde özel sınıflarımızı
tuttuğumuz bir yere Authentication adında bir class oluşturalım, sonrasında FormsAuthentication sınıfını kullanabilmemiz için System.Web.Security
namespace’ini tanımlayalım.
Şimdi ise authentication metodlarımızı
yazabiliriz.
Örn:
FormsAuthentication.Timeout.TotalMinutes özelliği bize web.configte
tanımladığımız authentication etiketi içindeki timeout attibute değerini
dönecektir. Cookielerimizin geçersiz olmasını sağlamak için bu süre
tanımlamalarını kullanabiliriz. Forms authentication bir cookie oluştuğunda
oluşturulan tarihi cookie içinde saklar ve kullanıcının cookiesi geçersiz
olduğunda bunu anlar ve kullanıcıyı oturumdan atar.
FormsAuthentication.Initialize() fonksiyonu FormsAuthentication
sınıfı static bir sınıf olduğundan web.configteki verileri okuyarak veya kendi
içinde farklı işlemler yaparak ram’e yüklenmesini sağlayan fonksiyondur.
FormsAuthentication metodu biletler üzerine çalışır
örnek verecek olursak, bir futbol maçına girmek için bir biletiniz olması
gerekir ve bu bilete ait bilgilerin size ait olmalıdır. FormsAuthentication da
aynen bu mantıkla çalışır.
FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1, user.ID.ToString(), DateTime.Now, DateTime.Now.AddMinutes(sessionTimeout), true, user.Email);
Yukarıdaki kod bir giriş bileti
oluşturmamıza yarar. Birinci parametrede bu biletin versiyonu her zaman için
1’dir. Bu parametre iletlerimizi versiyonlama ihtiyacı duyduğumuzda eski
biletlerin de tanınması ve yenileri ile değiştirilmesini sağlar. İkinci
parametre, Name parametresi, string bir değer alır ve bir biletin back-end
tarafında ulaşması en kolay yeridir bu yüzden ticketların Name alanında
kullanıcıların ID bilgisini saklamak mantıklı olacaktır. Üçüncü parametre,
issueDate parametresi, bu biletin ne zaman oluşturulduğu bilgisini tutar.
DateTime türünde değer alır. Dördüncü parametre, expiration parametresi,
DateTime türünde bir değer alır bu tarihten sonra ticketların geçersiz
olacağını tanımlarız. Beşinci parametre, isPersistant, “Remember Me” işlevimizi
yöneten parametredir. Altıncı parametre ise userData, string bir değer alır.
userData parametresi içine kullanıcının önemli bilgileri konulabilir ya da
direkt User modelini JSON’a çevirip içeride tutabiliriz. Kullanıcıların hangi
bilgilerini tutacağımız bize kalmış.
Evet, giriş biletimizi oluşturduktan
sonra, bu bileti başkalarının açıp okumaması ve bu biletin korunması için, FormsAuthentication sınıfının
kendi şifreleme metoduyla şifrelenip bir cookie nesnesi haline getirilir.
HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName,
FormsAuthentication.Encrypt(ticket));
Son olarak, oluşturulan cookie
nesnesini kullanıcıya iletmek kalıyor.
HttpContext.Current.Response.Cookies.Add(cookie) giden
cevabın cookielerine, oluşturulan cookiemizi ekliyoruz.
Kullanıcıya çıkış yaptırmamak için
ise, kullanıcı bilgisayarındaki cookileri temizlemek ve var olan sessionu
sıfırlamak gerekir.
Bunun için aşağıdaki fonksiyonları
sırayla çağırdığımızda önce FormsAuthentication sınıfı istek ile gelen
cookie’yi geçersiz yapar, sonra biz gelen ve giden isteklerdeki bütün session
ve cookie kalıntılarını temizleriz. Sonuç olarak kullanıcı başarılı bir şekilde
oturumunu kapatmış olur.
FormsAuthentication.SignOut();
HttpContext.Current.Session.Clear();
HttpContext.Current.Session.Abandon();
HttpContext.Current.Request.Cookies.Clear();
HttpContext.Current.Response.Cookies.Clear();