ASP.NET Web API : Token Based Authentication

This post is written in Turkish.

Merhaba arkadaşlar,

Şu sıralar uğraştığım bir proje gereği ASP.NET MVC, Web API üzerinde Authentication çalışmaları yapıyorum.

Bu yazıda normal şartlarda 401 [Unauthorized] döndüren bir Action’a bir Windows Phone veya Windows Store uygulamasından nasıl erişebileceğinizi, client’i nasıl yetkilendirebileceğinizi anlatmaya çalışacağım. Token based authentication‘u herhangi bir Http Client için gerçekleştirebiliyoruz.

Günümüzde geliştiriciler, web tabanlı uygulamalara ve mobil uygulamalara destek vermek zorundalar. Bu iki farklı uygulama tipi iki farklı yetkilendirme çeşidi gerektiriyor.

  • Cookie Authentication : Web tabanlı uygulamalar için,
  • Token Based Authentication : Mobil uygulamalar, ve browser tabanlı olmayan bir çok client çeşidi için.

Bu yazının başlığından da anlayacağınız üzere, bugün Token Based Authentication’u gerçekleyeceğiz.

1) Akışı Anlamak

oauth07

  1. Kullanıcı, client uygulamasında kullanıcı adı ve şifresini girer,
  2. Client, bu bilgileri Authorization Server‘a gönderir. (Authorization Server: Basitçe bize access tokenları veren sunucu)
  3. Authorization  Server, bu bilgileri doğrulayabilirse bir access token üretir, bu token’ı client’e döndürür.
  4. Kullanıcı, korunmuş bir kaynağa(normal şartlarda 401 döndüren) erişmek için bu access token‘ı Http Request’in Authorization header’ına ekler ve isteği öyle gönderir.

2) Web API’ın hazırlanması

İlk olarak ASP.NET Web API projemizi oluşturacağız.

–Visual Studio 2013’te ASP.NET Web Application projesi oluşturmanız gerekiyor.
1

–Karşınıza çıkacak olan template’lerden Web API’ı seçerek devam edelim. Authentication bölümünde Individual User Accounts seçili olmasına dikkat edin, eğer değil ise Change Authentication butonuna bastığınız zaman açılacak olan pencereden bu ayarı yapabilirsiniz.

2

OK’e bastığımız zaman projemiz oluşturulacak.

Projemiz oluştuğu zaman App_Start\Startup.Auth.cs dosyasına göz atalım. ConfigureAuth() metodunun içindeki OAuthOptions özelliğinin oluşturulduğu kısma bakalım,

OAuthOptions = new OAuthAuthorizationServerOptions
{
     TokenEndpointPath = new PathString("/Token"),
     Provider = new ApplicationOAuthProvider(PublicClientId),
     AuthorizeEndpointPath = new PathString("/api/Account/ExternalLogin"),
     AccessTokenExpireTimeSpan = TimeSpan.FromDays(14),
     AllowInsecureHttp = true
};

Burada Authorization Server’ın token yapılandırmasını yapıyoruz. İlk satırda bir access token almak isteyen istemcinin nereye istek göndereceği belirtiliyor. Mevcut senaryoda çağrının http://localhost:53214/Token yapılması gerekiyor.

İkinci satırda ise Authorization Server’ın hangi sağlayıcıyı kullanacağı bildiriliyor. AuthorizeEndpointPath ise token’ın Facebook, Twitter gibi sosyal ağlar aracılığıyla alınmak istendiğinde çağrının yapılması gereken adresi bildiriyor.

AccessTokenExpireTimeSpan ise aslında en önemli kısım, buradan alınacak token’ın geçerlilik süresini bildiriyoruz. Mevcut şartlarda istemci, aldığı token’ı 14 gün boyunca kullanır. 14.günün sonunda yine 401[Unauthorized] hatası alır.

3) Web API testi

Şimdi de Web API’ı test edeceğiz. Ctrl + F5 yaparak projeyi çalıştıralım, ve çalıştıktan sonra Fiddler’i kullanarak ana dizine bir istek gönderelim.

Fiddler en çok kullanılan Web Debug araçlarından biridir: http://www.telerik.com/fiddler

Telerik Fiddler açıldıktan sonra Composer sekmesinden localhostta çalışan Web API projesinin ana dizinine bir GET isteği gönderelim.

3

Sol tarafta bütün ağ trafiğini görebileceğiniz bir bölüm mevcut, isteği gönderdik ve gördüğünüz gibi 200(OK) döndü. Bu isteği yaptığımız yer HomeController‘ın Index Action’u idi.

Şimdi Index Action’unu [Authorize] özniteliği ile işaretleyeceğiz ve buraya erişmek isteyen istemciler, yetkilendirilmeden erişemeyecekler.

[Authorize]
public ActionResult Index()
{
    ViewBag.Title = "Home Page";
    return View();
}

Projeyi build edip biraz önce yaptığımız isteği tekrarlarsak 200(OK) yerine 401(Unauthorized) döndüğünü göreceğiz.

3

Artık buraya erişim için yetkilendirme gerekiyor. Biz de bu yetkilendirmeyi bir önceki bölümde bahsettiğimiz “/token” adresine birtakım parametrelerle çağrı yaparak sağlayacağız.

Tabii ki hepsinden önce, yetkilendirmek için veritabanına bir kullanıcı kaydetmemiz gerekiyor.

Fiddler’den “/api/account/register” konumuna bir POST çağrı yapacağız.

Çağrımızın gövdesinde; E-mail, parola ve tekrar parola göndermemiz gerekiyor. Bu register modeli, Models\AccountBindingModel.cs dosyasında tanımlı. Dilerseniz kayıt için gerekli alanları değiştirebilirsiniz.

Göndermemiz gereken HTTP Request’i şu şekilde;

POST http://localhost:26296/api/account/register HTTP/1.1
Content-Type: application/json

{"email":"fatihdumanli@live.com","password":"Sifre.1234","confirmPassword":"Sifre.1234"}

Bu request 200(OK) döndürdükten sonra, artık Web API’mızın bir kullanıcısı var. Şimdi bu kullanıcıyı Home/Index’e erişmesi için yetkilendireceğiz.

4) Kullanıcıyı Yetkilendirme

Kullanıcıyı yetkilendirmek için, korumalı içeriğimize HTTP çağrısı yaparken Request Header’ına Authorization isminde bir alanı dahil etmemiz gerekecek. Bu bölüme girmeden önce Bearer Token ne demek ondan kısaca bahsetmek istiyorum. OAuth, yani bizim bu yazıda yetkilendirme işlemi için kullandığımız açık standardın, 2.0 sürümüyle birlikte kullandığı bir token çeşididir. (http://tools.ietf.org/html/rfc6750).

Öncelikle biraz önce kaydettiğimiz kullanıcı için bir token almamız gerekiyor. Daha önce üzerinde durduğum gibi “/token” dizinine bir POST çağrısı yapmamız gerekiyor.

POST http://localhost:26296/Token HTTP/1.1
Content-Type: application/x-www-form-urlencoded

grant_type=password&username=fatihdumanli@live.com&password=Sifre.1234

4

Yukarıda gördüğünüz gibi request başarıyla sonuçlandı. Şimdi response’ın üzerine çift tıklayalım bakalım sunucu bize neler döndürmüş.

 

5

Yukarıda gördüğünüz üzere JSON formatında bir Token objesi döndü. 2 hafta geçerlilik süresi olan, fatihdumanli@live.com e-maili ile sistemde kayıtlı olan kullanıcıya ait bir token nesnesi.

Şimdi burada access token’ı kopyalayalım. Tekrar Fiddler’in Composer sekmesine giderek korumalı kaynağa (Home/Index)’e bu access token’ı kullanarak bir çağrı gerçekleştirelim.

 

6

Daha önce 401 döndüren kaynağa access token’ımızla birlikte Authorization header’ını ekledikten sonra 200 dönmeye başladı.

Normalde Windows Phone clientinde Token Based Authentication’u nasıl implement edeceğimizi de bu yazıda uzun uzun anlatmayı planlıyordum fakat bu yazı çok uzadı : )

Bunun yerine Windows Phone projesinin GitHub linkini paylaşıyorum.
GitHub: https://github.com/fatihdumanli/WindowsPhone_TokenBasedAuth

Bu yazıda ASP.NET Web API üzerinden browser tabanlı olmayan herhangi bir istemcinin korumalı bir kaynağa erişmesine olanak tanıyan Token Based Authentication ı açıklamaya çalıştım. Faydalı olması dileğiyle.

ASP.NET Web API : Token Based Authentication” üzerine 6 yorumlar

  1. ilk defa bu kadar sade ve temiz bir anlatımla karşılaştım. Teşekkür ederim. Başka hiçbir gereksiz detay olmadan sadece işe yarar bilgi var. Emeğinize sağlık

  2. cevaplarsanız çok büyük yardım etmiş olacaksınız : current user i nasıl yakalayacağım yani mvc de

    [authorize]
    public actionresult yap()
    {
    if ( Session[“isim”] == ‘aasd’ ) veya (HttpContext.Current.User.Identity.Name == ‘asd’)
    {
    }
    }
    diyerek yapıyorduk bunda nasıl yapabiliriz?

  3. Merhaba, ben de çağrının sorusunu soracağım. Bu şekilde login olmuş birimim UserId’sini nasıl alabiliriz.ClaimsIdentity nesnesi mi kullanılacak.

  4. Ya arkadaş internet te bulunan tüm örneklerin alayı mvc. Asp web form ile yapılanı yok mu? Bana o lazım.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir