Browse Source

refactor: 重构服务目录结构,按功能模块分类

refactor/repository-structure
hyh 2 months ago
parent
commit
fcb169e667
  1. 2
      src/CellularManagement.Infrastructure/Services/Authentication/JwtProvider.cs
  2. 134
      src/CellularManagement.Infrastructure/Services/Authentication/JwtValidationService.cs
  3. 2
      src/CellularManagement.Infrastructure/Services/Authentication/KeyRotationBackgroundService.cs
  4. 2
      src/CellularManagement.Infrastructure/Services/Authentication/KeyRotationService.cs
  5. 2
      src/CellularManagement.Infrastructure/Services/Infrastructure/CacheService.cs
  6. 2
      src/CellularManagement.Infrastructure/Services/Infrastructure/DistributedLockService.cs
  7. 135
      src/CellularManagement.Infrastructure/Services/JwtValidationService.cs
  8. 2
      src/CellularManagement.Infrastructure/Services/Security/CaptchaService.cs
  9. 2
      src/CellularManagement.Infrastructure/Services/Security/CaptchaVerificationService.cs
  10. 2
      src/CellularManagement.Infrastructure/Services/UserManagement/EmailService.cs
  11. 2
      src/CellularManagement.Infrastructure/Services/UserManagement/EmailVerificationService.cs
  12. 2
      src/CellularManagement.Infrastructure/Services/UserManagement/UserRegistrationService.cs

2
src/CellularManagement.Infrastructure/Services/JwtProvider.cs → src/CellularManagement.Infrastructure/Services/Authentication/JwtProvider.cs

@ -10,7 +10,7 @@ using System.Text.Json;
using CellularManagement.Domain.Services;
using CellularManagement.Domain.Options;
namespace CellularManagement.Infrastructure.Services;
namespace CellularManagement.Infrastructure.Services.Authentication;
/// <summary>
/// JWT 令牌提供者实现

134
src/CellularManagement.Infrastructure/Services/Authentication/JwtValidationService.cs

@ -0,0 +1,134 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using CellularManagement.Domain.Options;
using CellularManagement.Domain.Services;
namespace CellularManagement.Infrastructure.Services.Authentication;
/// <summary>
/// JWT 验证服务实现
/// </summary>
public class JwtValidationService : IJwtValidationService
{
/// <inheritdoc />
public void ValidateOptions(JwtOptions options)
{
if (string.IsNullOrEmpty(options.SecretKey))
{
throw new ArgumentException("JWT密钥不能为空");
}
if (string.IsNullOrEmpty(options.Issuer))
{
throw new ArgumentException("JWT颁发者不能为空");
}
if (string.IsNullOrEmpty(options.Audience))
{
throw new ArgumentException("JWT受众不能为空");
}
if (options.ExpiryMinutes <= 0)
{
throw new ArgumentException("JWT过期时间必须大于0");
}
if (options.RefreshTokenExpiryDays <= 0)
{
throw new ArgumentException("刷新令牌过期时间必须大于0");
}
if (options.ClockSkewMinutes < 0)
{
throw new ArgumentException("时钟偏差不能为负数");
}
if (options.KeyRotationDays <= 0)
{
throw new ArgumentException("密钥轮换间隔必须大于0");
}
if (options.MinKeyLength < 32)
{
throw new ArgumentException("密钥最小长度必须至少为32字节");
}
// 验证密钥是否为有效的Base64字符串
try
{
var keyBytes = Convert.FromBase64String(options.SecretKey);
if (keyBytes.Length < options.MinKeyLength)
{
throw new ArgumentException($"密钥长度必须至少为{options.MinKeyLength}字节");
}
}
catch (FormatException)
{
throw new ArgumentException("JWT密钥不是有效的Base64字符串");
}
}
/// <inheritdoc />
public void ValidateKeyStrength(string secretKey, int minKeyLength)
{
if (string.IsNullOrEmpty(secretKey))
{
throw new ArgumentException("密钥不能为空");
}
// 验证密钥是否为有效的Base64字符串
try
{
var keyBytes = Convert.FromBase64String(secretKey);
if (keyBytes.Length < minKeyLength)
{
throw new ArgumentException($"密钥长度必须至少为 {minKeyLength} 字节");
}
}
catch (FormatException)
{
throw new ArgumentException("密钥不是有效的Base64字符串");
}
// 检查密钥是否包含足够的随机性
var entropy = CalculateEntropy(secretKey);
if (entropy < 3.5) // 3.5 bits per character is considered good
{
throw new ArgumentException("密钥随机性不足");
}
}
/// <summary>
/// 计算字符串熵值
/// </summary>
private static double CalculateEntropy(string input)
{
var charCounts = new Dictionary<char, int>();
foreach (var c in input)
{
if (charCounts.ContainsKey(c))
{
charCounts[c]++;
}
else
{
charCounts[c] = 1;
}
}
var length = input.Length;
var entropy = 0.0;
foreach (var count in charCounts.Values)
{
var probability = (double)count / length;
entropy -= probability * Math.Log2(probability);
}
return entropy;
}
}

2
src/CellularManagement.Infrastructure/Services/KeyRotationBackgroundService.cs → src/CellularManagement.Infrastructure/Services/Authentication/KeyRotationBackgroundService.cs

@ -5,7 +5,7 @@ using CellularManagement.Domain.Services;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
namespace CellularManagement.Infrastructure.Services;
namespace CellularManagement.Infrastructure.Services.Authentication;
/// <summary>
/// 密钥轮换后台服务

2
src/CellularManagement.Infrastructure/Services/KeyRotationService.cs → src/CellularManagement.Infrastructure/Services/Authentication/KeyRotationService.cs

@ -8,7 +8,7 @@ using Microsoft.Extensions.Logging;
using CellularManagement.Domain.Services;
using CellularManagement.Domain.Options;
namespace CellularManagement.Infrastructure.Services;
namespace CellularManagement.Infrastructure.Services.Authentication;
/// <summary>
/// 密钥轮换服务实现

2
src/CellularManagement.Infrastructure/Services/CacheService.cs → src/CellularManagement.Infrastructure/Services/Infrastructure/CacheService.cs

@ -1,7 +1,7 @@
using CellularManagement.Domain.Services;
using Microsoft.Extensions.Caching.Memory;
namespace CellularManagement.Infrastructure.Services;
namespace CellularManagement.Infrastructure.Services.Infrastructure;
/// <summary>
/// 内存缓存服务实现

2
src/CellularManagement.Infrastructure/Services/DistributedLockService.cs → src/CellularManagement.Infrastructure/Services/Infrastructure/DistributedLockService.cs

@ -4,7 +4,7 @@ using Microsoft.Extensions.Caching.Distributed;
using Microsoft.Extensions.Logging;
using CellularManagement.Domain.Services;
namespace CellularManagement.Infrastructure.Services;
namespace CellularManagement.Infrastructure.Services.Infrastructure;
/// <summary>
/// 分布式锁服务实现

135
src/CellularManagement.Infrastructure/Services/JwtValidationService.cs

@ -1,135 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using CellularManagement.Domain.Options;
using CellularManagement.Domain.Services;
namespace CellularManagement.Infrastructure.Services
{
/// <summary>
/// JWT 验证服务实现
/// </summary>
public class JwtValidationService : IJwtValidationService
{
/// <inheritdoc />
public void ValidateOptions(JwtOptions options)
{
if (string.IsNullOrEmpty(options.SecretKey))
{
throw new ArgumentException("JWT密钥不能为空");
}
if (string.IsNullOrEmpty(options.Issuer))
{
throw new ArgumentException("JWT颁发者不能为空");
}
if (string.IsNullOrEmpty(options.Audience))
{
throw new ArgumentException("JWT受众不能为空");
}
if (options.ExpiryMinutes <= 0)
{
throw new ArgumentException("JWT过期时间必须大于0");
}
if (options.RefreshTokenExpiryDays <= 0)
{
throw new ArgumentException("刷新令牌过期时间必须大于0");
}
if (options.ClockSkewMinutes < 0)
{
throw new ArgumentException("时钟偏差不能为负数");
}
if (options.KeyRotationDays <= 0)
{
throw new ArgumentException("密钥轮换间隔必须大于0");
}
if (options.MinKeyLength < 32)
{
throw new ArgumentException("密钥最小长度必须至少为32字节");
}
// 验证密钥是否为有效的Base64字符串
try
{
var keyBytes = Convert.FromBase64String(options.SecretKey);
if (keyBytes.Length < options.MinKeyLength)
{
throw new ArgumentException($"密钥长度必须至少为{options.MinKeyLength}字节");
}
}
catch (FormatException)
{
throw new ArgumentException("JWT密钥不是有效的Base64字符串");
}
}
/// <inheritdoc />
public void ValidateKeyStrength(string secretKey, int minKeyLength)
{
if (string.IsNullOrEmpty(secretKey))
{
throw new ArgumentException("密钥不能为空");
}
// 验证密钥是否为有效的Base64字符串
try
{
var keyBytes = Convert.FromBase64String(secretKey);
if (keyBytes.Length < minKeyLength)
{
throw new ArgumentException($"密钥长度必须至少为 {minKeyLength} 字节");
}
}
catch (FormatException)
{
throw new ArgumentException("密钥不是有效的Base64字符串");
}
// 检查密钥是否包含足够的随机性
var entropy = CalculateEntropy(secretKey);
if (entropy < 3.5) // 3.5 bits per character is considered good
{
throw new ArgumentException("密钥随机性不足");
}
}
/// <summary>
/// 计算字符串熵值
/// </summary>
private static double CalculateEntropy(string input)
{
var charCounts = new Dictionary<char, int>();
foreach (var c in input)
{
if (charCounts.ContainsKey(c))
{
charCounts[c]++;
}
else
{
charCounts[c] = 1;
}
}
var length = input.Length;
var entropy = 0.0;
foreach (var count in charCounts.Values)
{
var probability = (double)count / length;
entropy -= probability * Math.Log2(probability);
}
return entropy;
}
}
}

2
src/CellularManagement.Infrastructure/Services/CaptchaService.cs → src/CellularManagement.Infrastructure/Services/Security/CaptchaService.cs

@ -1,7 +1,7 @@
using CellularManagement.Domain.Services;
using SkiaSharp;
namespace CellularManagement.Infrastructure.Services;
namespace CellularManagement.Infrastructure.Services.Security;
public class CaptchaService : ICaptchaService
{

2
src/CellularManagement.Infrastructure/Services/CaptchaVerificationService.cs → src/CellularManagement.Infrastructure/Services/Security/CaptchaVerificationService.cs

@ -4,7 +4,7 @@ using Microsoft.Extensions.Logging;
using CellularManagement.Domain.Services;
using CellularManagement.Domain.Common;
namespace CellularManagement.Infrastructure.Services;
namespace CellularManagement.Infrastructure.Services.Security;
/// <summary>
/// 验证码验证服务实现

2
src/CellularManagement.Infrastructure/Services/EmailService.cs → src/CellularManagement.Infrastructure/Services/UserManagement/EmailService.cs

@ -9,7 +9,7 @@ using MailKit.Security;
using Microsoft.Extensions.Options;
using MimeKit;
namespace CellularManagement.Infrastructure.Services;
namespace CellularManagement.Infrastructure.Services.UserManagement;
/// <summary>
/// 邮箱服务实现类

2
src/CellularManagement.Infrastructure/Services/EmailVerificationService.cs → src/CellularManagement.Infrastructure/Services/UserManagement/EmailVerificationService.cs

@ -6,7 +6,7 @@ using Microsoft.Extensions.Caching.Memory;
using Microsoft.Extensions.Options;
using CellularManagement.Domain.Options;
namespace CellularManagement.Infrastructure.Services;
namespace CellularManagement.Infrastructure.Services.UserManagement;
/// <summary>
/// 邮箱验证码服务

2
src/CellularManagement.Infrastructure/Services/UserRegistrationService.cs → src/CellularManagement.Infrastructure/Services/UserManagement/UserRegistrationService.cs

@ -11,7 +11,7 @@ using CellularManagement.Domain.Repositories;
using System.Threading;
using CellularManagement.Domain.Repositories.Identity;
namespace CellularManagement.Infrastructure.Services;
namespace CellularManagement.Infrastructure.Services.UserManagement;
/// <summary>
/// 用户注册领域服务实现
Loading…
Cancel
Save