完善用户登录登出机制

This commit is contained in:
falcon 2020-04-13 08:35:54 +08:00
parent bb8a3598a7
commit 7821b0b705
8 changed files with 68 additions and 10 deletions

View File

@ -1,4 +1,5 @@
using System;
using FAuth.Extensions;
using FAuth.Models;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;

View File

@ -38,14 +38,14 @@ namespace FAuth.Controllers.api
}
/// <summary>
/// 验证用户名密码是否匹配
/// 用户登录方法
/// </summary>
/// <param name="userName">用户名</param>
/// <param name="password">密码</param>
/// <returns>是否匹配</returns>
/// <returns>登录结果</returns>
[HttpPost]
[ProducesResponseType(typeof(CheckUserResult),200)]
public CheckUserResult CheckUser(string userName,string password) {
public CheckUserResult Login(string userName,string password) {
if(userName.IsNullOrEmpty()) {
throw new ArgumentNullException(nameof(userName));
}
@ -54,15 +54,39 @@ namespace FAuth.Controllers.api
throw new Exception("提供的用户名或密码不正确");
}
var fir = qu.First();
fir.LastLoginDatetime = DateTimeOffset.Now;
var now = DateTimeOffset.Now;
fir.LastLoginDatetime = now;
fir.Status |= FUserStatusEnum.Login;
this.Db.SaveChangesAsync().Wait();
return new CheckUserResult {
Ticket = this.UserTicketDryptor.Encrypt(new UserTicketModel {
Id = fir.Id,
UserName = fir.UserName,
LoginDatetime = now,
}),
};
}
/// <summary>
/// 登出用户
/// </summary>
/// <param name="ticket">用户票据</param>
/// <returns>是否成功</returns>
[HttpPost]
public bool Logout(string ticket) {
if(ticket.IsNullOrEmpty()) {
throw new ArgumentNullException(nameof(ticket));
}
var userTicketModel = this.UserTicketDryptor.Decrypt(ticket);
var qu = this.Db.Users.Where(m => m.Id == userTicketModel.Id);
if(!qu.Any()) {
throw new Exception("提交的票据信息错误");
}
var fir = qu.First();
fir.Status &= ~FUserStatusEnum.Login;
fir.LastLogoutDatetime = DateTimeOffset.Now;
this.Db.SaveChangesAsync().Wait();
return true;
}
/// <summary>
/// 根据用户凭据获取用户信息
@ -75,13 +99,15 @@ namespace FAuth.Controllers.api
if(ticket.IsNullOrEmpty()) {
throw new ArgumentNullException(nameof(ticket));
}
UserTicketModel userTicketModel = null;
userTicketModel = this.UserTicketDryptor.Decrypt(ticket);
var userTicketModel = this.UserTicketDryptor.Decrypt(ticket);
var qu = this.Db.Users.Where(m => m.Id == userTicketModel.Id);
if(!qu.Any()) {
throw new Exception("提交的票据信息错误");
}
var fir = qu.First();
if(fir.LastLogoutDatetime.HasValue && userTicketModel.LoginDatetime < fir.LastLogoutDatetime.Value) {
throw new Exception("用户已登出");
}
return new UserInfo {
Id = fir.Id,
LastLoginDatetime = fir.LastLoginDatetime,

View File

@ -29,8 +29,16 @@ namespace FAuth.DataBase.Tables
[Required, MaxLength(20)]
public string Password { get; set; }
/// <summary>
/// 账号状态
/// </summary>
public FUserStatusEnum Status { get; set; }
/// <summary>
/// 上次登录时间
/// </summary>
public DateTimeOffset? LastLoginDatetime { get; set; }
/// <summary>
/// 上次登出时间
/// </summary>
public DateTimeOffset? LastLogoutDatetime { get; set; }
}
}

View File

@ -0,0 +1,16 @@
using System;
namespace FAuth.DataBase.Tables
{
/// <summary>
/// 账号状态
/// </summary>
[Flags]
public enum FUserStatusEnum
{
/// <summary>
/// 是否已登录
/// </summary>
Login = 1
}
}

View File

@ -1,10 +1,11 @@
using System;
using FAuth.Models;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.Extensions.Logging;
namespace FAuth.Models
namespace FAuth.Extensions
{
/// <summary>
/// Api控制器返回异常

View File

@ -1,4 +1,6 @@
namespace FAuth.Extensions.Decryptor
using System;
namespace FAuth.Extensions.Decryptor
{
/// <summary>
/// 用户票据中的用户信息
@ -13,5 +15,9 @@
/// 登录用户名称
/// </summary>
public string UserName { get; set; }
/// <summary>
/// 登录时间
/// </summary>
public DateTimeOffset LoginDatetime { get; set; }
}
}

View File

@ -6,7 +6,7 @@
public class ApiErrorResult
{
/// <summary>
/// 异常信
/// 异常信
/// </summary>
public string Message { get; set; }
/// <summary>

View File

@ -4,8 +4,8 @@ using System.Text.Encodings.Web;
using System.Text.Unicode;
using Falcon.Extend;
using FAuth.DataBase;
using FAuth.Extensions;
using FAuth.Extensions.Decryptor;
using FAuth.Models;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.EntityFrameworkCore;