﻿
{"id":11706,"date":"2019-08-12T22:19:01","date_gmt":"2019-08-12T22:19:01","guid":{"rendered":"https:\/\/www.gencayyildiz.com\/blog\/?p=11706"},"modified":"2019-08-12T22:19:01","modified_gmt":"2019-08-12T22:19:01","slug":"asp-net-core-identity-usermanager-sinifi-ile-kullanici-yonetimi-v","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/asp-net-core-identity-usermanager-sinifi-ile-kullanici-yonetimi-v\/","title":{"rendered":"Asp.NET Core Identity &#8211; UserManager S\u0131n\u0131f\u0131 \u0130le Kullan\u0131c\u0131 Y\u00f6netimi &#8211; V"},"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\/\" target=\"_blank\" rel=\"noopener noreferrer\">Asp.NET Core Identity yaz\u0131 dizimizin<\/a> 5. ad\u0131m\u0131 olan bu i\u00e7eri\u011fimizde UserManager s\u0131n\u0131f\u0131 ile kullan\u0131c\u0131 y\u00f6netimi \u00fczerine inceleme ger\u00e7ekle\u015ftirece\u011fiz. \u00d6nceki yaz\u0131lar\u0131m\u0131zda kullan\u0131c\u0131lar\u0131m\u0131z\u0131 modelledi\u011fimiz IdentityUser ve o kullan\u0131c\u0131lara bi\u00e7ilen rolleri tan\u0131mlad\u0131\u011f\u0131m\u0131z IdentityRole s\u0131n\u0131flar\u0131n\u0131n ne oldu\u011funu ele alm\u0131\u015f ve nas\u0131l kullan\u0131ld\u0131klar\u0131n\u0131 detayl\u0131ca incelemi\u015ftik. \u015eimdi s\u0131ra bu yap\u0131lanmalar\u0131 kullanarak kullan\u0131c\u0131 olu\u015fturmam\u0131z\u0131 ve var olan kullan\u0131c\u0131lar\u0131 y\u00f6netmemizi sa\u011flayan UserManager s\u0131n\u0131f\u0131n\u0131 ele almaya gelmi\u015ftir.<\/p>\n<h3>UserManager S\u0131n\u0131f\u0131<\/h3>\n<p>Uygulama \u00fczerinde a&#8217;dan z&#8217;ye kullan\u0131c\u0131 y\u00f6netimini ger\u00e7ekle\u015ftirmemizi sa\u011flayan s\u0131n\u0131ft\u0131r.<br \/>\nUserManager s\u0131n\u0131f\u0131 hangi kullan\u0131c\u0131 t\u00fcr\u00fcn\u00fc y\u00f6netece\u011fini generic \u00f6zelli\u011finden bilmek ister. Dolay\u0131s\u0131yla ilgili s\u0131n\u0131f\u0131n yap\u0131s\u0131n\u0131 \u015f\u00f6yle bir incelersek e\u011fer;<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/08\/Asp.NET-Core-Identity-UserManager-S\u0131n\u0131f\u0131-\u0130le-Kullan\u0131c\u0131-Y\u00f6netimi-V.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-11709\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/08\/Asp.NET-Core-Identity-UserManager-S\u0131n\u0131f\u0131-\u0130le-Kullan\u0131c\u0131-Y\u00f6netimi-V.jpg\" alt=\"Asp.NET Core Identity - UserManager S\u0131n\u0131f\u0131 \u0130le Kullan\u0131c\u0131 Y\u00f6netimi - V\" width=\"424\" height=\"146\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/08\/Asp.NET-Core-Identity-UserManager-S\u0131n\u0131f\u0131-\u0130le-Kullan\u0131c\u0131-Y\u00f6netimi-V.jpg 424w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/08\/Asp.NET-Core-Identity-UserManager-S\u0131n\u0131f\u0131-\u0130le-Kullan\u0131c\u0131-Y\u00f6netimi-V-300x103.jpg 300w\" sizes=\"auto, (max-width: 424px) 100vw, 424px\" \/><\/a><br \/>\ng\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere generic parametreye verilen IdentityUser t\u00fcrevi s\u0131n\u0131f hangisiyle sistemde ona dair bir kullan\u0131c\u0131 y\u00f6netimi s\u00f6z konusu olacakt\u0131r.<\/p>\n<p>Bu s\u0131n\u0131fa eri\u015febilmek i\u00e7in Asp.NET Core Identity mimarisinin kullan\u0131ld\u0131\u011f\u0131 uygulamalarda Dependency Injection<span style=\"font-size: 10px;\">(<a href=\"https:\/\/www.gencayyildiz.com\/blog\/dependency-injection-nedir-nasil-uygulanir\/\" target=\"_blank\" rel=\"noopener noreferrer\">DI Kaynak<\/a>, <a href=\"https:\/\/www.gencayyildiz.com\/blog\/asp-net-core-2-mvcde-dependency-injection\/\" target=\"_blank\" rel=\"noopener noreferrer\">DI Ba\u015fka Bir Kaynak<\/a>)<\/span> ile talepte bulunmam\u0131z yeterli olacakt\u0131r.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public class UserController : Controller\r\n    {\r\n        readonly UserManager&lt;AppUser&gt; _userManager;\r\n        public UserController(UserManager&lt;AppUser&gt; userManager)\r\n        {\r\n            _userManager = userManager;\r\n        }\r\n    }\r\n<\/pre>\n<p>Bu i\u015flem neticesinde art\u0131k &#8220;AppUser&#8221; modeline \u00f6zel UserManager s\u0131n\u0131f\u0131n\u0131 kullanabilmekte ve a\u015fa\u011f\u0131daki metotlar ve propertyler e\u015fli\u011finde t\u00fcm y\u00f6netimi sa\u011flayabilmekteyiz.<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/08\/Asp.NET-Core-Identity-UserManager-S\u0131n\u0131f\u0131-\u0130le-Kullan\u0131c\u0131-Y\u00f6netimi-V-1.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-11713\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/08\/Asp.NET-Core-Identity-UserManager-S\u0131n\u0131f\u0131-\u0130le-Kullan\u0131c\u0131-Y\u00f6netimi-V-1.jpg\" alt=\"Asp.NET Core Identity - UserManager S\u0131n\u0131f\u0131 \u0130le Kullan\u0131c\u0131 Y\u00f6netimi - V\" width=\"829\" height=\"421\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/08\/Asp.NET-Core-Identity-UserManager-S\u0131n\u0131f\u0131-\u0130le-Kullan\u0131c\u0131-Y\u00f6netimi-V-1.jpg 829w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/08\/Asp.NET-Core-Identity-UserManager-S\u0131n\u0131f\u0131-\u0130le-Kullan\u0131c\u0131-Y\u00f6netimi-V-1-300x152.jpg 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/08\/Asp.NET-Core-Identity-UserManager-S\u0131n\u0131f\u0131-\u0130le-Kullan\u0131c\u0131-Y\u00f6netimi-V-1-768x390.jpg 768w\" sizes=\"auto, (max-width: 829px) 100vw, 829px\" \/><\/a><br \/>\nBen burada UserManager s\u0131n\u0131f\u0131 i\u00e7erisindeki baz\u0131 metot ve propertylerin g\u00f6rselini \u00e7ekmi\u015f bulunmaktay\u0131m. \u015e\u00f6yle rastgele g\u00f6z atarsan\u0131z e\u011fer g\u00f6receksiniz ki renkli kareler i\u00e7erisine al\u0131nan t\u00fcm memberlar genel anlamda t\u00fcm kullan\u0131c\u0131lara eri\u015febilmeyi(select) ve bunlar\u0131n yan\u0131nda kullan\u0131c\u0131 olu\u015fturmay\u0131(insert), silmeyi(delete) ve g\u00fcncellemeyi(update) sa\u011flayan i\u015flevselli\u011fe sahiptirler. Bunlar\u0131n d\u0131\u015f\u0131nda \u015fartl\u0131 sorgular olu\u015fturan ve hususi bir kullan\u0131c\u0131 odakl\u0131 \u00e7al\u0131\u015fmam\u0131z\u0131 sa\u011flayan metotlarda mevcuttur. Buradan anlayaca\u011f\u0131n\u0131z UserManager s\u0131n\u0131f\u0131 kullan\u0131c\u0131 y\u00f6netimiyle ilgili ana karargah g\u00f6revi g\u00f6ren bir sorumlulu\u011fa sahiptir.<\/p>\n<blockquote style=\"color: orange;\"><p><em>UserManager s\u0131n\u0131f\u0131 kullan\u0131c\u0131 y\u00f6netiminin ana karargah\u0131d\u0131r.<\/em><\/p><\/blockquote>\n<p>\u0130\u00e7eri\u011fimizin bu noktas\u0131na kadar ba\u015f akt\u00f6r olarak UserManager s\u0131n\u0131f\u0131n\u0131 yeterince teorik olarak ele alm\u0131\u015f bulunmaktay\u0131z. Art\u0131k olay\u0131 biraz daha somutla\u015ft\u0131rmal\u0131 ve son noktaya do\u011fru yakla\u015f\u0131rken \u00f6rnek mahiyetinde ilgili yap\u0131ya imza atmal\u0131y\u0131z. Bunun i\u00e7in ise ben kullan\u0131c\u0131 olu\u015fturma ve listeleme \u00fczerine bir \u00f6rneklendirme yapmay\u0131 tercih ediyorum.<\/p>\n<h3>Kullan\u0131c\u0131 Olu\u015fturma ve Listeleme<\/h3>\n<p>\u015eimdi kullan\u0131c\u0131 bilgilerini alabilece\u011fimiz \u00f6rnek bir sayfa tasarlayaca\u011f\u0131z. Tabi bu \u00f6rne\u011fi Asp.NET Core MVC uygulamas\u0131nda geli\u015ftirece\u011fimizden dolay\u0131 ilgili sayfan\u0131n modeli kullan\u0131c\u0131 modeline kar\u015f\u0131l\u0131k gelen &#8220;AppUser&#8221; s\u0131n\u0131f\u0131 olmal\u0131d\u0131r. Olmal\u0131d\u0131r diyorum \u00e7\u00fcnk\u00fc UserManager s\u0131n\u0131f\u0131 &#8220;AppUser&#8221; modeli \u00fczerinden t\u00fcm kullan\u0131c\u0131 y\u00f6netimi sa\u011flayacakt\u0131r. Lakin &#8220;AppUser&#8221; s\u0131n\u0131f\u0131n\u0131n &#8220;IdentityUser&#8221; s\u0131n\u0131f\u0131ndan t\u00fcremesinden dolay\u0131 bu miras neticesinde gelen t\u00fcm propertylere kar\u015f\u0131l\u0131k kullan\u0131c\u0131 kayd\u0131 esnas\u0131nda bir de\u011fer verilmesi gerekecektir. Tabi bizler bu \u00f6rne\u011fimizde sadece kullan\u0131c\u0131dan kullan\u0131c\u0131 ad\u0131(UserName), e-posta(Email) ve \u015fifre(PasswordHash) bilgilerini isteyece\u011fimizden dolay\u0131 s\u00fcre\u00e7te bu verisel trafi\u011fe e\u015flik edecek ViewModel tasarlamam\u0131z gayet yerinde ve yeterli olacakt\u0131r. ViewModel yap\u0131lanmas\u0131n\u0131n ne oldu\u011funa dair detayl\u0131 bilgi edinmek istiyorsan\u0131z AutoMapper \u00fczerine kaleme alm\u0131\u015f oldu\u011fum <a href=\"https:\/\/www.gencayyildiz.com\/blog\/asp-net-coreda-automapper-kullanimi\/\" target=\"_blank\" rel=\"noopener noreferrer\">\u015fu<\/a> adresteki makaleyi inceleyebilirsiniz. \u0130lgili makale i\u00e7erisinde ViewModel yap\u0131lanmas\u0131na dair t\u00fcm senaryolar e\u015fli\u011finde detayl\u0131 a\u00e7\u0131klamalar bar\u0131nd\u0131rmakla beraber ekstra olarak dolayl\u0131 yoldan bu i\u00e7eri\u011fimizede katk\u0131da bulunacakt\u0131r.<\/p>\n<p>\u015eimdi &#8220;Models&#8221; klas\u00f6r\u00fc i\u00e7erisinde &#8220;ViewModels&#8221; isminde bir klas\u00f6r olu\u015fturarak i\u00e7erisine &#8220;AppUserViewModel&#8221; isminde class olu\u015ftural\u0131m ve a\u015fa\u011f\u0131daki gibi in\u015fa edelim.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public class AppUserViewModel\r\n    {\r\n        &#x5B;Required(ErrorMessage = &quot;L\u00fctfen kullan\u0131c\u0131 ad\u0131n\u0131 bo\u015f ge\u00e7meyiniz...&quot;)]\r\n        &#x5B;StringLength(15, ErrorMessage = &quot;L\u00fctfen kullan\u0131c\u0131 ad\u0131n\u0131 4 ile 15 karakter aras\u0131nda giriniz...&quot;, MinimumLength = 4)]\r\n        &#x5B;Display(Name = &quot;Kullan\u0131c\u0131 Ad\u0131&quot;)]\r\n        public string UserName { get; set; }\r\n        &#x5B;Required(ErrorMessage = &quot;L\u00fctfen emaili bo\u015f ge\u00e7meyiniz...&quot;)]\r\n        &#x5B;EmailAddress(ErrorMessage = &quot;L\u00fctfen email format\u0131nda bir de\u011fer belirtiniz...&quot;)]\r\n        &#x5B;Display(Name = &quot;Email&quot;)]\r\n        public string Email { get; set; }\r\n        &#x5B;Required(ErrorMessage = &quot;L\u00fctfen \u015fifreyi bo\u015f ge\u00e7meyiniz...&quot;)]\r\n        &#x5B;DataType(DataType.Password, ErrorMessage = &quot;L\u00fctfen \u015fifreyi t\u00fcm kurallar\u0131 g\u00f6z \u00f6n\u00fcne alarak giriniz...&quot;)]\r\n        &#x5B;Display(Name = &quot;\u015eifre&quot;)]\r\n        public string Sifre { get; set; }\r\n    }\r\n<\/pre>\n<p>Bu viewmodele dikkat ederseniz e\u011fer salt bilgileri kar\u015f\u0131layacak olan propertyler, s\u00fcre\u00e7te verisel transferi sa\u011flayaca\u011f\u0131m\u0131z &#8220;AppUser&#8221; nesnesinde tutars\u0131zl\u0131\u011fa mahal vermemek i\u00e7in e\u015fle\u015fecek olan propertyler ile ayn\u0131 isimde olacak \u015fekilde tasarlanm\u0131\u015ft\u0131r. Ya da benzer mant\u0131kla s\u00fcre\u00e7te AutoMapper k\u00fct\u00fcphanesi ile otomatik e\u015fle\u015ftirme ger\u00e7ekle\u015ftirilebilir. Eee do\u011fal olarak bu otomatik e\u015fle\u015ftirmeyi property isimlerindeki benzerliklerden ger\u00e7ekle\u015ftirece\u011finden yine do\u011fru bir tasar\u0131m ger\u00e7ekle\u015ftirmi\u015f oluyoruz. Sadece &#8220;\u015eifre&#8221; propertysi hari\u00e7. Sebebini ileriki sat\u0131rlarda anlayacaks\u0131n\u0131z. Ayr\u0131ca bilgilerini girecek olan kullan\u0131c\u0131yla direkt muhattap olan viewmodel nesnemiz olaca\u011f\u0131ndan dolay\u0131 data annotations yap\u0131lanmas\u0131yla gerekli veri g\u00fcvenli\u011fi sa\u011flanm\u0131\u015ft\u0131r.<\/p>\n<p>Bu i\u015flemden sonra &#8220;User(Controller).cs&#8221; isimli controller s\u0131n\u0131f\u0131nda &#8220;SignIn&#8221; isminde bir action olu\u015ftural\u0131m ve View katman\u0131ndaki kar\u015f\u0131l\u0131\u011f\u0131n\u0131 a\u015fa\u011f\u0131dai gibi kodlayal\u0131m.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n@model AspNetCoreIdentityExample.Models.ViewModels.AppUserViewModel\r\n@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers\r\n\r\n&lt;h3&gt;\u00dcye Ol&lt;\/h3&gt;\r\n\r\n&lt;hr \/&gt;\r\n&lt;form asp-action=&quot;SignIn&quot;&gt;\r\n    &lt;table&gt;\r\n        &lt;tr&gt;\r\n            &lt;td colspan=&quot;3&quot;&gt;&lt;div asp-validation-summary=&quot;ModelOnly&quot;&gt;&lt;\/div&gt;&lt;\/td&gt;\r\n        &lt;\/tr&gt;\r\n        &lt;tr&gt;\r\n            &lt;td&gt;&lt;label asp-for=&quot;UserName&quot;&gt;&lt;\/label&gt;&lt;\/td&gt;\r\n            &lt;td&gt;&lt;input asp-for=&quot;UserName&quot; \/&gt;&lt;\/td&gt;\r\n            &lt;td&gt;&lt;span asp-validation-for=&quot;UserName&quot;&gt;&lt;\/span&gt;&lt;\/td&gt;\r\n        &lt;\/tr&gt;\r\n        &lt;tr&gt;\r\n            &lt;td&gt;&lt;label asp-for=&quot;Email&quot;&gt;&lt;\/label&gt;&lt;\/td&gt;\r\n            &lt;td&gt;&lt;input asp-for=&quot;Email&quot; \/&gt;&lt;\/td&gt;\r\n            &lt;td&gt;&lt;span asp-validation-for=&quot;Email&quot;&gt;&lt;\/span&gt;&lt;\/td&gt;\r\n        &lt;\/tr&gt;\r\n        &lt;tr&gt;\r\n            &lt;td&gt;&lt;label asp-for=&quot;Sifre&quot;&gt;&lt;\/label&gt;&lt;\/td&gt;\r\n            &lt;td&gt;&lt;input asp-for=&quot;Sifre&quot; \/&gt;&lt;\/td&gt;\r\n            &lt;td&gt;&lt;span asp-validation-for=&quot;Sifre&quot;&gt;&lt;\/span&gt;&lt;\/td&gt;\r\n        &lt;\/tr&gt;\r\n        &lt;tr&gt;\r\n            &lt;td colspan=&quot;3&quot;&gt;&lt;input type=&quot;submit&quot; value=&quot;\u00dcye Ol&quot; \/&gt;&lt;\/td&gt;\r\n        &lt;\/tr&gt;\r\n    &lt;\/table&gt;\r\n&lt;\/form&gt;\r\n\r\n\r\n<\/pre>\n<p>Bu i\u015flemden sonra bind edilmi\u015f &#8220;AppUserViewModel&#8221; nesnesini post neticesinde backend&#8217;de a\u015fa\u011f\u0131daki gibi kar\u015f\u0131layal\u0131m.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public class UserController : Controller\r\n    {\r\n        readonly UserManager&lt;AppUser&gt; _userManager;\r\n        public UserController(UserManager&lt;AppUser&gt; userManager)\r\n        {\r\n            _userManager = userManager;\r\n        }\r\n        public IActionResult Index()\r\n        {\r\n            return View(_userManager.Users);\r\n        }\r\n        &#x5B;HttpGet]\r\n        public IActionResult SignIn()\r\n        {\r\n            return View();\r\n        }\r\n\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    }\r\n<\/pre>\n<p>Yukar\u0131daki kod blo\u011funu incelerseniz e\u011fer; &#8220;HttpPost&#8221; tipinden olan &#8220;SignIn&#8221; metodunun i\u00e7erisinde gerekli validasyon kontrol\u00fc yap\u0131ld\u0131ktan sonra post edilen &#8220;AppUserViewModel&#8221; nesnesinden gelen verileri olu\u015fturulan &#8220;AppUser&#8221; nesnesine transfer etmekte ve ilgili &#8220;AppUser&#8221; nesnesini UserManager nesnesi \u00fczerinden &#8220;CreateAsync&#8221; metodu arac\u0131l\u0131\u011f\u0131yla veritaban\u0131na kaydetmekteyiz. Burada iki hususa dikkatinizi \u00e7ekmek istiyorum; birincisi, post neticesinde gelen viewmodel i\u00e7erisindeki &#8220;Sifre&#8221; propertysi &#8220;CreateAsync&#8221; i\u00e7erisinde ikinci parametreye verilerek ilgili parolan\u0131n Hash algoritmas\u0131 ile \u015fifrelenerek kaydedilmesi sa\u011flanmaktad\u0131r. \u0130\u015fte buradaki i\u015flem y\u00fcz\u00fcnden viewmodel i\u00e7erisinde \u015fifreyi &#8220;AppUser\/IdentityUser&#8221; i\u00e7erisindeki &#8220;PasswordHash&#8221; propertysinden isim olarak benzersiz tan\u0131mlam\u0131\u015f bulunmaktay\u0131z. \u0130kinci olarak ise burada manuel olarak yap\u0131lan e\u015fle\u015ftirmeyi <a href=\"https:\/\/www.gencayyildiz.com\/blog\/asp-net-coreda-automapper-kullanimi\/\" target=\"_blank\" rel=\"noopener noreferrer\">Automapper<\/a> k\u00fct\u00fcphanesini kullanarakta otomatik bir \u015fekilde ger\u00e7ekle\u015ftirebiliriz. Tabi bu \u00e7al\u0131\u015fmay\u0131da sizlere b\u0131rakmaktay\u0131m&#8230;<\/p>\n<p>&#8220;Index&#8221; actionu i\u00e7erisinde ise UserManager nesnesi \u00fczerinden &#8220;Users&#8221; propertysi \u00e7a\u011fr\u0131lm\u0131\u015ft\u0131r ve b\u00f6ylece t\u00fcm kullan\u0131c\u0131lar ilgili action i\u00e7erisinde listelenecektir. E\u011fer ki \u00fcyelik i\u015flemi ba\u015far\u0131yla sonu\u00e7lan\u0131rsa Index action\u0131na y\u00f6nlendirme yap\u0131lacakt\u0131r.<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/08\/Asp.NET-Core-Identity-UserManager-S\u0131n\u0131f\u0131-\u0130le-Kullan\u0131c\u0131-Y\u00f6netimi-V.gif\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-11735\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/08\/Asp.NET-Core-Identity-UserManager-S\u0131n\u0131f\u0131-\u0130le-Kullan\u0131c\u0131-Y\u00f6netimi-V.gif\" alt=\"Asp.NET Core Identity - UserManager S\u0131n\u0131f\u0131 \u0130le Kullan\u0131c\u0131 Y\u00f6netimi - V\" width=\"796\" height=\"240\" \/><\/a><\/p>\n<p>&#8220;<em>Hoca \u00f6rneklendirmede bootstrap kullanmad\u0131n, bari \u015fu validation error mesajlar\u0131n\u0131 dinamik eyle&#8230;<\/em>&#8221; diyenleriniz olabilir \ud83d\ude42 Eee hadi istiyorsunuz madem sizleri k\u0131rmayal\u0131m ve son olarak hata mesajlar\u0131n\u0131 daha da dinamik hale getirip yaz\u0131m\u0131z\u0131 sonland\u0131ral\u0131m.<\/p>\n<p>Bu i\u015flem i\u00e7in &#8220;jquery&#8221;, &#8220;<em>jquery.validate<\/em>&#8221; ve &#8220;<em>jquery.validate.unobtrusive<\/em>&#8221; k\u00fct\u00fcphanelerinin projeye include edilmesi yeterli olacakt\u0131r. Bunun i\u00e7in; &#8220;Projeye Sa\u011f T\u0131klayarak&#8221; -&gt; &#8220;Add&#8221; -&gt; &#8220;Client-Side Library&#8230;&#8221; kombinasyonunu takip ediniz.<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/08\/Asp.NET-Core-Identity-UserManager-S\u0131n\u0131f\u0131-\u0130le-Kullan\u0131c\u0131-Y\u00f6netimi-V-2.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-11740\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/08\/Asp.NET-Core-Identity-UserManager-S\u0131n\u0131f\u0131-\u0130le-Kullan\u0131c\u0131-Y\u00f6netimi-V-2.jpg\" alt=\"Asp.NET Core Identity - UserManager S\u0131n\u0131f\u0131 \u0130le Kullan\u0131c\u0131 Y\u00f6netimi - V\" width=\"636\" height=\"531\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/08\/Asp.NET-Core-Identity-UserManager-S\u0131n\u0131f\u0131-\u0130le-Kullan\u0131c\u0131-Y\u00f6netimi-V-2.jpg 636w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/08\/Asp.NET-Core-Identity-UserManager-S\u0131n\u0131f\u0131-\u0130le-Kullan\u0131c\u0131-Y\u00f6netimi-V-2-300x250.jpg 300w\" sizes=\"auto, (max-width: 636px) 100vw, 636px\" \/><\/a><br \/>\nBu kombinasyon neticesinde a\u00e7\u0131lan pencereye yukar\u0131da ismi verilen k\u00fct\u00fcphaneleri yaz\u0131n\u0131z ve &#8220;Install&#8221; butonuna t\u0131klay\u0131n\u0131z.<\/p>\n<table>\n<tbody>\n<tr>\n<td><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/08\/Asp.NET-Core-Identity-UserManager-S\u0131n\u0131f\u0131-\u0130le-Kullan\u0131c\u0131-Y\u00f6netimi-V-3.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/08\/Asp.NET-Core-Identity-UserManager-S\u0131n\u0131f\u0131-\u0130le-Kullan\u0131c\u0131-Y\u00f6netimi-V-3.jpg\" alt=\"Asp.NET Core Identity - UserManager S\u0131n\u0131f\u0131 \u0130le Kullan\u0131c\u0131 Y\u00f6netimi - V\" width=\"481\" height=\"335\" class=\"aligncenter size-full wp-image-11743\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/08\/Asp.NET-Core-Identity-UserManager-S\u0131n\u0131f\u0131-\u0130le-Kullan\u0131c\u0131-Y\u00f6netimi-V-3.jpg 481w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/08\/Asp.NET-Core-Identity-UserManager-S\u0131n\u0131f\u0131-\u0130le-Kullan\u0131c\u0131-Y\u00f6netimi-V-3-300x209.jpg 300w\" sizes=\"auto, (max-width: 481px) 100vw, 481px\" \/><\/a><\/td>\n<td><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/08\/Asp.NET-Core-Identity-UserManager-S\u0131n\u0131f\u0131-\u0130le-Kullan\u0131c\u0131-Y\u00f6netimi-V-4.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/08\/Asp.NET-Core-Identity-UserManager-S\u0131n\u0131f\u0131-\u0130le-Kullan\u0131c\u0131-Y\u00f6netimi-V-4.jpg\" alt=\"Asp.NET Core Identity - UserManager S\u0131n\u0131f\u0131 \u0130le Kullan\u0131c\u0131 Y\u00f6netimi - V\" width=\"475\" height=\"330\" class=\"aligncenter size-full wp-image-11744\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/08\/Asp.NET-Core-Identity-UserManager-S\u0131n\u0131f\u0131-\u0130le-Kullan\u0131c\u0131-Y\u00f6netimi-V-4.jpg 475w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/08\/Asp.NET-Core-Identity-UserManager-S\u0131n\u0131f\u0131-\u0130le-Kullan\u0131c\u0131-Y\u00f6netimi-V-4-300x208.jpg 300w\" sizes=\"auto, (max-width: 475px) 100vw, 475px\" \/><\/a><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Bu i\u015flemler neticesinde uygulamadaki &#8220;wwwroot&#8221; klas\u00f6r\u00fc alt\u0131na ilgili k\u00fct\u00fcphaneler indirilmi\u015f olacakt\u0131r. \u015eimdi tek yapmam\u0131z gereken bu k\u00fct\u00fcphaneleri &#8220;_Layout.cshtml&#8221; sayfas\u0131nda uygun bir yere ekleyerek html&#8217;e include etmektir.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n&lt;!DOCTYPE html&gt;\r\n\r\n&lt;html&gt;\r\n&lt;head&gt;\r\n    &lt;script src=&quot;~\/jquery\/jquery.js&quot;&gt;&lt;\/script&gt;\r\n    &lt;script src=&quot;~\/lib\/jquery-validate\/jquery.validate.js&quot;&gt;&lt;\/script&gt;\r\n    &lt;script src=&quot;~\/lib\/jquery-validation-unobtrusive\/jquery.validate.unobtrusive.js&quot;&gt;&lt;\/script&gt;\r\n&lt;\/head&gt;\r\n&lt;body&gt;\r\n    &lt;div&gt;\r\n        @RenderBody()\r\n    &lt;\/div&gt;\r\n&lt;\/body&gt;\r\n&lt;\/html&gt;\r\n<\/pre>\n<p>Bu i\u015flemden de sonra uygulamay\u0131 derleyip \u00e7al\u0131\u015ft\u0131rd\u0131\u011f\u0131m\u0131zda a\u015fa\u011f\u0131daki ekran g\u00f6r\u00fcnt\u00fcs\u00fcnde oldu\u011fu gibi bir i\u015flevle kar\u015f\u0131la\u015fmaktay\u0131z&#8230;<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/08\/Asp.NET-Core-Identity-UserManager-S\u0131n\u0131f\u0131-\u0130le-Kullan\u0131c\u0131-Y\u00f6netimi-V-1.gif\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/08\/Asp.NET-Core-Identity-UserManager-S\u0131n\u0131f\u0131-\u0130le-Kullan\u0131c\u0131-Y\u00f6netimi-V-1.gif\" alt=\"Asp.NET Core Identity - UserManager S\u0131n\u0131f\u0131 \u0130le Kullan\u0131c\u0131 Y\u00f6netimi - V\" width=\"796\" height=\"240\" class=\"aligncenter size-full wp-image-11749\" \/><\/a><\/p>\n<p>Evet&#8230; Bu makalemizde de kullan\u0131c\u0131lar\u0131 t\u00fcm y\u00f6nleriyle y\u00f6netmemizi sa\u011flayan UserManager s\u0131n\u0131f\u0131n\u0131n nas\u0131l kullan\u0131ld\u0131\u011f\u0131na dair detayl\u0131 bir inceleme yapt\u0131\u011f\u0131m\u0131z\u0131 d\u00fc\u015f\u00fcn\u00fcyorum. Bir sonraki yaz\u0131 dizimizin devam\u0131 niteli\u011findeki makalemizde bu i\u00e7eri\u011fimizdeki \u015fifre do\u011frulama validasyonu \u00fczerine odaklanaca\u011f\u0131m\u0131z\u0131 bilmenizi isterim. O halde \u015fimdilik g\u00f6r\u00fc\u015fmek \u00fczere&#8230;<\/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-2.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 5. ad\u0131m\u0131 olan bu i\u00e7eri\u011fimizde UserManager s\u0131n\u0131f\u0131 ile kullan\u0131c\u0131 y\u00f6netimi \u00fczerine inceleme ger\u00e7ekle\u015ftirece\u011fiz. \u00d6nceki yaz\u0131lar\u0131m\u0131zda kullan\u0131c\u0131lar\u0131m\u0131z\u0131 modelledi\u011fimiz IdentityUser ve o kullan\u0131c\u0131lara bi\u00e7ilen rolleri tan\u0131mlad\u0131\u011f\u0131m\u0131z IdentityRole s\u0131n\u0131flar\u0131n\u0131n ne oldu\u011funu&#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":[2952,2981,2824,2980,2982,2983,2979],"class_list":["post-11706","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-asp-net-core-identity","tag-asp-net-core-identity-usermanager","tag-data-annotations","tag-identity-usermanager","tag-jquery-validate","tag-jquery-validate-unobtrusive","tag-usermanager"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/11706","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=11706"}],"version-history":[{"count":38,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/11706\/revisions"}],"predecessor-version":[{"id":11753,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/11706\/revisions\/11753"}],"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=11706"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=11706"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=11706"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}