.net core 实例教程(十)后台管理用户登录接口实现
本文源码下载地址:http://www.80cxy.com/Blog/ResourceView?arId=202403191532545995NAAqJh
系列教程地址:http://www.80cxy.com/Blog/ArticleView?arId=202403191517574161ay3s5V
本文实现后台管理用户登录功能,用户输入用户名及密码进行登录,为加强系统安全性,如果密码5分钟内连续输入错误满3次自动锁定账号,用户登录日志记录到Redis中。效果图如下:

一、首先改造SysUser实体类,增加如下方法:
/// <summary>
/// 判断密码是否正确
/// </summary>
/// <param name="password"></param>
/// <returns></returns>
public bool CheckPassword(string password)
{
//需要设置加密算法
return this.Password == password;
}
/// <summary>
/// 禁用账号
/// </summary>
/// <param name="password"></param>
/// <returns></returns>
public bool ServerUserDisable()
{
//需要设置加密算法
return this.IsDisable = true;
}
/// <summary>
/// 判断用户是否禁用
/// </summary>
/// <param name="password"></param>
/// <returns></returns>
public bool CheckUserIsDisable()
{
//需要设置加密算法
return this.IsDisable;
}
二、仓储代码实现
public async Task<SysUser?> FindOneByUserName(string userName)
{
return await _dbContext.SysUser.SingleOrDefaultAsync(m => m.UserName == userName);
}
public string CheckForSignInAsync(SysUser user, string password)
{
//用户已经锁定
if (user.CheckUserIsDisable())
{
return "登录失败,用户被锁定!";
}
//登录成功
var success = user.CheckPassword(password);
if (success)
{
return "success";
}
//密码不对
else
{
//5分钟内输入错误3次,将锁定账户
string cacheKey = RedisConstants.LOGIN_LOCK_KEY + user.Id.ToString();
string lockCache = _cacheService.Get(cacheKey);//写入缓存
if (!string.IsNullOrEmpty(lockCache))
{
if (int.Parse(lockCache) >= 3)
{
//锁定用户
user.ServerUserDisable();
return "登录失败,用户已被锁定!";
}
else {
//错误次数增加1
_cacheService.Incr(cacheKey, 1);
}
}
else {
//首次错误添加缓存
_cacheService.Add(cacheKey, "1", 300);
}
return "登录失败,用户密码不正确!";
}
}
Redis项目配置教程参见.net core 实例教程(九)缓存配置、Redis配置及类库一文。
三、领域服务代码实现
#region 用户登录
/// <summary>
/// 使用用户名、用户密码登录
/// </summary>
/// <param name="userName"></param>
/// <param name="password"></param>
/// <returns></returns>
public async Task<ResponseContent> AdminLogin(string userName, string password)
{
ResponseContent response = new ResponseContent();
//验证用户名及密码是否正确
string checkResult = await CheckUserNameAndPwdAsync(userName, Md5.Encrypt(password));
if (checkResult == "success")
{
//查询用户信息
var user = await _systemDomainRepostory.FindOneByUserName(userName);
//生成token并且返回
string token = await BuildTokenAsync(user);
return response.Ok(new { token = token });
}
else
return response.Error(checkResult);
}
/// <summary>
/// 验证用户名、密码是否正确
/// </summary>
/// <param name="userName"></param>
/// <param name="password"></param>
/// <returns></returns>
private async Task<string> CheckUserNameAndPwdAsync(string userName, string password)
{
//验证用户名是否正确
var user = await _systemDomainRepostory.FindOneByUserName(userName);
if (user == null)
{
return "登录失败,用户名输入错误";
}
//验证密码是否正确
return _systemDomainRepostory.CheckForSignInAsync(user, password);
}
/// <summary>
/// 创建token
/// </summary>
/// <param name="user"></param>
/// <returns></returns>
private async Task<string> BuildTokenAsync(SysUser user)
{
//var roles = await repository.GetRolesAsync(user);
List<Claim> claims = new List<Claim>();
claims.Add(new Claim(ClaimTypes.NameIdentifier, user.Id.ToString()));
//foreach (string role in roles)
//{
// claims.Add(new Claim(ClaimTypes.Role, role));
//}
return _tokenService.BuildToken(claims, _optJWT.Value);
}
#endregion
四、Controllers代码
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using SignUp.Common.ASPNETCore;
using SignUp.Domain.Service;
using SignUp.Infrastructure;
using SignUp.WebApi.ViewModels.Login;
namespace SignUp.WebApi.Controllers
{
[Route("api/[controller]/[action]")]
[ApiController]
public class AdminLoginController : ControllerBase
{
private readonly ISystemDomainService _systemDomainService;
public AdminLoginController(ISystemDomainService systemDomainService)
{
_systemDomainService = systemDomainService;
}
/// <summary>
/// 用户登录
/// </summary>
/// <param name="req"></param>
/// <returns></returns>
/// <exception cref="ApplicationException"></exception>
[HttpPost]
//[AllowAnonymous]
[UnitOfWork(typeof(SignUpDbContext))]
public async Task<ActionResult> AdminLogin(LoginRequest req)
{
return new JsonResult(await _systemDomainService.AdminLogin(req.UserName, req.Password));
}
}
}
学习交流

附笔者学习 .net core开发时参考相关项目实例源码:asp.net core webapi项目实例源代码锦集下载(72个)
猜您可能还喜欢
- .Nuget Packages 太占C盘,删除后可以放到其他盘(1668)
- net core+webapi+nginx windows 服务器部署(1514)
- ASP.NET Core 配置 Swagger 显示接口注释描述信息(1283)
- .net core 6.0 web API + SwaggerUI + IIS部署(1271)
- vue调用接口后获取不到后端返回的Header响应头(1227)
- .net core 系列实例开发教程-权限管理系统功能介绍(1143)
- .net core 实例教程(十二)配置启用Swagger中的【Authorize】按钮(1119)
- .net core 实例教程(十一)生成JWT格式的token密码配置及代码(1036)
- .net core 实例教程(十四)配置 Swagger 显示接口注释描述信息及支持版本控制(1006)
- .net core 实例教程(三)仓储及领域服务功能实现(既实现用户表的增删改查接口)(971)
评论列表
发表评论
文章分类
文章归档
- 2025年3月 (1)
- 2024年6月 (2)
- 2024年5月 (2)
- 2024年4月 (4)
- 2024年3月 (30)
- 2024年1月 (4)
- 2023年12月 (2)
- 2023年11月 (4)
- 2023年10月 (4)
- 2023年9月 (6)
- 2023年3月 (2)
- 2023年2月 (1)
- 2023年1月 (1)
- 2022年12月 (1)
- 2022年9月 (21)
- 2022年8月 (10)
- 2022年7月 (3)
- 2022年4月 (1)
- 2022年3月 (13)
- 2021年8月 (1)
- 2021年3月 (1)
- 2020年12月 (42)
- 2020年11月 (7)
- 2020年10月 (5)
- 2020年8月 (1)
- 2020年6月 (1)
- 2020年3月 (2)
- 2019年12月 (8)
- 2019年11月 (3)
- 2019年9月 (1)
- 2019年4月 (1)
- 2019年3月 (6)
- 2019年2月 (1)
- 2018年7月 (7)
阅读排行
- 1.asp.net mvc内微信pc端、H5、JsApi支付方式总结(5920)
- 2.Windows 10休眠文件更改存储位置(4013)
- 3.各大搜索网站网站收录提交入口地址(3506)
- 4.windows 10安装myeclipse 10破解补丁cracker.jar、run.bat闪退解决办法(3482)
- 5.ECharts仪表盘实例及参数使用详解(3465)
- 6.华为鸿蒙系统清除微信浏览器缓存方法(3258)
- 7.HTML5 WebSocket与C#建立Socket连接实现代码(3222)
- 8.CERT_HAS_EXPIRED错误如何解决(3022)
- 9.Js异步async、await关键字详细介绍(lambda表达式中使用async和await关键字)(2667)
- 10.HBuilder编辑器格式化代码(2430)
