《ProASP.NETMVC5》、《锋利的jQuery》
此系列皆使用VS2017+C#作为开发环境。如果有什么问题或者意见欢迎在留言区进行留言。
一到四为对Student即Identity框架的使用,第五节为对Admin用户的配置
一、自定义账号和密码的限制
在Startup.cs的ConfigureServices方法中可以对Identity的账号和密码进行限制:
此处AllowedUserNameCharacters方法限制用户名能够使用的字符,需要单独输入每个字符。
剩下的设置分别为限制密码必须有符号/包含小写字母/包含大写字母/包含数字。
二、对数据库进行初始化
在此创建一个StudentInitiator以及一个BookInitiator用以对数据库进行初始化:
1publicclassStudentInitiator2{3publicstaticasyncTaskInitial(IServiceProviderserviceProvider)4{5UserManager
新建BookInitiator用于初始化该数据库,不知道为什么在这里会报一个Book重复主键的错误,但是数据确实全都插进去了:
为确保能够进行初始化,在Startup.cs的Configure方法中调用该静态方法:
1DatabaseInitiator.Initial(app.ApplicationServices).Wait();2BookInitiator.BookInitial(app.ApplicationServices).Wait();
Initial方法中serviceProvider参数将在传入ConfigureServices方法调用后的ServiceProvider,此时在Initial方法中初始化的数据也会使用ConfigureServices中对账号和密码的限制。
此处我们使用账号的后六位作为密码。启动网页后查看数据库的数据:
三、建立验证所用的控制器以及视图
[UIHint]特性构造函数传入一个字符串用来告知对应属性在使用Html.EditorFor()时用什么模板来展示数据。
使用支架特性创建一个StudentAccountController
StudentAccount控制器:
1publicclassStudentAccountController:Controller2{3publicIActionResultLogin(stringreturnUrl)4{5if(HttpContext.User.Identity.IsAuthenticated)6{7returnRedirectToAction("AccountInfo");8}910LoginModelloginInfo=newLoginModel();11ViewBag.returnUrl=returnUrl;12returnView(loginInfo);13}14}
Login视图:
25行中使用了刚建立的LoginTypeTagHelper:
然后创建一个用于对信息进行验证的动作方法。
StudentAccountController整体:
1services.ConfigureApplicationCookie(opts=>2{3opts.LoginPath="/StudentAccount/Login";4}
为了使[Authorize]特性能够正常工作,需要在Configure方法中使用Authentication中间件,如果没有调用app.UseAuthentication(),则访问带有[Authorize]的方法会再度要求进行验证。中间件的顺序很重要:
1app.UseAuthentication();2app.UseHttpsRedirection();3app.UseStaticFiles();4app.UseCookiePolicy();
直接访问AccountInfo页面:
输入账号密码进行验证:
验证之后返回/StudentAccount/AccountInfo页面:
四、创建登出网页
1publicasyncTask
同时在AccountInfo添加登出按钮:
1@modelDictionary账户信息
67@foreach(varinfoinModel)8{9
12
13
登出后返回Login页面,同时AccountInfo页面需要重新进行验证。
修改StudentInitial类,添加名为admin的学生数组并使用AddToRoleAsync为用户添加身份。在添加Role之前需要在RoleManager对象中使用Create方法为Role数据库添加特定的Role字段:
1services.ConfigureApplicationCookie(opts=>2{3opts.Cookie.HttpOnly=true;4opts.LoginPath="/StudentAccount/Login";5opts.AccessDeniedPath="/StudentAccount/Login";6opts.ExpireTimeSpan=TimeSpan.FromMinutes(5);7});则当Role不为Admin时将返回/StudentAccount/Login而非默认的/Account/AccessDeny。
然后新建一个用以管理学生信息的AdminAccount控制器,设置[Authorize]特性并指定Role属性,使带有特定Role的身份才可以访问该控制器。
1[Authorize(Roles="Admin")]2publicclassAdminAccountController:Controller3{4privateUserManager