完善用户登录登出机制
This commit is contained in:
parent
bb8a3598a7
commit
7821b0b705
|
@ -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;
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
16
FAuth/DataBase/Tables/FUserStatusEnum.cs
Normal file
16
FAuth/DataBase/Tables/FUserStatusEnum.cs
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
using System;
|
||||||
|
|
||||||
|
namespace FAuth.DataBase.Tables
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 账号状态
|
||||||
|
/// </summary>
|
||||||
|
[Flags]
|
||||||
|
public enum FUserStatusEnum
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 是否已登录
|
||||||
|
/// </summary>
|
||||||
|
Login = 1
|
||||||
|
}
|
||||||
|
}
|
|
@ -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控制器返回异常
|
|
@ -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; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue
Block a user