C#:Sqlite实现token

C# SQLite Token 实现指南

核心实现步骤
  1. 创建 SQLite 数据库
using System.Data.SQLite;

// 创建数据库连接
var connection = new SQLiteConnection("Data Source=tokens.db;Version=3;");
connection.Open();

// 创建token表
var createTableCmd = new SQLiteCommand(
    @"CREATE TABLE IF NOT EXISTS Tokens (
        Id INTEGER PRIMARY KEY AUTOINCREMENT,
        TokenValue TEXT NOT NULL UNIQUE,
        UserId INTEGER NOT NULL,
        Expiry DATETIME NOT NULL,
        Created DATETIME DEFAULT CURRENT_TIMESTAMP
    )", connection);
createTableCmd.ExecuteNonQuery();
  1. 生成 Token 方法
public string GenerateToken(int userId, TimeSpan validity)
{
    using var rng = System.Security.Cryptography.RandomNumberGenerator.Create();
    byte[] tokenData = new byte[32];
    rng.GetBytes(tokenData);
    return Convert.ToBase64String(tokenData);
}
  1. 存储 Token 方法
public void StoreToken(string token, int userId, DateTime expiry)
{
    using var cmd = new SQLiteCommand(
        @"INSERT INTO Tokens (TokenValue, UserId, Expiry) 
        VALUES (@token, @userId, @expiry)",
        connection);
    
    cmd.Parameters.AddWithValue("@token", token);
    cmd.Parameters.AddWithValue("@userId", userId);
    cmd.Parameters.AddWithValue("@expiry", expiry);
    
    cmd.ExecuteNonQuery();
}
  1. 验证 Token 方法
public bool ValidateToken(string token)
{
    using var cmd = new SQLiteCommand(
        @"SELECT COUNT(*) FROM Tokens 
        WHERE TokenValue = @token 
        AND Expiry > CURRENT_TIMESTAMP",
        connection);
    
    cmd.Parameters.AddWithValue("@token", token);
    long count = (long)cmd.ExecuteScalar();
    return count > 0;
}
完整使用示例
// 生成并存储token
var tokenService = new TokenService();
string newToken = tokenService.GenerateToken(userId: 1001, TimeSpan.FromHours(2));
DateTime expiry = DateTime.UtcNow.AddHours(2);
tokenService.StoreToken(newToken, 1001, expiry);

// 验证token
bool isValid = tokenService.ValidateToken(newToken);
Console.WriteLine($"Token valid: {isValid}");  // 输出: Token valid: True

// 过期后验证
Thread.Sleep(TimeSpan.FromHours(3));
isValid = tokenService.ValidateToken(newToken);
Console.WriteLine($"Token valid: {isValid}");  // 输出: Token valid: False
关键注意事项
  1. 安全增强

    • 使用 System.Security.Cryptography 生成强随机数
    • 设置合理的过期时间(建议不超过24小时)
    • 启用SQLite连接加密(需额外库支持)
  2. 性能优化

    • 添加索引加速查询
    CREATE INDEX idx_token_value ON Tokens(TokenValue);
    CREATE INDEX idx_expiry ON Tokens(Expiry);
    
  3. 错误处理

    • 添加异常处理
    try {
        // 数据库操作
    }
    catch (SQLiteException ex) {
        // 处理数据库错误
    }
    
  4. 定期清理

    // 删除过期token
    new SQLiteCommand(
        "DELETE FROM Tokens WHERE Expiry < CURRENT_TIMESTAMP",
        connection).ExecuteNonQuery();
    
依赖安装

通过NuGet安装所需包:

Install-Package System.Data.SQLite

此实现提供基础Token管理功能,实际生产环境需根据具体安全要求增加加密、刷新机制等增强措施。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值