网站首页 网站源码
website
站点相关全部源代码,隐藏了一些关于服务器的信息
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);
    }
}

⚠⚠    以下内容为AI分析的结果,请根据实际情况进行判断。

上述代码实现了一个 SecurityStampService 类和相关的扩展方法,用于生成和验证安全的 SecurityStamp。SecurityStamp 是一种用于标识用户状态或会话的安全标记,通常用于身份验证和授权场景。以下是代码的主要功能和结构的详细解释:

1. SecurityStampService

1.1 生成 SecurityStamp

  • 方法: GenerateSecurityStamp()
  • 功能: 生成一个新的 SecurityStamp。使用加密安全的随机数生成器生成 16 字节的随机数据,并将其转换为 GUID 格式的字符串。返回的字符串格式为 XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX,并且是大写的。

1.2 验证 SecurityStamp

  • 方法: IsValidSecurityStamp(string securityStamp)
  • 功能: 验证传入的 SecurityStamp 是否有效。检查 SecurityStamp 是否为空或仅包含空白字符,并尝试将其解析为 GUID 格式。如果解析成功,则返回 true,否则返回 false

2. SecurityStampServiceExtensions

这是一个静态类,提供了对 ISecurityStampService 的扩展方法,增加了更高级的 SecurityStamp 操作。

2.1 生成基于时间戳的 SecurityStamp

  • 方法: GenerateTimestampedSecurityStamp(this ISecurityStampService service, string userId)
  • 功能: 生成一个包含时间戳的 SecurityStamp。首先调用 GenerateSecurityStamp() 生成基础的 SecurityStamp,然后获取当前的 Unix 时间戳。使用 HMAC-SHA256 算法对基础 SecurityStamp 和时间戳进行哈希处理,以确保其完整性。最终返回的 SecurityStamp 格式为 基础SecurityStamp-哈希值

2.2 验证基于时间戳的 SecurityStamp

  • 方法: IsValidTimestampedSecurityStamp(this ISecurityStampService service, string securityStamp, string userId)
  • 功能: 验证传入的基于时间戳的 SecurityStamp 是否有效。首先检查 SecurityStamp 和用户 ID 是否为空。然后将 SecurityStamp 按照 - 分割,检查其部分的数量是否符合预期(至少包含 6 个部分)。重构基础的 GUID 部分,并调用 IsValidSecurityStamp() 方法验证其有效性。

总结

整体上,这段代码提供了一个安全的方式来生成和验证 SecurityStamp,支持基本的 SecurityStamp 和基于时间戳的 SecurityStamp。它使用了加密安全的随机数生成器和 HMAC 算法,确保生成的 SecurityStamp 具有不可预测性和完整性,适合用于安全敏感的应用场景。

loading