更新时间:2021年1月25日
我可从没说过日记是一日一更
有空就更(其实昨天去吃了自助,晚上不想动了。。)
登录模块
做毕业设计,当然是要把自己会的东西放上去,如果像一般的做法,感觉挑战性不是很大,弄,就弄好点!弄就弄大点!淦!
我们登录系统使用:
ASP.NET Core Identity Entity Framework Core.
进行身份验证
宇宙无敌的vs直接管理NuGet包,进行安装
模型层添加模型
继承 IdentityUser
上下文继承:IdentityDbContext
添加表
接下来,开始更新数据库!
nuget窗口
出问题了
问题不大
我们要将tools加入到启动项里才行,其他地方就会出问题
又炸了,裂开
原因:运行工具的项目与类不在相同的程序集中
这可以有点难受了
这个问题之前mvc不用考虑,因为都是一个项目,现在是多个项目和在一起的解决方案,我也很搞不懂为什么微软要这样弄
历经多番磨难,终于解决了这个跨项目的问题
这里添加这么一个配置
继续生成
输入
我就服了,炸了
离谱的是这个是我自己的表,我怎么知道他需要这个?
我真的吐了
我这个不确定是不是那个表重复的原因,我先改一个名字看看
好家伙,也不是
问题真的越来越大了
最离谱的是,我更换一个新数据库便没有这个问题
其实这样想,目前问题不大,之后可能会出问题,先留个坑,新建一个数据库吧
好家伙,好家伙,直接转移了数据库
启动进行身份注入:
启用服务
不过没那么简单,我们需要登入用户的模型
处理登入,注册,退出的代码:
太长了,不好截图。。。
using CC.GraduationProject.Common;
using CC.GraduationProject.Model;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace CC.GraduationProject.API.Controllers
{
[Route("[controller]/[action]")]
[ApiController]
public class AccountController : ControllerBase
{
//UserManager: 处理用户相关逻辑,如添加删除,修改密码,添加删除角色等。
public UserManager<ResultUser> UserManager { get; }
//SignInManager:处理注册登录相关业务逻辑。
public SignInManager<ResultUser> SignInManager { get; }
public AccountController(UserManager<ResultUser> userManager, SignInManager<ResultUser> signInManager)
{
UserManager = userManager;
SignInManager = signInManager;
}
//以上代码需要导入相应的命名空间
//Get:/Account/Login
//POST: /Account/Login
//加入[ValidateAntiForgeryToken]过滤特性。该特性表示检测服务器请求是否被篡改。注意:该特性只能用于post请求,get请求无效。
[HttpPost]
public async Task<IActionResult> Login()
{
var result = await SignInManager.PasswordSignInAsync("测试", "cc123456789.",false, lockoutOnFailure: false);// lockoutOnFailure: false如果登录失败是否锁定用户
if (result.Succeeded)
{
return Content(JsonFactory.Json(message: "登入成功"));
}
else
{
return Content(JsonFactory.Json(message: "用户名或密码错误"));
}
}
//POST:/Account/Register
[HttpPost]
public async Task<IActionResult> Register()
{
var user = new ResultUser { UserName = "测试", Email ="454313500@qq.com"};
var result = await UserManager.CreateAsync(user,"cc123456789.");
//黄色底纹改为(user)可否?——不可以,创建的用户要带上密码,否则,注册的密码存储不了
//result实际为 IdentityResult 类型,该类代表了创建账户的结果,其中
//Succeeded 属性 代表了操作成功了
//Errors 属性, 包含了IdentityError对象的集合,identityError对象描述了错误信息,IdentityError有个public string Description { get; set; }属性代表了错误信息描述
if (result.Succeeded)
{
return Content(JsonFactory.Json(message: "注册成功"));
}
string err = "";
foreach (var error in result.Errors)
{
err = err + error.Description;
}
return Content(JsonFactory.Json(message: err));
}
//POST:/Account/LogOff
[HttpPost]
public async Task<ActionResult> LogOff()
{
var userName = HttpContext.User.Identity.Name;
await SignInManager.SignOutAsync();
return Content(JsonFactory.Json(message: "安全退出成功!"));
}
}
}
鬼知道,我在这里进了几个坑,修了多少bug,说多了,都是泪
我们运行一下,先注册一个账号看看
蹦!
好家伙,能一次成,我都不信
看看问题,感觉不是大问题
意思是说我放的密码,不能有非法符号,也就是那个点,这个好办啊
直接改
蹦!
看了一下,问题还是这里,密码必须要有一位大写
恶心啊!又蹦了
这次是用户名,只能有字母和数字!
终于成了!
好家伙
这玩意儿,磨了我一晚上时间!
现在,我只要在需要登入才能访问的控制器里面加入
[Authorize]
特性,没有登入的用户,将无法进行访问!
基本框架搭建完毕!
比想象的,要复杂一点
前端:
创建了一个登录,注册的路由,其他啥也没动
又是修bug修了一天,有点难受。