using Microsoft.EntityFrameworkCore; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; namespace Avalonia_EFCore.Models { /// /// API refresh token。只保存哈希,不保存明文 token。 /// [Comment("API refresh token")] [Table("api-refresh-token")] public class ApiRefreshTokenEntity { /// /// 获取或设置主键 ID(自增)。 /// [Key] [Column("id")] [DatabaseGenerated(DatabaseGeneratedOption.Identity)] public long Id { get; set; } /// /// 获取或设置关联的用户 ID。 /// [Column("user-id")] public int UserId { get; set; } /// /// 获取或设置 Token 的 SHA256 哈希值,用于安全存储和查询。 /// [Column("token-hash")] [MaxLength(128)] public string TokenHash { get; set; } = string.Empty; /// /// 获取或设置 Token 创建时间。 /// [Column("created-at")] public DateTime CreatedAt { get; set; } = DateTime.UtcNow; /// /// 获取或设置 Token 过期时间。 /// [Column("expires-at")] public DateTime ExpiresAt { get; set; } /// /// 获取或设置 Token 撤销时间,null 表示尚未撤销。 /// [Column("revoked-at")] public DateTime? RevokedAt { get; set; } /// /// 获取或设置替换此 Token 的新 Token 哈希值(轮换时设置)。 /// [Column("replaced-by-token-hash")] [MaxLength(128)] public string? ReplacedByTokenHash { get; set; } /// /// 获取或设置创建设备标识(如 User-Agent)。 /// [Column("device")] [MaxLength(200)] public string? Device { get; set; } /// /// 获取或设置创建时的客户端 IP 地址。 /// [Column("ip-address")] [MaxLength(64)] public string? IpAddress { get; set; } /// /// 获取 Token 是否有效(未被撤销且未过期)。 /// public bool IsActive => RevokedAt is null && ExpiresAt > DateTime.UtcNow; } }