导航
项目场景:
web\小程序。限制账户同时在线、登录。或者限制账户并发数
项目环境:asp.net core 3.1 API+redis+jwt +微信小程序
问题描述:
我们经常可以看到一些软件无法同时登录同一个账号,也就是同时只能有一个用户使用这个账号。或者另一种情形,限制用户并发数。这些都涉及到对在线用户登陆态的管理
解决思路:
- 后端在用户登录时记录下登录账号、时间、Token值,以Hash类型存入Redis。
- 登录成功后使用websocket监听客户端是否在线(主要为了解决用户非正常退出或关闭,而导致登陆态无法改变的情况)
- 用户登录时判断Redis数据库中该账号是否已存在登陆态数据,已存在则无法登录。
- 用户退出或是程序非正常关闭时,WS连接断开并同时清除redis中的用户登陆态数据
后端解决方案代码:
JWT实现鉴权中心,写成服务注入IOC容器中
using Microsoft.Extensions.Configuration;
using Microsoft.IdentityModel.Tokens;
using System;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using System.Text;
namespace canteen_order.Unity
{
public interface IJWTService{
string GetToken(string UserName);
}
public class JWTService : IJWTService
{
private readonly IConfiguration _configuration;
public JWTService(IConfiguration configuration){
_configuration = configuration;
}
public string GetToken(string UserName)
{
//payload信息
Claim[] claim = new[] {
new Claim("WorkId",UserName), };
SymmetricSecurityKey key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_configuration["SecurityKey"]));
SigningCredentials credentials = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
var token = new JwtSecurityToken(
expires: DateTime.Now.AddMinutes(10),
signingCredentials:credentials