Web Api Authentication işlemleri

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

WordPress.com'da bir web sitesi veya blog oluşturun

Yukarı ↑

WordPress.com ile böyle bir site tasarlayın
Başlayın