﻿
{"id":12858,"date":"2019-12-23T14:21:45","date_gmt":"2019-12-23T14:21:45","guid":{"rendered":"https:\/\/www.gencayyildiz.com\/blog\/?p=12858"},"modified":"2019-12-23T14:28:00","modified_gmt":"2019-12-23T14:28:00","slug":"asp-net-core-identity-facebook-login","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/asp-net-core-identity-facebook-login\/","title":{"rendered":"Asp.NET Core Identity &#8211; Facebook Login"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p>Merhaba,<\/p>\n<p>Birka\u00e7 y\u0131l \u00f6nce yazm\u0131\u015f oldu\u011fum <a href=\"https:\/\/www.gencayyildiz.com\/blog\/asp-nette-facebook-login-uygulamasi\/\" target=\"_blank\" rel=\"noopener noreferrer\">Asp.NET\u2019te Facebook Login Uygulamas\u0131<\/a> ba\u015fl\u0131kl\u0131 i\u00e7eri\u011fimde Facebook \u00fczerinden harici login i\u015fleminin nas\u0131l yap\u0131ld\u0131\u011f\u0131n\u0131 incelemi\u015ftik. Zaman\u0131nda olduk\u00e7a pop\u00fcler bir \u015fekilde ilgi g\u00f6ren bu makale i\u00e7erik ve teknik olarak art\u0131k mazide kalm\u0131\u015f bulunmakta bu duruma istinaden kulland\u0131\u011f\u0131m\u0131z yaz\u0131l\u0131m \u00e7ekirdekleri kat be kat geli\u015ftirilerek daha farkl\u0131 yap\u0131lanmalara ihtiya\u00e7 do\u011furdu\u011fundan dolay\u0131 zaten var olan ge\u00e7erlili\u011fini koruyamamaktan dolay\u0131 rafa kald\u0131r\u0131lmaktad\u0131r. Ee tabi \u00e7a\u011f\u0131n getirisi Facebook&#8217;da bo\u015f durmamakta ve API yap\u0131lanmas\u0131n\u0131 daha da geli\u015ftirmesi \u00fczerine bizde bu i\u015flevi \u00e7a\u011fda\u015f yap\u0131lanmalarla(<em>Asp.NET Core Identity<\/em>) tekrar elden ge\u00e7irme karar\u0131n\u0131 vermi\u015f bulunmaktay\u0131z.<\/p>\n<h3>Ba\u015flarken<\/h3>\n<p>\u0130lk olarak Asp.NET Core altyap\u0131s\u0131nda bir web uygulamas\u0131 olu\u015fturuyoruz. Zevkimize g\u00f6re tasar\u0131m benimseyerek login vs. i\u015flemleri i\u00e7in form tasarl\u0131yoruz. T\u00fcm bunlar\u0131n yan\u0131nda Asp.NET Core Identity temellerinde IdentityDbContext, IdentityUser ve IdentityRole nesnelerimizi olu\u015fturuyoruz ve veritaban\u0131n\u0131 migrate ediyoruz. Olu\u015fturulacak cookie de\u011ferinin ayarlar\u0131 i\u00e7in Startup dosyas\u0131nda &#8220;AddIdentity&#8221; ve &#8220;ConfigureApplicationCookie&#8221; servislerini uygulamaya ekliyor ve ihtiyaca d\u00f6n\u00fck konfig\u00fcrasyonlar\u0131 sa\u011fl\u0131yoruz. T\u00fcm bu varsay\u0131lan haz\u0131rl\u0131klar\u0131 makalenin sonunda payla\u015ft\u0131\u011f\u0131m \u00f6rnek projede inceleyebilirsiniz.<\/p>\n<p>Bu temel haz\u0131rl\u0131klar neticesinde ard\u0131ndan Facebook login i\u015flemi i\u00e7in Facebook platformunda bir uygulama olu\u015fturarak, sosyal a\u011f i\u015flemlerine dair gerekli temeli orada da atmam\u0131z gerekmektedir.<\/p>\n<h3>Facebook Developer&#8217;dan Uygulama Olu\u015fturma<\/h3>\n<p>Asp.NET Core Identity yap\u0131lanmas\u0131 \u00fczerinden Facebook login yapabilmek i\u00e7in Facebook&#8217;un biz developerlara i\u015fimizi kolayla\u015ft\u0131rmak ve gerekli konfig\u00fcrasyonlar\u0131 hatas\u0131z sa\u011flayabilmek i\u00e7in olu\u015fturdu\u011fu <a href=\"https:\/\/developers.facebook.com\/\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/developers.facebook.com\/<\/a> adresindeki platformu sunmaktad\u0131r.<\/p>\n<p>\u015eimdi bu platform \u00fczerinden uygulamam\u0131zla Facebook aras\u0131ndaki ili\u015fkiyi sa\u011flayacak olan temel konfig\u00fcrasyonlar\u0131 ger\u00e7ekle\u015ftirebilmek i\u00e7in a\u015fa\u011f\u0131daki \u00f6nergeleri takip etmeniz yeterlidir;<\/p>\n<ul>\n<li><strong>1. Ad\u0131m<\/strong><br \/>\n\u0130lk olarak projemizi temsil edecek yeni bir uygulama olu\u015fturmam\u0131z gerekmektedir.<br \/>\nSayfan\u0131n sa\u011f \u00fcst k\u00f6\u015fesindeki men\u00fcden &#8220;My Apps&#8221; sekmesine t\u0131klayarak a\u00e7\u0131lan pencerede &#8220;Create App&#8221; sekmesine t\u0131klayal\u0131m.<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/12\/Asp.NET-Core-Identity-Facebook-Login.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-12867\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/12\/Asp.NET-Core-Identity-Facebook-Login.png\" alt=\"Asp.NET Core Identity - Facebook Login\" width=\"572\" height=\"583\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/12\/Asp.NET-Core-Identity-Facebook-Login.png 572w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/12\/Asp.NET-Core-Identity-Facebook-Login-294x300.png 294w\" sizes=\"auto, (max-width: 572px) 100vw, 572px\" \/><\/a><\/li>\n<li><strong>2. Ad\u0131m<\/strong><br \/>\nA\u00e7\u0131lan pencerede proje ad\u0131n\u0131 ve email de\u011ferlerini belirtelim<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/12\/Asp.NET-Core-Identity-Facebook-Login-1.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-12870\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/12\/Asp.NET-Core-Identity-Facebook-Login-1.png\" alt=\"Asp.NET Core Identity - Facebook Login\" width=\"694\" height=\"301\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/12\/Asp.NET-Core-Identity-Facebook-Login-1.png 694w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/12\/Asp.NET-Core-Identity-Facebook-Login-1-300x130.png 300w\" sizes=\"auto, (max-width: 694px) 100vw, 694px\" \/><\/a><\/li>\n<li><strong>3. Ad\u0131m<\/strong><br \/>\nOlu\u015fturdu\u011fumuz uygulamaya &#8220;Facebook Login&#8221; product\u0131n\u0131 y\u00fckleyelim.<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/12\/Asp.NET-Core-Identity-Facebook-Login-2.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-12872\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/12\/Asp.NET-Core-Identity-Facebook-Login-2.png\" alt=\"Asp.NET Core Identity - Facebook Login\" width=\"978\" height=\"421\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/12\/Asp.NET-Core-Identity-Facebook-Login-2.png 978w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/12\/Asp.NET-Core-Identity-Facebook-Login-2-300x129.png 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/12\/Asp.NET-Core-Identity-Facebook-Login-2-768x331.png 768w\" sizes=\"auto, (max-width: 978px) 100vw, 978px\" \/><\/a><\/li>\n<li><strong>4. Ad\u0131m<\/strong><br \/>\nUygulamam\u0131z\u0131n hangi platformda \u00e7al\u0131\u015faca\u011f\u0131n\u0131 belirtelim.<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/12\/Asp.NET-Core-Identity-Facebook-Login-3.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-12875\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/12\/Asp.NET-Core-Identity-Facebook-Login-3.png\" alt=\"Asp.NET Core Identity - Facebook Login\" width=\"764\" height=\"251\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/12\/Asp.NET-Core-Identity-Facebook-Login-3.png 764w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/12\/Asp.NET-Core-Identity-Facebook-Login-3-300x99.png 300w\" sizes=\"auto, (max-width: 764px) 100vw, 764px\" \/><\/a><\/li>\n<li><strong>5. Ad\u0131m<\/strong><br \/>\nUygulamam\u0131z\u0131n url&#8217;ini belirtelim.<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/12\/Asp.NET-Core-Identity-Facebook-Login-4.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-12877\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/12\/Asp.NET-Core-Identity-Facebook-Login-4.png\" alt=\"Asp.NET Core Identity - Facebook Login\" width=\"921\" height=\"292\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/12\/Asp.NET-Core-Identity-Facebook-Login-4.png 921w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/12\/Asp.NET-Core-Identity-Facebook-Login-4-300x95.png 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/12\/Asp.NET-Core-Identity-Facebook-Login-4-768x243.png 768w\" sizes=\"auto, (max-width: 921px) 100vw, 921px\" \/><\/a><\/li>\n<li><strong>6. Ad\u0131m<\/strong><br \/>\nVe son olarak sol men\u00fcdeki &#8220;Products&#8221; kategorisi alt\u0131ndaki &#8220;Settings&#8221; sekmesine t\u0131klayarak &#8220;Valid OAuth Redirect URIs&#8221; alan\u0131n\u0131n kar\u015f\u0131s\u0131na a\u015fa\u011f\u0131daki gibi &#8220;https:\/\/localhost:5001\/signin-facebook&#8221; de\u011ferini yazal\u0131m. Bu de\u011fer, Facebook&#8217;un talebimizi gayri do\u011frulama ile neticelendirmesi durumunda hangi sayfaya d\u00f6n\u00fc\u015f sa\u011flayaca\u011f\u0131n\u0131 belirlemektedir.<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/12\/Asp.NET-Core-Identity-Facebook-Login-5.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-12879\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/12\/Asp.NET-Core-Identity-Facebook-Login-5.png\" alt=\"Asp.NET Core Identity - Facebook Login\" width=\"1503\" height=\"607\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/12\/Asp.NET-Core-Identity-Facebook-Login-5.png 1503w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/12\/Asp.NET-Core-Identity-Facebook-Login-5-300x121.png 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/12\/Asp.NET-Core-Identity-Facebook-Login-5-1024x414.png 1024w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/12\/Asp.NET-Core-Identity-Facebook-Login-5-768x310.png 768w\" sizes=\"auto, (max-width: 1503px) 100vw, 1503px\" \/><\/a><br \/>\n<em>Peki buraya &#8216;signin-facebook&#8217; yazmam\u0131z zorunlu mu?<\/em><br \/>\nHay\u0131r de\u011fildir. Bu de\u011feri varsay\u0131lan olarak Identity mimarisi Facebook&#8217;a \u00f6zel bizlere vermektedir. \u0130sterseniz farkl\u0131 bir de\u011fer yazabilir yahut birazdan g\u00f6rece\u011finiz FacebookOptions de\u011ferlerinde CallbackPath ile istedi\u011finiz gibi de\u011fi\u015ftirebilirsiniz.Her ne kadar birka\u00e7 sat\u0131r sonra detayl\u0131ca inceleyecek olsakta \u015f\u00f6yle ucundan k\u0131y\u0131s\u0131ndan FacebookOptions konfig\u00fcrasyonunu g\u00f6relim&#8230;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n            services.AddAuthentication().AddFacebook(x =&gt;\r\n            {\r\n                x.AppId = Configuration&#x5B;&quot;FacebookAppId&quot;];\r\n                x.AppSecret = Configuration&#x5B;&quot;FacebookAppSecret&quot;];\r\n                x.CallbackPath = new PathString(&quot;\/User\/Hata&quot;);\r\n            });\r\n<\/pre>\n<\/li>\n<\/ul>\n<p>Evet, bu ad\u0131mlardan sonra art\u0131k login i\u015flemlerimizi yapmam\u0131z\u0131 sa\u011flayacak uygulamam\u0131z hali haz\u0131rda demektir. \u015eimdi login talebinde nas\u0131l bulunuldu\u011funu ve bunun i\u00e7in hangi k\u00fct\u00fcphanelerin kullan\u0131ld\u0131\u011f\u0131n\u0131 inceleyelim.<\/p>\n<h3>Facebook K\u00fct\u00fcphanesinin Kurulmas\u0131<\/h3>\n<p>Facebook&#8217;da olu\u015fturulan uygulama vas\u0131tas\u0131yla kullan\u0131c\u0131lar\u0131m\u0131z\u0131n Facebook profilleri \u00fczerinden web sitemize kay\u0131t olmalar\u0131 yahut varsa kay\u0131tlar\u0131 giri\u015f yapabilmeleri i\u00e7in uygulamaya <a href=\"https:\/\/www.nuget.org\/packages\/Microsoft.AspNetCore.Authentication.Facebook\" target=\"_blank\" rel=\"noopener noreferrer\">Microsoft.AspNetCore.Authentication.Facebook<\/a> k\u00fct\u00fcphanesinin y\u00fcklenmesi gerekmektedir.<\/p>\n<h3>Uygulamaya Facebook Authentication Ekleme<\/h3>\n<p>Facebook&#8217;a login talebinde bulunabilmek ve Identity mimarisinin Facebook \u00fczerinden kimlik do\u011frulamas\u0131n\u0131 sa\u011flayabilmek i\u00e7in uygulamam\u0131za Facebook Authentication kullanaca\u011f\u0131m\u0131z\u0131 bildirmemiz gerekmektedir. Bunun i\u00e7in Startup dosyas\u0131n\u0131n i\u00e7indeki &#8220;ConfigureServices&#8221; metodunda a\u015fa\u011f\u0131daki \u00e7al\u0131\u015fmay\u0131 ger\u00e7ekle\u015ftirmemiz gerekmektedir.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public class Startup\r\n    {\r\n        public IConfiguration Configuration { get; set; }\r\n        public Startup(IConfiguration configuration)\r\n        {\r\n            Configuration = configuration;\r\n        }\r\n        public void ConfigureServices(IServiceCollection services)\r\n        {\r\n            .\r\n            .\r\n            .\r\n            services.AddAuthentication().AddFacebook(x =&gt;\r\n            {\r\n                x.AppId = Configuration&#x5B;&quot;FacebookAppId&quot;];\r\n                x.AppSecret = Configuration&#x5B;&quot;FacebookAppSecret&quot;];\r\n            });\r\n            .\r\n            .\r\n            .\r\n        }\r\n    }\r\n<\/pre>\n<p>G\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere &#8220;AddAuthentication&#8221; metodu ard\u0131ndan &#8220;AddFacebook&#8221; metodunu \u00e7a\u011f\u0131rarak uygulamam\u0131za Facebook Authentication middleware&#8217;ini eklenmi\u015f bulunmaktay\u0131z. Dikkat ederseniz ilgili metotta &#8220;AppId&#8221; ve &#8220;AppSecret&#8221; olmak \u00fczere iki propertye de\u011fer girilmektedir. Bu de\u011ferleri yukar\u0131da Facebook taraf\u0131nda uygulama olu\u015fturdu\u011fumuz <a href=\"https:\/\/developers.facebook.com\/\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/developers.facebook.com\/<\/a> adresinden edinmekteyiz.<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/12\/Asp.NET-Core-Identity-Facebook-Login-6.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-12900\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/12\/Asp.NET-Core-Identity-Facebook-Login-6.png\" alt=\"Asp.NET Core Identity - Facebook Login\" width=\"956\" height=\"172\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/12\/Asp.NET-Core-Identity-Facebook-Login-6.png 956w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/12\/Asp.NET-Core-Identity-Facebook-Login-6-300x54.png 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/12\/Asp.NET-Core-Identity-Facebook-Login-6-768x138.png 768w\" sizes=\"auto, (max-width: 956px) 100vw, 956px\" \/><\/a><br \/>\n<em>Peki bu de\u011ferler nerede tutulmaktad\u0131r?<\/em><br \/>\nBu de\u011ferler &#8220;Configuration&#8221; propertysi \u00fczerinden gelmektedirler. Yani &#8220;appsettings.json&#8221; dosyas\u0131ndan. Lakin bizler genellikle bu ve bunun gibi kritik verileri &#8220;appsettings.json&#8221; dosyas\u0131nda tutmaktansa uygulama derlendikten sonra g\u00fcvenilirlik a\u00e7\u0131s\u0131ndan daha ehemmiyetli olan alanlarda tutmay\u0131 ye\u011fleriz. Bunun i\u00e7in .NET platformu uygulamada gizli verilerimizi g\u00fcvenli bir \u015fekilde tutmam\u0131z\u0131 sa\u011flayabilmek i\u00e7in &#8220;secrets.json&#8221; dosyas\u0131n\u0131 sunmaktad\u0131r. \u0130lgili dosyay\u0131 a\u00e7abilmek i\u00e7in;<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/12\/Asp.NET-Core-Identity-Facebook-Login-7.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-12902\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/12\/Asp.NET-Core-Identity-Facebook-Login-7.png\" alt=\"Asp.NET Core Identity - Facebook Login\" width=\"324\" height=\"493\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/12\/Asp.NET-Core-Identity-Facebook-Login-7.png 324w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/12\/Asp.NET-Core-Identity-Facebook-Login-7-197x300.png 197w\" sizes=\"auto, (max-width: 324px) 100vw, 324px\" \/><\/a><br \/>\n&#8220;Solution Explorer&#8221; penceresinde projeye sa\u011f t\u0131klayarak &#8220;<em>Manage User Secrets<\/em>&#8221; sekmesine t\u0131klaman\u0131z yeterlidir. Ard\u0131ndan a\u00e7\u0131lan dosyaya a\u015fa\u011f\u0131daki gibi &#8220;AppId&#8221; ve &#8220;AppSecret&#8221; verilerini depolaman\u0131z gerekmektedir.<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/12\/Asp.NET-Core-Identity-Facebook-Login-8.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-12905\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/12\/Asp.NET-Core-Identity-Facebook-Login-8.png\" alt=\"Asp.NET Core Identity - Facebook Login\" width=\"725\" height=\"141\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/12\/Asp.NET-Core-Identity-Facebook-Login-8.png 725w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/12\/Asp.NET-Core-Identity-Facebook-Login-8-300x58.png 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/12\/Asp.NET-Core-Identity-Facebook-Login-8-720x141.png 720w\" sizes=\"auto, (max-width: 725px) 100vw, 725px\" \/><\/a><\/p>\n<p>Burada dikkat edilmesi gereken hususun, alan isimlerinin Startup dosyas\u0131ndaki kar\u015f\u0131l\u0131klar\u0131yla ayn\u0131 oldu\u011funa dikkat edilmesi gerekti\u011fidir.<\/p>\n<h3>Facebook&#8217;a Login Talebinde Bulunma<\/h3>\n<p>Kullan\u0131c\u0131lar\u0131n Facebook \u00fczerinden giri\u015f talebinde bulunabilmesi i\u00e7in bir action olu\u015fturmam\u0131z ve o action \u00fczerinden kullan\u0131c\u0131lar\u0131 Facebook&#8217;a do\u011fru parametrelerle y\u00f6nlendirmemiz gerekmektedir. \u00d6rne\u011fin &#8220;User(Controller).cs&#8221; isimli controller i\u00e7erisinde &#8220;FacebookLogin&#8221; isimli action\u0131 bu i\u015flem i\u00e7in tasarlayabiliriz.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n        public IActionResult FacebookLogin(string ReturnUrl)\r\n        {\r\n            string redirectUrl = Url.Action(&quot;FacebookResponse&quot;, &quot;User&quot;, new { ReturnUrl = ReturnUrl });\r\n            \/\/Facebook'a yap\u0131lan Login talebi neticesinde kullan\u0131c\u0131y\u0131 y\u00f6nlendirmesini istedi\u011fimiz url'i olu\u015fturuyoruz.\r\n            AuthenticationProperties properties = _signInManager.ConfigureExternalAuthenticationProperties(&quot;Facebook&quot;, redirectUrl);\r\n            \/\/Ba\u011flant\u0131 kurulacak harici platformun hangisi oldu\u011funu belirtiyor ve ba\u011flant\u0131 \u00f6zelliklerini elde ediyoruz.\r\n            return new ChallengeResult(&quot;Facebook&quot;, properties);\r\n            \/\/ChallengeResult; kimlik do\u011frulamak i\u00e7in gerekli olan t\u00fcm \u00f6zellikleri kapsayan AuthenticationProperties nesnesini al\u0131r ve ayarlar.\r\n        }\r\n<\/pre>\n<p>Yukar\u0131daki \u00f6rnek kod blo\u011funu incelerseniz e\u011fer; &#8220;SignInManager&#8221; nesnesinin &#8220;ConfigureExternalAuthenticationProperties&#8221; metodu sayesinde \u00fcretilen &#8220;AuthenticationProperties&#8221; nesnesi hangi platforma hangi \u00f6zelliklerle ba\u011flanaca\u011f\u0131m\u0131z\u0131n bilgisini tutmakta ve neticede &#8220;ChallengeResult&#8221; tipi sayesinde bu \u00f6zelliklerde ilgili platforma bir talepte bulunulmaktad\u0131r. Burada ekstradan bir hususa de\u011finmekte fayda vard\u0131r ki; o da, platform bilgisinin birebir ayn\u0131 olmas\u0131 gerekti\u011fidir. &#8220;Facebook&#8221; de\u011ferini; &#8220;FaceBook&#8221;, &#8220;facebOok&#8221; vs. gibi yanl\u0131\u015f girmemeye bilakis \u00f6rnektekiyle birebir ayn\u0131 \u015fekilde girmeye \u00f6zen g\u00f6stermeniz gerekmektedir.<\/p>\n<h3>D\u00f6nen Response&#8217;u \u0130\u015fleme<\/h3>\n<p>Yukar\u0131da yapm\u0131\u015f oldu\u011fumuz Facebook login talebi neticesinde gelen sonucu kar\u015f\u0131lay\u0131p, k\u0103h direkt olarak k\u0103h kay\u0131t olu\u015fturarak oturum a\u00e7mal\u0131 ve b\u00f6ylece bir \u015fekilde i\u015flememiz gerekmektedir. Bu i\u015flem i\u00e7in yukar\u0131daki \u00e7al\u0131\u015fmada gelen resultu &#8220;FacebookResponse&#8221; action\u0131nda kar\u015f\u0131layaca\u011f\u0131m\u0131z\u0131 belirtmi\u015f bulundu\u011fumuzdan dolay\u0131 ilgili metodu olu\u015fturup i\u00e7erisinde a\u015fa\u011f\u0131daki \u00e7al\u0131\u015fmay\u0131 yapmam\u0131z yeterlidir.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n        public async Task&lt;IActionResult&gt; FacebookResponse(string ReturnUrl = &quot;\/&quot;)\r\n        {\r\n            ExternalLoginInfo loginInfo = await _signInManager.GetExternalLoginInfoAsync();\r\n            \/\/Kullan\u0131c\u0131yla ilgili Facebook'tan gelen t\u00fcm bilgileri ta\u015f\u0131yan nesnedir.\r\n            \/\/Bu nesnesnin 'LoginProvider' propertysinin de\u011ferine g\u00f6z atarsan\u0131z e\u011fer Facebook yazd\u0131\u011f\u0131n\u0131 g\u00f6receksiniz.\r\n            \/\/E\u011fer ki, Login i\u015flemi Google yahut Twitter \u00fczerinde ger\u00e7ekle\u015ftirilmi\u015f olsayd\u0131 provider olarak ilgili platformun ad\u0131 yazacakt\u0131.\r\n            if (loginInfo == null)\r\n                return RedirectToAction(&quot;Login&quot;);\r\n            else\r\n            {\r\n                Microsoft.AspNetCore.Identity.SignInResult loginResult = await _signInManager.ExternalLoginSignInAsync(loginInfo.LoginProvider, loginInfo.ProviderKey, true);\r\n                \/\/Giri\u015f yap\u0131yoruz.\r\n                if (loginResult.Succeeded)\r\n                    return Redirect(ReturnUrl);\r\n                else\r\n                {\r\n                    \/\/E\u011fer ki ak\u0131\u015f bu blo\u011fa girerse ilgili kullan\u0131c\u0131 uygulamam\u0131za kay\u0131t olmad\u0131\u011f\u0131ndan dolay\u0131 giri\u015fi ba\u015far\u0131s\u0131z demektir.\r\n                    \/\/O halde kay\u0131t i\u015flemini yap\u0131p, ard\u0131ndan giri\u015f yapt\u0131rmam\u0131z gerekmektedir.\r\n                    AppUser user = new AppUser\r\n                    {\r\n                        Email = loginInfo.Principal.FindFirst(ClaimTypes.Email).Value,\r\n                        UserName = loginInfo.Principal.FindFirst(ClaimTypes.Email).Value\r\n                    };\r\n                    \/\/Facebook'tan gelen Claimleri uygun e\u015flendikleri propertylere at\u0131yoruz.\r\n                    IdentityResult createResult = await _userManager.CreateAsync(user);\r\n                    \/\/Kullan\u0131c\u0131 kayd\u0131n\u0131 yap\u0131yoruz.\r\n                    if (createResult.Succeeded)\r\n                    {\r\n                        \/\/E\u011fer kay\u0131t ba\u015far\u0131l\u0131ysa ilgili kullan\u0131c\u0131 bilgilerini AspNetUserLogins tablosuna kaydetmemiz gerekmektedir ki\r\n                        \/\/bir sonraki Facebook login talebinde Identity mimarisi ilgili kullan\u0131c\u0131n\u0131n Facebook'tan geldi\u011fini anlayabilsin.\r\n                        IdentityResult addLoginResult = await _userManager.AddLoginAsync(user, loginInfo);\r\n                        \/\/Kullan\u0131c\u0131 bilgileri Facebook'tan gelen bilgileriyle AspNetUserLogins tablosunda e\u015fle\u015ftirilmek suretiyle kaydedilmi\u015ftir.\r\n                        if (addLoginResult.Succeeded)\r\n                        {\r\n                            await _signInManager.SignInAsync(user, true);\r\n                            return Redirect(ReturnUrl);\r\n                        }\r\n                    }\r\n\r\n                }\r\n            }\r\n            return Redirect(ReturnUrl);\r\n        }\r\n<\/pre>\n<p>Yukar\u0131daki kod blo\u011funu incelerseniz e\u011fer yap\u0131lan login iste\u011fi neticesinde kullan\u0131c\u0131 bilgileri al\u0131nmakta ya direkt olarak giri\u015f yapt\u0131r\u0131lmakta yahut yoksa kayd\u0131 yeni bir kay\u0131t olu\u015fturularak ard\u0131ndan giri\u015f sa\u011flanmaktad\u0131r. Her ne kadar yukar\u0131daki \u00f6rnek kod blo\u011fu i\u00e7erisinde a\u00e7\u0131klama yapm\u0131\u015f olsak dahi 31. sat\u0131rdaki &#8220;AddLoginAsync&#8221; metodu ile kullan\u0131c\u0131 bilgilerinin &#8220;AspNetUserLogins&#8221; tablosuna i\u015flendi\u011fini ve b\u00f6ylece Identity mekanizmas\u0131n\u0131n bu kullan\u0131c\u0131n\u0131n hangi platformdan kay\u0131t yapt\u0131\u011f\u0131n\u0131 bilebildi\u011fini vurgulamakta fayda g\u00f6r\u00fcyorum.<\/p>\n<h3>Derleme, \u00c7al\u0131\u015ft\u0131rma, Test Etme<\/h3>\n<p>T\u00fcm bu i\u015flemlerden sonra uygulamam\u0131z\u0131 derleyip, \u00e7al\u0131\u015ft\u0131ral\u0131m ve test edelim.<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/12\/Asp.NET-Core-Identity-Facebook-Login.gif\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-12923\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/12\/Asp.NET-Core-Identity-Facebook-Login.gif\" alt=\"Asp.NET Core Identity - Facebook Login\" width=\"800\" height=\"430\" \/><\/a><\/p>\n<p>Yukar\u0131daki ekran g\u00f6r\u00fcnt\u00fcs\u00fcnde oldu\u011fu gibi ba\u015far\u0131l\u0131 bir \u015fekilde Facebook login ger\u00e7ekle\u015ftirilmi\u015f bulunmaktad\u0131r. Login neticesinde veritaban\u0131m\u0131zda kullan\u0131c\u0131 olu\u015fturulmu\u015f ve gerekli tablolar doldurulmu\u015ftur.<\/p>\n<table>\n<thead>\n<tr>\n<th>AspNetUsers<\/th>\n<th>AspNetUserLogins<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/12\/Asp.NET-Core-Identity-Facebook-Login-9.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-12925\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/12\/Asp.NET-Core-Identity-Facebook-Login-9.png\" alt=\"Asp.NET Core Identity - Facebook Login\" width=\"998\" height=\"90\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/12\/Asp.NET-Core-Identity-Facebook-Login-9.png 998w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/12\/Asp.NET-Core-Identity-Facebook-Login-9-300x27.png 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/12\/Asp.NET-Core-Identity-Facebook-Login-9-768x69.png 768w\" sizes=\"auto, (max-width: 998px) 100vw, 998px\" \/><\/a><\/td>\n<td><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/12\/Asp.NET-Core-Identity-Facebook-Login-10.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-12926\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/12\/Asp.NET-Core-Identity-Facebook-Login-10.png\" alt=\"Asp.NET Core Identity - Facebook Login\" width=\"494\" height=\"69\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/12\/Asp.NET-Core-Identity-Facebook-Login-10.png 494w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/12\/Asp.NET-Core-Identity-Facebook-Login-10-300x42.png 300w\" sizes=\"auto, (max-width: 494px) 100vw, 494px\" \/><\/a><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3>ExternalLoginSignInAsync \u0130le SignInAsync Aras\u0131ndaki Fark<\/h3>\n<p>Asp.NET Core Identity mimarisinde bir kullan\u0131c\u0131n\u0131n &#8220;ExternalLoginSignInAsync&#8221; metodu ile giri\u015fini sa\u011flarsak o kullan\u0131c\u0131n\u0131n hangi &#8216;\u00dc\u00e7\u00fcnc\u00fc Taraf Kimlik Do\u011frulama&#8217; platformu taraf\u0131ndan do\u011fruland\u0131\u011f\u0131n\u0131 claim \u00fczerinden \u00f6\u011frenebilmekteyiz. Lakin &#8220;SignInAsync&#8221; metodundan giri\u015f yapan kullan\u0131c\u0131n\u0131n claimleri aras\u0131nda buna dair herhangi bir bilgi bulunmayacakt\u0131r.<\/p>\n<table>\n<thead>\n<tr>\n<th>SignInAsync<\/th>\n<th>ExternalLoginSignInAsync<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/12\/Asp.NET-Core-Identity-Facebook-Login-11.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-12928\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/12\/Asp.NET-Core-Identity-Facebook-Login-11.png\" alt=\"Asp.NET Core Identity - Facebook Login\" width=\"572\" height=\"127\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/12\/Asp.NET-Core-Identity-Facebook-Login-11.png 572w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/12\/Asp.NET-Core-Identity-Facebook-Login-11-300x67.png 300w\" sizes=\"auto, (max-width: 572px) 100vw, 572px\" \/><\/a><\/td>\n<td><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/12\/Asp.NET-Core-Identity-Facebook-Login-12.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-12929\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/12\/Asp.NET-Core-Identity-Facebook-Login-12.png\" alt=\"Asp.NET Core Identity - Facebook Login\" width=\"573\" height=\"139\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/12\/Asp.NET-Core-Identity-Facebook-Login-12.png 573w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/12\/Asp.NET-Core-Identity-Facebook-Login-12-300x73.png 300w\" sizes=\"auto, (max-width: 573px) 100vw, 573px\" \/><\/a><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u0130lgilenenlerin faydalanmas\u0131 dile\u011fiyle&#8230;<br \/>\nSonraki yaz\u0131lar\u0131mda g\u00f6r\u00fc\u015fmek \u00fczere&#8230;<br \/>\n\u0130yi \u00e7al\u0131\u015fmalar&#8230;<\/p>\n<p>Not : \u00d6rnek \u00e7al\u0131\u015fma projesini indirebilmek i\u00e7in <a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/12\/FacebookLoginExample.rar\">buraya<\/a> t\u0131klay\u0131n\u0131z.<\/p>\n<!-- AddThis Advanced Settings generic via filter on the_content --><!-- AddThis Share Buttons generic via filter on the_content -->","protected":false},"excerpt":{"rendered":"<p>Merhaba, Birka\u00e7 y\u0131l \u00f6nce yazm\u0131\u015f oldu\u011fum Asp.NET\u2019te Facebook Login Uygulamas\u0131 ba\u015fl\u0131kl\u0131 i\u00e7eri\u011fimde Facebook \u00fczerinden harici login i\u015fleminin nas\u0131l yap\u0131ld\u0131\u011f\u0131n\u0131 incelemi\u015ftik. Zaman\u0131nda olduk\u00e7a pop\u00fcler bir \u015fekilde ilgi g\u00f6ren bu makale i\u00e7erik ve teknik olarak art\u0131k&#46;&#46;&#46;<!-- AddThis Advanced Settings generic via filter on get_the_excerpt --><!-- AddThis Share Buttons generic via filter on get_the_excerpt --><\/p>\n","protected":false},"author":1,"featured_media":12936,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3033,3101,3103],"tags":[2952,3098,3105,3099,3100,3104],"class_list":["post-12858","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-net-core-3-0","category-net-core-3-1","category-asp-net-core-3-1","tag-asp-net-core-identity","tag-asp-net-core-identity-facebook-login","tag-externalloginsigninasync","tag-facebook-login","tag-identity-facebook-login","tag-secrets-json"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/12858","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/comments?post=12858"}],"version-history":[{"count":57,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/12858\/revisions"}],"predecessor-version":[{"id":12940,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/12858\/revisions\/12940"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media\/12936"}],"wp:attachment":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media?parent=12858"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=12858"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=12858"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}