.net core 实例教程(十)后台管理用户登录接口实现
小白浏览:4572024-03-21 15:40:15本文累计收益:0我也要赚钱

本文源码下载地址: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个)

评论列表
发表评论
+ 关注