网站首页 网站源码
namespace Dpz.Core.Service.RepositoryServiceImpl;
/// <summary>
/// SecurityStamp服务实现
/// 提供安全的SecurityStamp生成和验证功能
/// </summary>
public class SecurityStampService : ISecurityStampService
{
/// <summary>
/// 生成新的SecurityStamp
/// 使用加密安全的随机数生成器,确保不可预测性
/// </summary>
/// <returns>格式为 XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX 的SecurityStamp</returns>
public string GenerateSecurityStamp()
{
// 使用加密安全的随机数生成器
using var rng = RandomNumberGenerator.Create();
// 生成16字节的随机数据
var randomBytes = new byte[16];
rng.GetBytes(randomBytes);
// 转换为Guid格式的字符串(保持与现有系统的兼容性)
var guid = new Guid(randomBytes);
return guid.ToString().ToUpperInvariant();
}
/// <summary>
/// 验证SecurityStamp格式是否有效
/// </summary>
/// <param name="securityStamp">要验证的SecurityStamp</param>
/// <returns>是否有效</returns>
public bool IsValidSecurityStamp(string securityStamp)
{
return !string.IsNullOrWhiteSpace(securityStamp) && Guid.TryParse(securityStamp, out _);
}
}
/// <summary>
/// SecurityStamp服务的扩展方法
/// 提供更高级的SecurityStamp操作
/// </summary>
public static class SecurityStampServiceExtensions
{
/// <summary>
/// 生成基于时间戳的SecurityStamp(用于特殊场景)
/// </summary>
/// <param name="service">SecurityStamp服务</param>
/// <param name="userId">用户ID</param>
/// <returns>包含时间戳信息的SecurityStamp</returns>
public static string GenerateTimestampedSecurityStamp(
this ISecurityStampService service,
string userId
)
{
// 生成基础的随机SecurityStamp
var baseStamp = service.GenerateSecurityStamp();
// 添加时间戳信息(用于审计和调试)
var timestamp = DateTimeOffset.UtcNow.ToUnixTimeSeconds();
// 使用HMAC确保完整性
using var hmac = new HMACSHA256(Encoding.UTF8.GetBytes($"SecurityStamp-{userId}"));
var hash = hmac.ComputeHash(Encoding.UTF8.GetBytes($"{baseStamp}-{timestamp}"));
// 返回组合的SecurityStamp
return $"{baseStamp}-{Convert.ToHexString(hash)[..8]}";
}
/// <summary>
/// 验证基于时间戳的SecurityStamp
/// </summary>
/// <param name="service">SecurityStamp服务</param>
/// <param name="securityStamp">要验证的SecurityStamp</param>
/// <param name="userId">用户ID</param>
/// <returns>是否有效</returns>
public static bool IsValidTimestampedSecurityStamp(
this ISecurityStampService service,
string securityStamp,
string userId
)
{
if (string.IsNullOrWhiteSpace(securityStamp) || string.IsNullOrWhiteSpace(userId))
{
return false;
}
var parts = securityStamp.Split('-');
// GUID格式 + 额外的哈希部分
if (parts.Length < 6)
{
return false;
}
// 重构基础GUID部分
var guidPart = string.Join("-", parts[..5]);
return service.IsValidSecurityStamp(guidPart);
}
}
上述代码实现了一个 SecurityStampService 类和相关的扩展方法,用于生成和验证安全的 SecurityStamp。SecurityStamp 是一种用于标识用户状态或会话的安全标记,通常用于身份验证和授权场景。以下是代码的主要功能和结构的详细解释:
SecurityStampService 类GenerateSecurityStamp()XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX,并且是大写的。IsValidSecurityStamp(string securityStamp)true,否则返回 false。SecurityStampServiceExtensions 类这是一个静态类,提供了对 ISecurityStampService 的扩展方法,增加了更高级的 SecurityStamp 操作。
GenerateTimestampedSecurityStamp(this ISecurityStampService service, string userId)GenerateSecurityStamp() 生成基础的 SecurityStamp,然后获取当前的 Unix 时间戳。使用 HMAC-SHA256 算法对基础 SecurityStamp 和时间戳进行哈希处理,以确保其完整性。最终返回的 SecurityStamp 格式为 基础SecurityStamp-哈希值。IsValidTimestampedSecurityStamp(this ISecurityStampService service, string securityStamp, string userId)- 分割,检查其部分的数量是否符合预期(至少包含 6 个部分)。重构基础的 GUID 部分,并调用 IsValidSecurityStamp() 方法验证其有效性。整体上,这段代码提供了一个安全的方式来生成和验证 SecurityStamp,支持基本的 SecurityStamp 和基于时间戳的 SecurityStamp。它使用了加密安全的随机数生成器和 HMAC 算法,确保生成的 SecurityStamp 具有不可预测性和完整性,适合用于安全敏感的应用场景。
