﻿
{"id":11755,"date":"2019-08-14T23:15:22","date_gmt":"2019-08-14T23:15:22","guid":{"rendered":"https:\/\/www.gencayyildiz.com\/blog\/?p=11755"},"modified":"2019-08-14T23:16:08","modified_gmt":"2019-08-14T23:16:08","slug":"asp-net-core-identity-sifre-validasyon-ayarlari-ve-ipasswordvalidator-arayuzu-vi","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/asp-net-core-identity-sifre-validasyon-ayarlari-ve-ipasswordvalidator-arayuzu-vi\/","title":{"rendered":"Asp.NET Core Identity &#8211; \u015eifre Validasyon Ayarlar\u0131 ve IPasswordValidator Aray\u00fcz\u00fc &#8211; VI"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p>Merhaba,<\/p>\n<p><a href=\"https:\/\/www.gencayyildiz.com\/blog\/asp-net-core-identity-yazi-dizisi\/\" rel=\"noopener noreferrer\" target=\"_blank\">Asp.NET Core Identity yaz\u0131 dizimizin<\/a> 6. makalesinde, kullan\u0131c\u0131 \u00fcye olurken varsay\u0131lan \u015fifre validasyon ayarlar\u0131n\u0131n de\u011fi\u015ftirilmesini ve bunun yan\u0131nda IPasswordValidator aray\u00fcz\u00fc ile kendimize \u00f6zel validasyon yap\u0131lanmas\u0131n\u0131 olu\u015fturmay\u0131 inceleyece\u011fiz.<\/p>\n<p>Her\u015feyden \u00f6nce bir \u00f6nceki <a href=\"https:\/\/www.gencayyildiz.com\/blog\/asp-net-core-identity-usermanager-sinifi-ile-kullanici-yonetimi-v\/\" rel=\"noopener noreferrer\" target=\"_blank\">UserManager S\u0131n\u0131f\u0131 \u0130le Kullan\u0131c\u0131 Y\u00f6netimi<\/a> ba\u015fl\u0131kl\u0131 makalemizde kullan\u0131c\u0131n\u0131n UserManager s\u0131n\u0131f\u0131n\u0131 kullanarak nas\u0131l \u00fcye oldu\u011funu incelemi\u015ftik. \u0130lgili makaleye g\u00f6z atarsan\u0131z e\u011fer \u00fcyelik i\u015flemlerini &#8220;User(Controller).cs&#8221; controller s\u0131n\u0131f\u0131ndaki &#8220;SignIn&#8221; action metodunda ger\u00e7ekle\u015ftirdik. \u0130lgili metodun son halini a\u015fa\u011f\u0131ya al\u0131p incelersek e\u011fer;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n        &#x5B;HttpPost]\r\n        public async Task&lt;IActionResult&gt; SignIn(AppUserViewModel appUserViewModel)\r\n        {\r\n            if (ModelState.IsValid)\r\n            {\r\n                AppUser appUser = new AppUser\r\n                {\r\n                    UserName = appUserViewModel.UserName,\r\n                    Email = appUserViewModel.Email\r\n                };\r\n                IdentityResult result = await _userManager.CreateAsync(appUser, appUserViewModel.Sifre);\r\n                if (result.Succeeded)\r\n                    return RedirectToAction(&quot;Index&quot;);\r\n            }\r\n            return View();\r\n        }\r\n<\/pre>\n<p>Post edilen &#8220;AppUserViewModel&#8221; tipindeki viewmodel nesnemizin t\u00fcm validasyonlar\u0131 ge\u00e7erliyse e\u011fer 11. sat\u0131rda kay\u0131t i\u015flemini ger\u00e7ekle\u015ftiriyoruz. 12. sat\u0131rda yap\u0131lan kontrol neticesinde, e\u011fer kay\u0131t ba\u015far\u0131l\u0131ysa kullan\u0131c\u0131y\u0131 &#8220;Index&#8221; action\u0131na y\u00f6nlendiriyoruz. Yok e\u011fer kay\u0131t ge\u00e7erli de\u011filse demek ki validasyon d\u0131\u015f\u0131nda s\u00fcre\u00e7te bir hata var demektir. \u0130\u015fte bu hatalar kullan\u0131c\u0131dan gelen \u015fifreyle alakal\u0131d\u0131r. 11. sat\u0131rda &#8220;CreateAsync&#8221; metoduna ikinci parametre olarak verilen \u015fifre Identity mekanizmas\u0131n\u0131n varsay\u0131lan validasyonlar\u0131na tak\u0131lm\u0131\u015f demektir.<\/p>\n<p>Dolay\u0131s\u0131yla varsay\u0131lan password validasyonlar\u0131na uygun olmayan \u015fifreler girildi\u011fi taktirde &#8220;IdentityResult&#8221; bizlere hangi validasyonlar oldu\u011funa dair &#8220;Errors&#8221; propertysi ile bilgi verecektir. Bunuda a\u015fa\u011f\u0131daki gibi &#8220;ModelState&#8221; nesnesine y\u00fckleyerek son kullan\u0131c\u0131ya hata mesaj\u0131 olarak iletebiliriz.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n        &#x5B;HttpPost]\r\n        public async Task&lt;IActionResult&gt; SignIn(AppUserViewModel appUserViewModel)\r\n        {\r\n            if (ModelState.IsValid)\r\n            {\r\n                AppUser appUser = new AppUser\r\n                {\r\n                    UserName = appUserViewModel.UserName,\r\n                    Email = appUserViewModel.Email\r\n                };\r\n                IdentityResult result = await _userManager.CreateAsync(appUser, appUserViewModel.Sifre);\r\n                if (result.Succeeded)\r\n                    return RedirectToAction(&quot;Index&quot;);\r\n                else\r\n                    result.Errors.ToList().ForEach(e =&gt; ModelState.AddModelError(e.Code, e.Description));\r\n            }\r\n            return View();\r\n        }\r\n<\/pre>\n<p>15. sat\u0131ra g\u00f6z atarsan\u0131z e\u011fer &#8220;IdentityResult&#8221; nesnesinde gelen &#8220;Errors&#8221; propertysindeki t\u00fcm hatalar &#8220;ModelState&#8221; nesnesine &#8220;AddModelError&#8221; metoduyla eklenmi\u015ftir. Bu i\u015flem neticesinde kullan\u0131c\u0131 girmi\u015f oldu\u011fu t\u00fcm hatal\u0131 \u015fifreler y\u00fcz\u00fcnden a\u015fa\u011f\u0131daki gibi bilgilendirilecektir.<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/08\/Asp.NET-Core-Identity-\u015eifre-Validasyon-Ayarlar\u0131-ve-IPasswordValidator-Aray\u00fcz\u00fc-VI.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/08\/Asp.NET-Core-Identity-\u015eifre-Validasyon-Ayarlar\u0131-ve-IPasswordValidator-Aray\u00fcz\u00fc-VI.jpg\" alt=\"Asp.NET Core Identity - \u015eifre Validasyon Ayarlar\u0131 ve IPasswordValidator Aray\u00fcz\u00fc - VI\" width=\"451\" height=\"267\" class=\"aligncenter size-full wp-image-11763\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/08\/Asp.NET-Core-Identity-\u015eifre-Validasyon-Ayarlar\u0131-ve-IPasswordValidator-Aray\u00fcz\u00fc-VI.jpg 451w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/08\/Asp.NET-Core-Identity-\u015eifre-Validasyon-Ayarlar\u0131-ve-IPasswordValidator-Aray\u00fcz\u00fc-VI-300x178.jpg 300w\" sizes=\"auto, (max-width: 451px) 100vw, 451px\" \/><\/a><br \/>\nG\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere Identity mekanizmas\u0131 taraf\u0131ndan varsay\u0131lan olarak gelen validasyonlara tak\u0131ld\u0131\u011f\u0131m\u0131z vakit bu hata mesajlar\u0131yla kar\u015f\u0131la\u015f\u0131lmaktad\u0131r. <\/p>\n<p><em>&#8220;Peki hoca, bu hata mesajlar\u0131n\u0131 nas\u0131l de\u011fi\u015ftirebiliyoruz?&#8221;<\/em>, <em>&#8220;\u015fifrede istemedi\u011fim validasyonlar\u0131 nas\u0131l kald\u0131rabilirim?&#8221;<\/em> vs. gibi sorular\u0131n\u0131z\u0131 duyar gibiyim&#8230; Tamam sakin olun. Bu makalede zaten bu ve buna benzer t\u00fcm sorular\u0131n cevaplar\u0131n\u0131 vermeye \u00e7al\u0131\u015faca\u011f\u0131z.<\/p>\n<p>\u015eimdi ilk olarak varsay\u0131lan validasyon ayarlar\u0131yla oynamay\u0131 inceleyelim.<\/p>\n<h3>Varsay\u0131lan Password Validasyon Ayarlar\u0131n\u0131 De\u011fi\u015ftirme<\/h3>\n<p>Bunun i\u00e7in &#8220;Startup.cs&#8221; dosyas\u0131na gitmemiz gerekmektedir. &#8220;ConfigureServices&#8221; i\u00e7erisinde &#8220;AddIdentity&#8221; metodu ile uygulamaya dahil edilen Identity mekanizmas\u0131na 8. sat\u0131rda oldu\u011fu gibi belirli i\u015flemler yap\u0131lmaktad\u0131r.<\/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) =&gt; Configuration = configuration;\r\n        public void ConfigureServices(IServiceCollection services)\r\n        {\r\n            services.AddDbContext&lt;AppDbContext&gt;(_ =&gt; _.UseSqlServer(Configuration&#x5B;&quot;ConnectionStrings:SqlServerConnectionString&quot;]));\r\n            services.AddIdentity&lt;AppUser, AppRole&gt;(_ =&gt;\r\n            {\r\n                _.Password.RequiredLength = 5; \/\/En az ka\u00e7 karakterli olmas\u0131 gerekti\u011fini belirtiyoruz.\r\n                _.Password.RequireNonAlphanumeric = false; \/\/Alfanumerik zorunlulu\u011funu kald\u0131r\u0131yoruz.\r\n                _.Password.RequireLowercase = false; \/\/K\u00fc\u00e7\u00fck harf zorunlulu\u011funu kald\u0131r\u0131yoruz.\r\n                _.Password.RequireUppercase = false; \/\/B\u00fcy\u00fck harf zorunlulu\u011funu kald\u0131r\u0131yoruz.\r\n                _.Password.RequireDigit = false; \/\/0-9 aras\u0131 say\u0131sal karakter zorunlulu\u011funu kald\u0131r\u0131yoruz.\r\n            }).AddEntityFrameworkStores&lt;AppDbContext&gt;();\r\n            services.AddMvc();\r\n        }\r\n\r\n        public void Configure(IApplicationBuilder app, IHostingEnvironment env)\r\n        {\r\n            if (env.IsDevelopment())\r\n                app.UseDeveloperExceptionPage();\r\n\r\n            app.UseStatusCodePages();\r\n            app.UseStaticFiles();\r\n            app.UseAuthentication();\r\n            app.UseMvc(_ =&gt; _.MapRoute(&quot;Default&quot;, &quot;{controller=Home}\/{action=Index}\/{id?}&quot;));\r\n        }\r\n    }\r\n<\/pre>\n<p>Bu i\u015flemler, ilgili kod sat\u0131rlar\u0131nda a\u00e7\u0131klamalar\u0131yla belirtildi\u011fi gibi varsay\u0131lan olarak gelen validasyon ayarlar\u0131 \u00fczerine ger\u00e7ekle\u015ftirilmektedirler.<\/p>\n<p>Evet&#8230; Varsay\u0131lan validasyon ayarlar\u0131n\u0131 istedi\u011fimiz gibi \u015fekillendirmeyi g\u00f6rd\u00fck. <em><strong>Peki \u00f6zel validasyonlar\u0131 nas\u0131l olu\u015fturaca\u011f\u0131z?<\/strong><\/em> sorusunu sorarsak e\u011fer bunun i\u00e7inde IPasswordValidator aray\u00fcz\u00fcn\u00fc kullanmam\u0131z gerekecektir.<\/p>\n<h3>IPasswordValidator Aray\u00fcz\u00fc \u0130le \u00d6zel Validasyon Geli\u015ftirme<\/h3>\n<p>IPasswordValidator aray\u00fcz\u00fc, \u00f6zelle\u015ftirilmi\u015f validasyonlar\u0131m\u0131z\u0131 geli\u015ftirebilmek i\u00e7in tasarlanm\u0131\u015f bir aray\u00fczd\u00fcr. \u0130lgili aray\u00fcz\u00fcn i\u00e7eri\u011fini \u015f\u00f6yle bir incelersek e\u011fer;<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/08\/Asp.NET-Core-Identity-\u015eifre-Validasyon-Ayarlar\u0131-ve-IPasswordValidator-Aray\u00fcz\u00fc-VI-1.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/08\/Asp.NET-Core-Identity-\u015eifre-Validasyon-Ayarlar\u0131-ve-IPasswordValidator-Aray\u00fcz\u00fc-VI-1.jpg\" alt=\"Asp.NET Core Identity - \u015eifre Validasyon Ayarlar\u0131 ve IPasswordValidator Aray\u00fcz\u00fc - VI\" width=\"706\" height=\"140\" class=\"aligncenter size-full wp-image-11777\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/08\/Asp.NET-Core-Identity-\u015eifre-Validasyon-Ayarlar\u0131-ve-IPasswordValidator-Aray\u00fcz\u00fc-VI-1.jpg 706w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/08\/Asp.NET-Core-Identity-\u015eifre-Validasyon-Ayarlar\u0131-ve-IPasswordValidator-Aray\u00fcz\u00fc-VI-1-300x59.jpg 300w\" sizes=\"auto, (max-width: 706px) 100vw, 706px\" \/><\/a><br \/>\ng\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere uygulamada kullan\u0131c\u0131 y\u00f6netimini sa\u011flayan UserManager nesnesi, \u00fcyelik bilgileri doldurulan kullan\u0131c\u0131 nesnesi ve ilgili kullan\u0131c\u0131ya atanmaya \u00e7al\u0131\u015f\u0131lan password bilgileri &#8220;ValidateAsync&#8221; metoduna parametre olarak gelmektedir ve b\u00f6ylece \u00f6zelle\u015ftirilmi\u015f validasyonlar\u0131m\u0131z\u0131 tasarlarken elimizin alt\u0131nda t\u00fcm nesnelerimiz mevcut olmu\u015f olacakt\u0131r.<\/p>\n<p>\u00d6zelle\u015ftirilmi\u015f validasyonlar\u0131m\u0131z\u0131 tasarlayabilmek i\u00e7in IPasswordValidator aray\u00fcz\u00fcnden miras alan bir s\u0131n\u0131f olu\u015fturmam\u0131z gerekmektedir. Bunun i\u00e7in projenizin istedi\u011finiz herhangi bir noktas\u0131nda gerekli \u00e7al\u0131\u015fmay\u0131 ger\u00e7ekle\u015ftirebilirsiniz. Ben makale dizimizde kulland\u0131\u011f\u0131m \u00f6rnek projenin ana dizininde &#8220;CustomValidations&#8221; isminde bir klas\u00f6r olu\u015fturuyorum ve i\u00e7erisine &#8220;CustomPasswordValidation&#8221; isminde bir s\u0131n\u0131f ekliyorum. Bu s\u0131n\u0131f i\u00e7eri\u011fini a\u015fa\u011f\u0131daki gibi geli\u015ftirebilirsiniz;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public class CustomPasswordValidation : IPasswordValidator&lt;AppUser&gt;\r\n    {\r\n        public Task&lt;IdentityResult&gt; ValidateAsync(UserManager&lt;AppUser&gt; manager, AppUser user, string password)\r\n        {\r\n            List&lt;IdentityError&gt; errors = new List&lt;IdentityError&gt;();\r\n            if (password.Length &lt; 5) \/\/Password karakter say\u0131s\u0131\r\n                errors.Add(new IdentityError { Code = &quot;PasswordLength&quot;, Description = &quot;L\u00fctfen \u015fifreyi en az 5 karakter giriniz.&quot; });\r\n            if (password.ToLower().Contains(user.UserName.ToLower())) \/\/Password i\u00e7erisinde username kontrol\u00fc\r\n                errors.Add(new IdentityError { Code = &quot;PasswordContainsUserName&quot;, Description = &quot;L\u00fctfen \u015fifre i\u00e7erisinde kullan\u0131c\u0131 ad\u0131n\u0131 yazmay\u0131n\u0131z.&quot; });\r\n\r\n            if (!errors.Any())\r\n                return Task.FromResult(IdentityResult.Success);\r\n            else\r\n                return Task.FromResult(IdentityResult.Failed(errors.ToArray()));\r\n        }\r\n    }\r\n<\/pre>\n<p>G\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere \u00f6rneklendirme i\u00e7in belli ba\u015fl\u0131 \u00f6zel validasyon yap\u0131lanmas\u0131 in\u015fa etmi\u015f bulunmaktay\u0131m. 5. sat\u0131rda olu\u015fturulan &#8220;IdentityError&#8221; koleksiyonuna do\u011frulanmayan \u015fifrenin ilgili hata mesajlar\u0131 eklenecek ve bu koleksiyonun dolu olma durumunda geriye <a href=\"https:\/\/www.gencayyildiz.com\/blog\/cta-task-fromresult-metodu\/\" rel=\"noopener noreferrer\" target=\"_blank\">Task.FromResult<\/a> ile ilgili hatalar d\u00f6nd\u00fcr\u00fclecektir.<\/p>\n<p>Art\u0131k olu\u015fturulan bu \u00f6zelle\u015ftirilmi\u015f validasyonu kullanmas\u0131 i\u00e7in Identity mekanizmas\u0131na bildirmemiz gerekmektedir. Bunun i\u00e7in yine &#8220;Startup.cs&#8221; dosyas\u0131na gitmemiz 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) =&gt; Configuration = configuration;\r\n        public void ConfigureServices(IServiceCollection services)\r\n        {\r\n            services.AddDbContext&lt;AppDbContext&gt;(_ =&gt; _.UseSqlServer(Configuration&#x5B;&quot;ConnectionStrings:SqlServerConnectionString&quot;]));\r\n            services.AddIdentity&lt;AppUser, AppRole&gt;(_ =&gt;\r\n            {\r\n                _.Password.RequiredLength = 5; \/\/En az ka\u00e7 karakterli olmas\u0131 gerekti\u011fini belirtiyoruz.\r\n                _.Password.RequireNonAlphanumeric = false;\/\/Alfanumerik zorunlulu\u011funu kald\u0131r\u0131yoruz.\r\n                _.Password.RequireLowercase = false;\/\/K\u00fc\u00e7\u00fck harf zorunlulu\u011funu kald\u0131r\u0131yoruz.\r\n                _.Password.RequireUppercase = false;\/\/B\u00fcy\u00fck harf zorunlulu\u011funu kald\u0131r\u0131yoruz.\r\n                _.Password.RequireDigit = false;\/\/0-9 aras\u0131 say\u0131sal karakter zorunlulu\u011funu kald\u0131r\u0131yoruz.\r\n            }).AddPasswordValidator&lt;CustomPasswordValidation&gt;().AddEntityFrameworkStores&lt;AppDbContext&gt;();\r\n            services.AddMvc();\r\n        }\r\n\r\n        public void Configure(IApplicationBuilder app, IHostingEnvironment env)\r\n        {\r\n            if (env.IsDevelopment())\r\n                app.UseDeveloperExceptionPage();\r\n\r\n            app.UseStatusCodePages();\r\n            app.UseStaticFiles();\r\n            app.UseAuthentication();\r\n            app.UseMvc(_ =&gt; _.MapRoute(&quot;Default&quot;, &quot;{controller=Home}\/{action=Index}\/{id?}&quot;));\r\n        }\r\n    }\r\n<\/pre>\n<p>&#8220;ConfigureServices&#8221; metodu i\u00e7erisindeki 15. sat\u0131ra g\u00f6z atarsan\u0131z e\u011fer &#8220;AddPasswordValidator&#8221; generic metodu ile uygulaman\u0131n hangi validasyon ayarlar\u0131n\u0131 benimseyece\u011fini belirtmi\u015f oluyoruz. Bu \u015fekilde uygulamay\u0131 derleyip \u00e7al\u0131\u015ft\u0131rd\u0131\u011f\u0131m\u0131zda, i\u00e7erisinde kullan\u0131c\u0131 ad\u0131n\u0131n ge\u00e7ti\u011fi bir \u015fifre yazd\u0131\u011f\u0131m\u0131z vakit a\u015fa\u011f\u0131daki ekran g\u00f6r\u00fcnt\u00fcs\u00fcnde oldu\u011fu gibi \u00f6zelle\u015ftirilmi\u015f validasyon hatas\u0131n\u0131 almaktay\u0131z.<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/08\/Asp.NET-Core-Identity-\u015eifre-Validasyon-Ayarlar\u0131-ve-IPasswordValidator-Aray\u00fcz\u00fc-VI-2.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/08\/Asp.NET-Core-Identity-\u015eifre-Validasyon-Ayarlar\u0131-ve-IPasswordValidator-Aray\u00fcz\u00fc-VI-2.jpg\" alt=\"Asp.NET Core Identity - \u015eifre Validasyon Ayarlar\u0131 ve IPasswordValidator Aray\u00fcz\u00fc - VI\" width=\"375\" height=\"218\" class=\"aligncenter size-full wp-image-11787\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/08\/Asp.NET-Core-Identity-\u015eifre-Validasyon-Ayarlar\u0131-ve-IPasswordValidator-Aray\u00fcz\u00fc-VI-2.jpg 375w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/08\/Asp.NET-Core-Identity-\u015eifre-Validasyon-Ayarlar\u0131-ve-IPasswordValidator-Aray\u00fcz\u00fc-VI-2-300x174.jpg 300w\" sizes=\"auto, (max-width: 375px) 100vw, 375px\" \/><\/a><\/p>\n<p>Bu noktadan itibaren bir \u00fcyelik i\u015fleminde kullan\u0131c\u0131 \u015fifresi \u00fczerinde validasyon ayarlar\u0131n\u0131n nas\u0131l yap\u0131ld\u0131\u011f\u0131n\u0131 ve ihtiyac\u0131m\u0131za d\u00f6n\u00fck \u00f6zelle\u015ftirilmi\u015f validasyon yap\u0131lanmas\u0131n\u0131n nas\u0131l olu\u015fturuldu\u011funu incelemi\u015f olduk&#8230; Dizimizin bir sonraki i\u00e7eri\u011finde kullan\u0131c\u0131 do\u011frulama ayarlar\u0131 \u00fczerine konu\u015fuyor olaca\u011f\u0131z. O halde \u015fimdilik ho\u015f\u00e7akal\u0131n.<\/p>\n<p>\u0130lgilenenlerin faydalanmas\u0131 dile\u011fiyle&#8230;<br \/>\n\u0130yi \u00e7al\u0131\u015fmalar&#8230;<\/p>\n<p>Not : \u00d6rnek projeyi indirmek i\u00e7in <a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/08\/AspNetCoreIdentityExample-3.zip\">buraya t\u0131klay\u0131n\u0131z.<\/a><\/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, Asp.NET Core Identity yaz\u0131 dizimizin 6. makalesinde, kullan\u0131c\u0131 \u00fcye olurken varsay\u0131lan \u015fifre validasyon ayarlar\u0131n\u0131n de\u011fi\u015ftirilmesini ve bunun yan\u0131nda IPasswordValidator aray\u00fcz\u00fc ile kendimize \u00f6zel validasyon yap\u0131lanmas\u0131n\u0131 olu\u015fturmay\u0131 inceleyece\u011fiz. Her\u015feyden \u00f6nce bir \u00f6nceki UserManager S\u0131n\u0131f\u0131&#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":11583,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2668,2656,2811,2832,2898],"tags":[100,2952,2984,2986,2985,2987],"class_list":["post-11755","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-asp-net-core-2","category-asp-net-core-2-mvc","category-asp-net-core-2-1","category-asp-net-core-2-2","category-asp-net-core-3-0","tag-identity","tag-asp-net-core-identity","tag-asp-net-core-identity-validation","tag-identity-password-validation","tag-identity-validation","tag-ipasswordvalidator"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/11755","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=11755"}],"version-history":[{"count":32,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/11755\/revisions"}],"predecessor-version":[{"id":11791,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/11755\/revisions\/11791"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media\/11583"}],"wp:attachment":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media?parent=11755"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=11755"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=11755"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}