Web Api – Authorization Filter Attribute – Oturum Yönetimi
Merhabalar,
Bu yazımda temel oturum yöntemimizi Authorization Filter Attribute kullanarak yapan bir örnek oluşturacağım.
Öncelikle kendi filter ımızı oluşturacağız , MyAuthorizationAttribute adında bir filter oluşturup AuthorizationFilterAttribute sınıfından miras aldım , AuthorizationFilterAttribute sınıfındaki OnAuthorization metotudun override edelim.
MyAuthorizationAttribute.cs
using System; using System.Collections.Generic; using System.Linq; using System.Net.Http; using System.Security.Principal; using System.Text; using System.Threading; using System.Web; using System.Web.Http.Controllers; using System.Web.Http.Filters; namespace WebApiApp.Filters { public class MyAuthorizationAttribute: AuthorizationFilterAttribute { public override void OnAuthorization(HttpActionContext actionContext) { base.OnAuthorization(actionContext); } } }
Oturum açma işlemini kontrol etmek için kullanıcı bilgilerini Request in Header parametrelerinde bulunan Authorization parametresinden alacağız , actionContext ten gelen verileri okuyacağız :
actionContext.Request.Headers.Authorization.Parameter;
using System; using System.Collections.Generic; using System.Linq; using System.Net.Http; using System.Security.Principal; using System.Text; using System.Threading; using System.Web; using System.Web.Http.Controllers; using System.Web.Http.Filters; namespace WebApiApp.Filters { public class MyAuthorizationAttribute: AuthorizationFilterAttribute { public override void OnAuthorization(HttpActionContext actionContext) { if (actionContext.Request.Headers.Authorization == null) { actionContext.Response = actionContext.Request.CreateResponse(System.Net.HttpStatusCode.Unauthorized); } else { bool kontrol = false; var tokenKey = actionContext.Request.Headers.Authorization.Parameter; //sseker:123456 var userNamePassword = tokenKey;//Encoding.UTF8.GetString(Convert.FromBase64String(tokenKey)); var userInfoArray = userNamePassword.Split(':'); var userName = userInfoArray[0]; var password = userInfoArray[1]; if (("sseker").Equals(userName,StringComparison.OrdinalIgnoreCase) && password == "123456") { kontrol= true; } else { kontrol = false; } if (kontrol) { Thread.CurrentPrincipal = new GenericPrincipal(new GenericIdentity(userName), null); } else { actionContext.Response = actionContext.Request.CreateResponse(System.Net.HttpStatusCode.Unauthorized); } } } } }
Örnek Kodumuzda öncelikle Authorization parameteresinin null olup olmadığı kontrol ediliyor null değil ise gelen verinin kontrolü yapılıyor , örnek olduğu için çok basit bi şekilde gelen string için bir kontrol yazdım , kendi şifreleme mekanizmanıza göre gerekli serviceleri eklemeniz gerekir.başarılı ise bir Identity oluşturulup thread e ekleniyor ve oturum açma işlemi başarılı şekilde sağlanıyor.
(“sseker”).Equals(userName,StringComparison.OrdinalIgnoreCase) kodu ile gelen değerin kullanıcı adı kısmının büyük küçük harf hatasına takılmadan ilerlemesini sağlamak için büyük küçük harf eşitlik zorunluluğunu göz ardı ediyoruz, password alanı için birebir eşitlik bekliyoruz.
Temel oturum açma yöntemi olduğu için bu işlemin kullanımı için
Header paramteresine Authorization eklenmesi gerekiyor Değerlerin girişini sağlarken Basic anahtar sözcüğü bir boşluk ve gerekli şifreleme değeri girilmelidir.
Örn : Authorization: Basic sseker:123456
Postman Ekran Görüntüsü :
Genelde bu tarz kullanımlarda şifre açık şekilde gönderilmez Base64String olarak şifrelenen bir şifreleme gönderilip , kod tarafında çözümlenerek şifreleme işlemi kontrolü sağlanır.
yorum satırı olarak yazılan Encoding.UTF8.GetString(Convert.FromBase64String(tokenKey)); kod base64 formatında gelen stringi encode etmek için kullanılmaktadır.
Authorization işlemini JQuery AJAX ile yapmak için örnek :
<script> function List() { Clear(); var name = "sseker"; var pass = "123456"; $.ajax({ type: "GET", url: "http://localhost:50903/api/values", dataType: "json", headers: { Authorization: "Basic " + btoa(name + ":" + pass) }, success: function (response) { console.log("response", response); if (response) { alert("Başarılı"); } }, error: function (err) { alert(err.status + " " + err.statusText); } }); } </script>
Ajax kodumuzda headers parametresine Key-Value ekleyerek başarılı şekilde istek atabiliriz.
btoa(name + “:” + pass) : base64string e çevirip göndermemizi sağlıyor , kodumuzda ki encode işlemi bu işlemi encode edip istediğimiz formata dönüştürecektir,
base64 kullanmak istemiyorsanız postmandeki şekilde Basic sseker:123456 şeklinde gönderim sağlayabilirsiniz.
Javascript tarafında base64string’e dönüştürme işleminin nasıl yapılacağını da göstermek için eklenmiştir.
Web Api mizde Ajax isteklerin atılabilmesi için , Cors hatası alamamak için , daha önceden anlatmış olduğum linkte bulunan yazıyı mutlaka okumanızı tavsiye ederim.
ASP.NET – WEB API- CROSS DOMAIN – JQUERY AJAX – ACCESS CONTROL ALLOW ORIGIN HATASI
İyi Çalışmalar Dilerim.