{"id":1109,"date":"2022-04-10T16:03:27","date_gmt":"2022-04-10T08:03:27","guid":{"rendered":"http:\/\/www.wayln.com\/?p=1109"},"modified":"2022-04-11T17:04:31","modified_gmt":"2022-04-11T09:04:31","slug":"aspnet-core-identity","status":"publish","type":"post","link":"https:\/\/www.wayln.com\/?p=1109","title":{"rendered":"aspnet core Identity"},"content":{"rendered":"<div id=\"toc_container\" class=\"toc_transparent no_bullets\"><p class=\"toc_title\">Contents<\/p><ul class=\"toc_list\"><li><a href=\"#i\"><span class=\"toc_number toc_depth_1\">1<\/span> \u6210\u5458\u7ba1\u7406<\/a><\/li><li><a href=\"#MSSQL\"><span class=\"toc_number toc_depth_1\">2<\/span> \u9ed8\u8ba4\u4f7f\u7528MSSQL<\/a><\/li><li><a href=\"#Provider\"><span class=\"toc_number toc_depth_1\">3<\/span> \u652f\u6301\u5916\u90e8\u7684Provider<\/a><\/li><li><a href=\"#ASPNET_Core_Identity\"><span class=\"toc_number toc_depth_1\">4<\/span> \u4f7f\u7528ASP.NET Core Identity<\/a><ul><li><a href=\"#Aspnet_core_Identity\"><span class=\"toc_number toc_depth_2\">4.1<\/span> Asp.net core Identity\u91cd\u70b9\u7c7b<\/a><\/li><li><a href=\"#i-2\"><span class=\"toc_number toc_depth_2\">4.2<\/span> \u6b65\u9aa4<\/a><ul><li><a href=\"#AccountController\"><span class=\"toc_number toc_depth_3\">4.2.1<\/span> \u6dfb\u52a0\u4e00\u4e2aAccountController\u7c7b<\/a><\/li><li><a href=\"#LoginViewModel\"><span class=\"toc_number toc_depth_3\">4.2.2<\/span> \u6dfb\u52a0\u6570\u636e\u6a21\u578bLoginViewModel<\/a><\/li><li><a href=\"#i-3\"><span class=\"toc_number toc_depth_3\">4.2.3<\/span> \u6ce8\u518c\u670d\u52a1<\/a><\/li><li><a href=\"#i-4\"><span class=\"toc_number toc_depth_3\">4.2.4<\/span> \u6570\u636e\u5e93\u8fc1\u79fb<\/a><\/li><li><a href=\"#i-5\"><span class=\"toc_number toc_depth_3\">4.2.5<\/span> \u5728\u7f51\u9875\u4e2d\u6ce8\u5165\u4ee3\u7801<\/a><\/li><li><a href=\"#i-6\"><span class=\"toc_number toc_depth_3\">4.2.6<\/span> \u6dfb\u52a0\u7279\u6027<\/a><\/li><\/ul><\/li><\/ul><\/li><li><a href=\"#i-7\"><span class=\"toc_number toc_depth_1\">5<\/span> \u5177\u4f53\u6d41\u7a0b<\/a><\/li><\/ul><\/div>\n<p>#\u8eab\u4efd\u8ba4\u8bc1\u548c\u6388\u6743\u7cfb\u7edf<\/p>\n<h1><span id=\"i\">\u6210\u5458\u7ba1\u7406<\/span><\/h1>\n<h1><span id=\"MSSQL\">\u9ed8\u8ba4\u4f7f\u7528MSSQL<\/span><\/h1>\n<h1><span id=\"Provider\">\u652f\u6301\u5916\u90e8\u7684Provider<\/span><\/h1>\n<h1><span id=\"ASPNET_Core_Identity\">\u4f7f\u7528ASP.NET Core Identity<\/span><\/h1>\n<ul>\n<li>\u767b\u5f55\u548c\u6ce8\u518c\u7684View<\/p>\n<\/li>\n<li>\n<p>Account Controller<\/p>\n<\/li>\n<li>\n<p>Model<\/p>\n<\/li>\n<\/ul>\n<h2><span id=\"Aspnet_core_Identity\">Asp.net core Identity\u91cd\u70b9\u7c7b<\/span><\/h2>\n<ul>\n<li>UserManager<IdentityUser><\/IdentityUser><\/li>\n<li>SignInManager<IdentityUser><\/IdentityUser><br \/>\n-\u9700\u8981\u4f7f\u7528\u7684\u5e93Microsoft.AspNetCore.Identity.UI<\/li>\n<\/ul>\n<h2><span id=\"i-2\">\u6b65\u9aa4<\/span><\/h2>\n<h3><span id=\"AccountController\">\u6dfb\u52a0\u4e00\u4e2aAccountController\u7c7b<\/span><\/h3>\n<ul>\n<li>\u6dfb\u52a0\u5bf9\u8c61SignInManager<\/li>\n<\/ul>\n<pre><code class=\"language-CSharp line-numbers\">private readonly SignInManager&lt;IdentityUser&gt; _signInManager\n<\/code><\/pre>\n<ul>\n<li>\u6dfb\u52a0\u5bf9\u8c61UserManager<\/li>\n<\/ul>\n<pre><code class=\"language-CSharp line-numbers\">    private readonly UserManager&lt;IdentityUser&gt; _userManager;\n<\/code><\/pre>\n<pre><code class=\"language-CSharp line-numbers\">using Microsoft.AspNetCore.Identity;\nusing Microsoft.AspNetCore.Mvc;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Threading.Tasks;\nusing WebApplication4.ViewModels;\n\nnamespace WebApplication4.Controllers\n{\n    public class AccountController : Controller\n    {\n        private readonly SignInManager&lt;IdentityUser&gt; _signInManager;\n\n\n\n        private readonly UserManager&lt;IdentityUser&gt; _userManager;\n\n        public AccountController(UserManager&lt;IdentityUser&gt; userManager, SignInManager&lt;IdentityUser&gt; signInManager)\n        {\n            _userManager = userManager;\n            _signInManager = signInManager;\n        }\n        public IActionResult Login()\n        {\n            return View();\n        }\n\n        [HttpPost]\n        public async Task&lt;IActionResult&gt; Login(ViewModels.LoginViewModel loginViewModel)\n        {\n            if(!ModelState.IsValid)\n            {\n                return View(loginViewModel);\n            }\n            var user = await _userManager.FindByNameAsync(loginViewModel.UserName);\n            if(user!=null)\n            {\n                var result = await _signInManager.PasswordSignInAsync(user, loginViewModel.Password, false, false);\n                if(result.Succeeded)\n                {\n                    return RedirectToAction(\"Index\", \"Home\");\n                }\n            }\n            ModelState.AddModelError(\"\", \"\u7528\u6237\u540d\/\u6216\u5bc6\u7801\u4e0d\u6b63\u786e\");\n            return View(loginViewModel);\n        }\n        public IActionResult Register()\n        {\n            return View();\n        }\n        [HttpPost]\n        public async Task&lt;IActionResult&gt; Register(RegisterViewModel registerViewModel)\n        {\n            if(ModelState.IsValid)\n            {\n                var user = new IdentityUser()\n                {\n                    UserName = registerViewModel.UserName\n                };\n                var result = await _userManager.CreateAsync(user, registerViewModel.Password);\n                if(result.Succeeded)\n                {\n                    return RedirectToAction(\"Index\", \"Home\");\n                }\n            }\n            return View(registerViewModel);\n        }\n        [HttpPost]\n        public async Task&lt;IActionResult&gt; Logout()\n        {\n            await _signInManager.SignOutAsync();\n            return RedirectToAction(\"Index\", \"Home\");\n        }\n    }\n}\n\n<\/code><\/pre>\n<h3><span id=\"LoginViewModel\">\u6dfb\u52a0\u6570\u636e\u6a21\u578bLoginViewModel<\/span><\/h3>\n<pre><code class=\"language-CSharp line-numbers\">using System.ComponentModel.DataAnnotations;\nusing System.Linq;\nusing System.Threading.Tasks;\n\nnamespace WebApplication4.ViewModels\n{\n    public class LoginViewModel\n    {\n        [Required]\n        [Display(Name =\"\u7528\u6237\u540d\")]\n        public string UserName { get; set; }\n\n        [Required]\n        [Display(Name = \"\u5bc6\u7801\")]\n        [DataType(DataType.Password)]\n        public string Password { get; set; }\n    }\n}\n<\/code><\/pre>\n<h3><span id=\"i-3\">\u6ce8\u518c\u670d\u52a1<\/span><\/h3>\n<pre><code class=\"language-CSharp line-numbers\"> services.AddDbContext&lt;IdentityDbContext&gt;(options =&gt;\n            {\n                options.UseSqlServer(connectionString, b =&gt; b.MigrationsAssembly(\"WebApplication4\"));\n            });\n            services.AddDefaultIdentity&lt;IdentityUser&gt;().AddEntityFrameworkStores&lt;IdentityDbContext&gt;();\n            services.Configure&lt;IdentityOptions&gt;(options =&gt; {\n                options.Password.RequireDigit = false;\n                options.Password.RequiredLength = 0;\n                options.Password.RequireLowercase = false;\n                options.Password.RequiredUniqueChars = 0;\n                options.Password.RequireUppercase = false;\n                options.Password.RequireNonAlphanumeric = false;\n            });\n<\/code><\/pre>\n<h3><span id=\"i-4\">\u6570\u636e\u5e93\u8fc1\u79fb<\/span><\/h3>\n<pre><code class=\"language-CSharp line-numbers\">Add-Migration initialIdentityDb -Context IdentityDbContext\nupdate-database -Verbose -Context IdentityDbContextd\n<\/code><\/pre>\n<h3><span id=\"i-5\">\u5728\u7f51\u9875\u4e2d\u6ce8\u5165\u4ee3\u7801<\/span><\/h3>\n<pre data-language=HTML><code class=\"language-markup line-numbers\">@using Microsoft.AspNetCore.Identity\n@inject SignInManager&lt;IdentityUser&gt; SignInManager\n&lt;!DOCTYPE html&gt;\n\n&lt;html&gt;\n&lt;head&gt;\n    &lt;meta name=\"viewport\" content=\"width=device-width\" \/&gt;\n    &lt;link href=\"~\/lib\/bootstrap\/dist\/css\/bootstrap.css\" rel=\"stylesheet\" \/&gt;\n    &lt;title&gt;@ViewBag.Title&lt;\/title&gt;\n&lt;\/head&gt;\n&lt;body&gt;\n    &lt;nav class=\"navbar navbar-expand-lg navbar-light bg-light\"&gt;\n        &lt;a class=\"navbar-brand\" href=\"#\"&gt;Navbar&lt;\/a&gt;\n\n        @if (SignInManager.IsSignedIn(User))\n        {\n            &lt;form asp-controller=\"Account\" asp-action=\"Logout\" method=\"post\" id=\"logoutForm\"&gt;\n                &lt;ul class=\"navbar-nav mr-auto\"&gt;\n                    &lt;li class=\"nav-item\"&gt;\n                        &lt;a href=\"javascript:document.getElementById('logoutForm').submit()\"&gt;\u767b\u51fa&lt;\/a&gt;\n                    &lt;\/li&gt;\n\n                &lt;\/ul&gt;\n            &lt;\/form&gt;\n\n        }\n        else\n        {\n            &lt;ul class=\"navbar-nav mr-auto\"&gt;\n                &lt;li class=\"nav-item\"&gt;\n                    &lt;a asp-controller=\"Account\" asp-action=\"Register\"&gt;\u6ce8\u518c&lt;\/a&gt;\n                &lt;\/li&gt;\n                &lt;li class=\"nav-item\"&gt;\n                    &lt;a asp-controller=\"Account\" asp-action=\"Login\"&gt;\u767b\u5f55&lt;\/a&gt;\n                &lt;\/li&gt;\n            &lt;\/ul&gt;\n\n        }\n\n\n    &lt;\/nav&gt;\n\n    &lt;div&gt;\n        @RenderBody()\n    &lt;\/div&gt;\n\n    &lt;hr \/&gt;\n    @await Component.InvokeAsync(\"Welcome\")\n&lt;\/body&gt;\n&lt;\/html&gt;\n\n<\/code><\/pre>\n<h3><span id=\"i-6\">\u6dfb\u52a0\u7279\u6027<\/span><\/h3>\n<p>\u5728\u9700\u8981\u9a8c\u8bc1\u7684\u51fd\u6570\u4e0a\u9762\u589e\u52a0[authorize]\u7279\u6027<\/p>\n<pre><code class=\"language-CSharp line-numbers\">  [Authorize]\n        [HttpPost]\n        public IActionResult Add(Student model)\n        {\n            repository.Add(model);\n            return RedirectToAction(\"Index\");\n        }\n\n<\/code><\/pre>\n<h1><span id=\"i-7\">\u5177\u4f53\u6d41\u7a0b<\/span><\/h1>\n<ul>\n<li>\u6dfb\u52a0AccountController\u7c7b<\/li>\n<\/ul>\n<pre><code class=\"language-CSharp line-numbers\"> \u6dfb\u52a0SignInManager&lt;IdentityUser&gt;\u5c5e\u6027\u548cUserManager&lt;IdentitUser&gt;\u5c5e\u6027\n<\/code><\/pre>\n<ul>\n<li>\u521b\u5efa\u4e00\u4e2aLogin\u51fd\u6570\u8d1f\u8d23\u767b\u5f55<\/li>\n<li>\u521b\u5efa\u670d\u52a1\n<ol>\n<li>\u521b\u5efaIdentityDbContext\u670d\u52a1\u4ee5\u53ca\u6570\u636e\u5e93\u8fc1\u79fb\u66f4\u65b0<\/li>\n<li>\u521b\u5efa\u9ed8\u8ba4\u7684Identity\u670d\u52a1<\/li>\n<\/ol>\n<\/li>\n<\/ul>\n<pre><code class=\"language-Csharp line-numbers\">services.AddDefaultIdentity&lt;IdentityUser&gt;().AddEntityFrameworkStores&lt;IdentityBuilder&gt;();\n<\/code><\/pre>\n<ul>\n<li>\u4fee\u6539\u5bc6\u7801\u8bbe\u5b9a<br \/>\n\u5728\u670d\u52a1\u4e2d\u4fee\u6539options\u5173\u4e8e\u5bc6\u7801\u8981\u6c42\u7684\u53c2\u6570<\/li>\n<li>\u6dfb\u52a0\u4e2d\u95f4\u4ef6<br \/>\napp.UserAuthentication();<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Contents1 \u6210\u5458\u7ba1\u74062 \u9ed8\u8ba4\u4f7f\u7528MSSQL3 \u652f\u6301\u5916\u90e8\u7684Provider4 \u4f7f\u7528ASP.NET Cor [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[44,4,2],"tags":[],"class_list":["post-1109","post","type-post","status-publish","format-standard","hentry","category-asp-net-core","category-c","category-2"],"_links":{"self":[{"href":"https:\/\/www.wayln.com\/index.php?rest_route=\/wp\/v2\/posts\/1109","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.wayln.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.wayln.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.wayln.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.wayln.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1109"}],"version-history":[{"count":11,"href":"https:\/\/www.wayln.com\/index.php?rest_route=\/wp\/v2\/posts\/1109\/revisions"}],"predecessor-version":[{"id":1120,"href":"https:\/\/www.wayln.com\/index.php?rest_route=\/wp\/v2\/posts\/1109\/revisions\/1120"}],"wp:attachment":[{"href":"https:\/\/www.wayln.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1109"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.wayln.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1109"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.wayln.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1109"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}