Asp.NET Core Identity – Facebook Login
Merhaba,
Birkaç yıl önce yazmış olduğum Asp.NET’te Facebook Login Uygulaması başlıklı içeriğimde Facebook üzerinden harici login işleminin nasıl yapıldığını incelemiştik. Zamanında oldukça popüler bir şekilde ilgi gören bu makale içerik ve teknik olarak artık mazide kalmış bulunmakta bu duruma istinaden kullandığımız yazılım çekirdekleri kat be kat geliştirilerek daha farklı yapılanmalara ihtiyaç doğurduğundan dolayı zaten var olan geçerliliğini koruyamamaktan dolayı rafa kaldırılmaktadır. Ee tabi çağın getirisi Facebook’da boş durmamakta ve API yapılanmasını daha da geliştirmesi üzerine bizde bu işlevi çağdaş yapılanmalarla(Asp.NET Core Identity) tekrar elden geçirme kararını vermiş bulunmaktayız.
Başlarken
İlk olarak Asp.NET Core altyapısında bir web uygulaması oluşturuyoruz. Zevkimize göre tasarım benimseyerek login vs. işlemleri için form tasarlıyoruz. Tüm bunların yanında Asp.NET Core Identity temellerinde IdentityDbContext, IdentityUser ve IdentityRole nesnelerimizi oluşturuyoruz ve veritabanını migrate ediyoruz. Oluşturulacak cookie değerinin ayarları için Startup dosyasında “AddIdentity” ve “ConfigureApplicationCookie” servislerini uygulamaya ekliyor ve ihtiyaca dönük konfigürasyonları sağlıyoruz. Tüm bu varsayılan hazırlıkları makalenin sonunda paylaştığım örnek projede inceleyebilirsiniz.
Bu temel hazırlıklar neticesinde ardından Facebook login işlemi için Facebook platformunda bir uygulama oluşturarak, sosyal ağ işlemlerine dair gerekli temeli orada da atmamız gerekmektedir.
Facebook Developer’dan Uygulama Oluşturma
Asp.NET Core Identity yapılanması üzerinden Facebook login yapabilmek için Facebook’un biz developerlara işimizi kolaylaştırmak ve gerekli konfigürasyonları hatasız sağlayabilmek için oluşturduğu https://developers.facebook.com/ adresindeki platformu sunmaktadır.
Şimdi bu platform üzerinden uygulamamızla Facebook arasındaki ilişkiyi sağlayacak olan temel konfigürasyonları gerçekleştirebilmek için aşağıdaki önergeleri takip etmeniz yeterlidir;
- 1. Adım
İlk olarak projemizi temsil edecek yeni bir uygulama oluşturmamız gerekmektedir.
Sayfanın sağ üst köşesindeki menüden “My Apps” sekmesine tıklayarak açılan pencerede “Create App” sekmesine tıklayalım.
- 2. Adım
Açılan pencerede proje adını ve email değerlerini belirtelim
- 3. Adım
Oluşturduğumuz uygulamaya “Facebook Login” productını yükleyelim.
- 4. Adım
Uygulamamızın hangi platformda çalışacağını belirtelim.
- 5. Adım
Uygulamamızın url’ini belirtelim.
- 6. Adım
Ve son olarak sol menüdeki “Products” kategorisi altındaki “Settings” sekmesine tıklayarak “Valid OAuth Redirect URIs” alanının karşısına aşağıdaki gibi “https://localhost:5001/signin-facebook” değerini yazalım. Bu değer, Facebook’un talebimizi gayri doğrulama ile neticelendirmesi durumunda hangi sayfaya dönüş sağlayacağını belirlemektedir.
Peki buraya ‘signin-facebook’ yazmamız zorunlu mu?
Hayır değildir. Bu değeri varsayılan olarak Identity mimarisi Facebook’a özel bizlere vermektedir. İsterseniz farklı bir değer yazabilir yahut birazdan göreceğiniz FacebookOptions değerlerinde CallbackPath ile istediğiniz gibi değiştirebilirsiniz.Her ne kadar birkaç satır sonra detaylıca inceleyecek olsakta şöyle ucundan kıyısından FacebookOptions konfigürasyonunu görelim…services.AddAuthentication().AddFacebook(x => { x.AppId = Configuration["FacebookAppId"]; x.AppSecret = Configuration["FacebookAppSecret"]; x.CallbackPath = new PathString("/User/Hata"); });
Evet, bu adımlardan sonra artık login işlemlerimizi yapmamızı sağlayacak uygulamamız hali hazırda demektir. Şimdi login talebinde nasıl bulunulduğunu ve bunun için hangi kütüphanelerin kullanıldığını inceleyelim.
Facebook Kütüphanesinin Kurulması
Facebook’da oluşturulan uygulama vasıtasıyla kullanıcılarımızın Facebook profilleri üzerinden web sitemize kayıt olmaları yahut varsa kayıtları giriş yapabilmeleri için uygulamaya Microsoft.AspNetCore.Authentication.Facebook kütüphanesinin yüklenmesi gerekmektedir.
Uygulamaya Facebook Authentication Ekleme
Facebook’a login talebinde bulunabilmek ve Identity mimarisinin Facebook üzerinden kimlik doğrulamasını sağlayabilmek için uygulamamıza Facebook Authentication kullanacağımızı bildirmemiz gerekmektedir. Bunun için Startup dosyasının içindeki “ConfigureServices” metodunda aşağıdaki çalışmayı gerçekleştirmemiz gerekmektedir.
public class Startup { public IConfiguration Configuration { get; set; } public Startup(IConfiguration configuration) { Configuration = configuration; } public void ConfigureServices(IServiceCollection services) { . . . services.AddAuthentication().AddFacebook(x => { x.AppId = Configuration["FacebookAppId"]; x.AppSecret = Configuration["FacebookAppSecret"]; }); . . . } }
Görüldüğü üzere “AddAuthentication” metodu ardından “AddFacebook” metodunu çağırarak uygulamamıza Facebook Authentication middleware’ini eklenmiş bulunmaktayız. Dikkat ederseniz ilgili metotta “AppId” ve “AppSecret” olmak üzere iki propertye değer girilmektedir. Bu değerleri yukarıda Facebook tarafında uygulama oluşturduğumuz https://developers.facebook.com/ adresinden edinmekteyiz.
Peki bu değerler nerede tutulmaktadır?
Bu değerler “Configuration” propertysi üzerinden gelmektedirler. Yani “appsettings.json” dosyasından. Lakin bizler genellikle bu ve bunun gibi kritik verileri “appsettings.json” dosyasında tutmaktansa uygulama derlendikten sonra güvenilirlik açısından daha ehemmiyetli olan alanlarda tutmayı yeğleriz. Bunun için .NET platformu uygulamada gizli verilerimizi güvenli bir şekilde tutmamızı sağlayabilmek için “secrets.json” dosyasını sunmaktadır. İlgili dosyayı açabilmek için;
“Solution Explorer” penceresinde projeye sağ tıklayarak “Manage User Secrets” sekmesine tıklamanız yeterlidir. Ardından açılan dosyaya aşağıdaki gibi “AppId” ve “AppSecret” verilerini depolamanız gerekmektedir.
Burada dikkat edilmesi gereken hususun, alan isimlerinin Startup dosyasındaki karşılıklarıyla aynı olduğuna dikkat edilmesi gerektiğidir.
Facebook’a Login Talebinde Bulunma
Kullanıcıların Facebook üzerinden giriş talebinde bulunabilmesi için bir action oluşturmamız ve o action üzerinden kullanıcıları Facebook’a doğru parametrelerle yönlendirmemiz gerekmektedir. Örneğin “User(Controller).cs” isimli controller içerisinde “FacebookLogin” isimli actionı bu işlem için tasarlayabiliriz.
public IActionResult FacebookLogin(string ReturnUrl) { string redirectUrl = Url.Action("FacebookResponse", "User", new { ReturnUrl = ReturnUrl }); //Facebook'a yapılan Login talebi neticesinde kullanıcıyı yönlendirmesini istediğimiz url'i oluşturuyoruz. AuthenticationProperties properties = _signInManager.ConfigureExternalAuthenticationProperties("Facebook", redirectUrl); //Bağlantı kurulacak harici platformun hangisi olduğunu belirtiyor ve bağlantı özelliklerini elde ediyoruz. return new ChallengeResult("Facebook", properties); //ChallengeResult; kimlik doğrulamak için gerekli olan tüm özellikleri kapsayan AuthenticationProperties nesnesini alır ve ayarlar. }
Yukarıdaki örnek kod bloğunu incelerseniz eğer; “SignInManager” nesnesinin “ConfigureExternalAuthenticationProperties” metodu sayesinde üretilen “AuthenticationProperties” nesnesi hangi platforma hangi özelliklerle bağlanacağımızın bilgisini tutmakta ve neticede “ChallengeResult” tipi sayesinde bu özelliklerde ilgili platforma bir talepte bulunulmaktadır. Burada ekstradan bir hususa değinmekte fayda vardır ki; o da, platform bilgisinin birebir aynı olması gerektiğidir. “Facebook” değerini; “FaceBook”, “facebOok” vs. gibi yanlış girmemeye bilakis örnektekiyle birebir aynı şekilde girmeye özen göstermeniz gerekmektedir.
Dönen Response’u İşleme
Yukarıda yapmış olduğumuz Facebook login talebi neticesinde gelen sonucu karşılayıp, kăh direkt olarak kăh kayıt oluşturarak oturum açmalı ve böylece bir şekilde işlememiz gerekmektedir. Bu işlem için yukarıdaki çalışmada gelen resultu “FacebookResponse” actionında karşılayacağımızı belirtmiş bulunduğumuzdan dolayı ilgili metodu oluşturup içerisinde aşağıdaki çalışmayı yapmamız yeterlidir.
public async Task<IActionResult> FacebookResponse(string ReturnUrl = "/") { ExternalLoginInfo loginInfo = await _signInManager.GetExternalLoginInfoAsync(); //Kullanıcıyla ilgili Facebook'tan gelen tüm bilgileri taşıyan nesnedir. //Bu nesnesnin 'LoginProvider' propertysinin değerine göz atarsanız eğer Facebook yazdığını göreceksiniz. //Eğer ki, Login işlemi Google yahut Twitter üzerinde gerçekleştirilmiş olsaydı provider olarak ilgili platformun adı yazacaktı. if (loginInfo == null) return RedirectToAction("Login"); else { Microsoft.AspNetCore.Identity.SignInResult loginResult = await _signInManager.ExternalLoginSignInAsync(loginInfo.LoginProvider, loginInfo.ProviderKey, true); //Giriş yapıyoruz. if (loginResult.Succeeded) return Redirect(ReturnUrl); else { //Eğer ki akış bu bloğa girerse ilgili kullanıcı uygulamamıza kayıt olmadığından dolayı girişi başarısız demektir. //O halde kayıt işlemini yapıp, ardından giriş yaptırmamız gerekmektedir. AppUser user = new AppUser { Email = loginInfo.Principal.FindFirst(ClaimTypes.Email).Value, UserName = loginInfo.Principal.FindFirst(ClaimTypes.Email).Value }; //Facebook'tan gelen Claimleri uygun eşlendikleri propertylere atıyoruz. IdentityResult createResult = await _userManager.CreateAsync(user); //Kullanıcı kaydını yapıyoruz. if (createResult.Succeeded) { //Eğer kayıt başarılıysa ilgili kullanıcı bilgilerini AspNetUserLogins tablosuna kaydetmemiz gerekmektedir ki //bir sonraki Facebook login talebinde Identity mimarisi ilgili kullanıcının Facebook'tan geldiğini anlayabilsin. IdentityResult addLoginResult = await _userManager.AddLoginAsync(user, loginInfo); //Kullanıcı bilgileri Facebook'tan gelen bilgileriyle AspNetUserLogins tablosunda eşleştirilmek suretiyle kaydedilmiştir. if (addLoginResult.Succeeded) { await _signInManager.SignInAsync(user, true); return Redirect(ReturnUrl); } } } } return Redirect(ReturnUrl); }
Yukarıdaki kod bloğunu incelerseniz eğer yapılan login isteği neticesinde kullanıcı bilgileri alınmakta ya direkt olarak giriş yaptırılmakta yahut yoksa kaydı yeni bir kayıt oluşturularak ardından giriş sağlanmaktadır. Her ne kadar yukarıdaki örnek kod bloğu içerisinde açıklama yapmış olsak dahi 31. satırdaki “AddLoginAsync” metodu ile kullanıcı bilgilerinin “AspNetUserLogins” tablosuna işlendiğini ve böylece Identity mekanizmasının bu kullanıcının hangi platformdan kayıt yaptığını bilebildiğini vurgulamakta fayda görüyorum.
Derleme, Çalıştırma, Test Etme
Tüm bu işlemlerden sonra uygulamamızı derleyip, çalıştıralım ve test edelim.
Yukarıdaki ekran görüntüsünde olduğu gibi başarılı bir şekilde Facebook login gerçekleştirilmiş bulunmaktadır. Login neticesinde veritabanımızda kullanıcı oluşturulmuş ve gerekli tablolar doldurulmuştur.
AspNetUsers | AspNetUserLogins |
---|---|
![]() |
![]() |
ExternalLoginSignInAsync İle SignInAsync Arasındaki Fark
Asp.NET Core Identity mimarisinde bir kullanıcının “ExternalLoginSignInAsync” metodu ile girişini sağlarsak o kullanıcının hangi ‘Üçüncü Taraf Kimlik Doğrulama’ platformu tarafından doğrulandığını claim üzerinden öğrenebilmekteyiz. Lakin “SignInAsync” metodundan giriş yapan kullanıcının claimleri arasında buna dair herhangi bir bilgi bulunmayacaktır.
SignInAsync | ExternalLoginSignInAsync |
---|---|
![]() |
![]() |
İlgilenenlerin faydalanması dileğiyle…
Sonraki yazılarımda görüşmek üzere…
İyi çalışmalar…
Not : Örnek çalışma projesini indirebilmek için buraya tıklayınız.
Hocam merhaba,
Bu işlemi api tarafında nasıl yapıyoruz. Orada farklı yapılması gereken işlemler var mı? apiden beslenen bir çok yer olabilir onun için soruyorum.