完善用户登录登出机制

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 System;
using FAuth.Extensions;
using FAuth.Models; using FAuth.Models;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;

View File

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

View File

@ -29,8 +29,16 @@ namespace FAuth.DataBase.Tables
[Required, MaxLength(20)] [Required, MaxLength(20)]
public string Password { get; set; } public string Password { get; set; }
/// <summary> /// <summary>
/// 账号状态
/// </summary>
public FUserStatusEnum Status { get; set; }
/// <summary>
/// 上次登录时间 /// 上次登录时间
/// </summary> /// </summary>
public DateTimeOffset? LastLoginDatetime { get; set; } 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 System;
using FAuth.Models;
using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters; using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
namespace FAuth.Models namespace FAuth.Extensions
{ {
/// <summary> /// <summary>
/// Api控制器返回异常 /// Api控制器返回异常

View File

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

View File

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

View File

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