Her kullanıcıya özel bir secret key (APIKey) vererek, servisime gelen isteği yapan kullanıcıda, benim belirlediğim key var ise (yani benim veri tabanımda o kullanıcı var ise) istek cevaplansın yoksa unauthorized dönsün şeklinde oturum kontrolü yapmak istiyoruz.
- Authentication : Kullanıcı başarılı bir şekilde giriş yapmış mı?
- Authorization : Giriş yapan kullanıcın hakları
- Apikey : Secret Key
I. Authorize attribute’unu kullan (Oturum istediğimiz action ya da controller’ın başına [Authorize] ifadesini ekle)
[Authorize]
public IHttpActionResult Get()
{
..
}
II. Kullanıcıdan gelen Request’i yakalamak için bir class yazacağız, classımız DelegatingHandler class’ından miras alacak bu class içerisindeki sendasync() methodunu override edeceğiz
Project SağTık>Add>Folder : Security ismini verdik dosya içerisine > Add>Class : APIKeyHandler.cs ismini verdik, DelegatingHandler’dan miras aldık, sendasync override yaptık
public class APIKeyHandler:DelegatingHandler
{
protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
return base.SendAsync(request, cancellationToken);
}
}
III. App_Start/WebApiConfig.cs’e gittik ve Register methoduna MessageHandler yakalayacağımızı tanımladık
config.MessageHandlers.Add(new APIKeyHandler()); //Handler yakalamak için ekledik. Herhangi bir unauthorize işleminde olunca APIKeyHandler çalışacak
IV. APIKey’i QueryString ya da Header’dan al. App_Start/WebApiConfig’e geldik methodumuzdan request parametresini alarak QueryString’e çevirdik
protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
var queryString = request.RequestUri.ParseQueryString();
var apiKey = queryString["apiKey"];
return base.SendAsync(request, cancellationToken);
}
V. Artık Bu apiKey’e ait bir User var mı yok mu kontrol etmemiz lazım. Projemiz iki katmanlıydı, Db işlemleri yapacağımız için DAL projesine geçtik ve User db işlemleri için UsersDAL isminde Class ekledik public yaptık ve methodumuzu yazdık
public UsersDAL
{
ProjectDbWebServicesEntities db = new ProjectDbWebServicesEntities();
public Users GetUsersByApiKey(string apiKey)
{
return db.Users.FirstOrDefault(x => x.UserKey.ToString() == apiKey);
}
}
VI. APIKeyHandler’a gittik ve override ettiğimiz methodu doldurduk. https://localhost:44366/api/languages?apiKey=1234 şeklinde istek gelince 1234 ApiKey’ini taşıyan kullanıcı varsa true yoksa null dönecek
protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
var queryString = request.RequestUri.ParseQueryString();
var apiKey = queryString["apiKey"];
UsersDAL usersDAL = new UsersDAL();
var user = usersDAL.GetUsersByApiKey(apiKey);
if (user != null)
{
}
else
{
}
return base.SendAsync(request, cancellationToken);
}
VII. Eğer isteği headerdan almak istersek yani https://localhost:44366/api/languages?apiKey=1234 değil de fiddler’da https://localhost:44366/api/languages’a girip body’de apiKey=1234 şekl göndermek istersek
APIKeyHandler’a gittik var queryString ve var apiKey’i yorum satırına alıp var apiKey = request.Headers.GetValues(“apiKey”).FirstOrDefault(); kodunu ekledik
protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
//var queryString = request.RequestUri.ParseQueryString();
//var apiKey = queryString["apiKey"];
var apiKey = request.Headers.GetValues("apiKey").FirstOrDefault();
UsersDAL usersDAL = new UsersDAL();
var user = usersDAL.GetUsersByApiKey(apiKey);
if (user != null)
{
var principal = new ClaimsPrincipal(new GenericIdentity(user.Name, "APIKey")); //Principal oluştur ve oturum açan kullanıcıya ata
HttpContext.Current.User = principal;
}
else
{
}
return base.SendAsync(request, cancellationToken);
}
//Denemek için fiddler açıp composer tabında https://localhost:44366/api/languages adresiyle birlikte üst alana apiKey: da8a2494-bc58-443c-8c94-b805c84b3a3c ifadesini ekleyerek GET isteğinde bulunduk
VIII. Son Olarak LanguagesController’da Oturun açan kullanıcı ismini döndüren bir ActionResult yazalım
[Authorize]
public IHttpActionResult GetSearchByName(string name)
{
return Ok("Name: " + User.Identity.Name);
}
//Kontrol için fiddlerda https://localhost:44366/api/languages?name=1234 ve apiKey: da8a2494-bc58-443c-8c94-b805c84b3a3c yazarak deneme yapabiliriz

Yorum bırakın