C# SQLite Token 实现指南
核心实现步骤
- 创建 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();
- 生成 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);
}
- 存储 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();
}
- 验证 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
关键注意事项
-
安全增强
- 使用
System.Security.Cryptography生成强随机数 - 设置合理的过期时间(建议不超过24小时)
- 启用SQLite连接加密(需额外库支持)
- 使用
-
性能优化
- 添加索引加速查询
CREATE INDEX idx_token_value ON Tokens(TokenValue); CREATE INDEX idx_expiry ON Tokens(Expiry); -
错误处理
- 添加异常处理
try { // 数据库操作 } catch (SQLiteException ex) { // 处理数据库错误 } -
定期清理
// 删除过期token new SQLiteCommand( "DELETE FROM Tokens WHERE Expiry < CURRENT_TIMESTAMP", connection).ExecuteNonQuery();
依赖安装
通过NuGet安装所需包:
Install-Package System.Data.SQLite
此实现提供基础Token管理功能,实际生产环境需根据具体安全要求增加加密、刷新机制等增强措施。
400

被折叠的 条评论
为什么被折叠?



