refactor: ♻️ 清理无用代码 (#101)

This commit is contained in:
nsnail 2024-04-22 21:24:04 +08:00 committed by GitHub
parent 3847d6fdbb
commit a5b47c8d6b
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -1,113 +0,0 @@
namespace NetAdmin.Domain.Contexts;
/// <summary>
/// 上下文应用信息
/// </summary>
/// <remarks>
/// 签名算法: $"${appId}{appSecret.ToLowerInvariant()}{timestamp}{reqBody}".Md5(Encoding.UTF8);
/// reqBody 需去除\r、\n、whitespace
/// </remarks>
public sealed record ContextApp : DataAbstraction, IValidatableObject
{
private const int _TS_OFFSET_SCOPE_SEC = 30;
/// <summary>
/// Initializes a new instance of the <see cref="ContextApp" /> class.
/// </summary>
public ContextApp(long appId, string appSecret, long timestamp)
{
AppId = appId;
AppSecret = appSecret;
Timestamp = timestamp;
}
/// <summary>
/// Initializes a new instance of the <see cref="ContextApp" /> class.
/// </summary>
private ContextApp()
{
AppId = App.HttpContext.Request.Headers[nameof(AppId)].FirstOrDefault().Int64Try(0);
AppSecret = App.HttpContext.Request.Headers[nameof(AppSecret)].FirstOrDefault();
Sign = App.HttpContext.Request.Headers[nameof(Sign)].FirstOrDefault();
Timestamp = App.HttpContext.Request.Headers[nameof(Timestamp)].FirstOrDefault().Int64Try(0);
}
/// <summary>
/// AppId
/// </summary>
[Range(1, long.MaxValue)]
public long AppId { get; init; }
/// <summary>
/// AppSecret
/// </summary>
public string AppSecret { get; init; }
/// <summary>
/// 签名
/// </summary>
public string Sign { get; set; }
/// <summary>
/// 时间戳
/// </summary>
public long Timestamp { get; set; }
/// <summary>
/// 从HttpContext 创建上下文应用
/// </summary>
public static async Task<ContextApp> CreateAsync()
{
var ret = new ContextApp();
if (!ret.TryValidate().IsValid) {
return null;
}
// 具有secret的情况下自动生成时间戳+sign方便调试
if (!ret.AppSecret.NullOrEmpty()) {
ret.Timestamp = DateTime.Now.TimeUnixUtc();
ret.Sign = await ret.BuildSignFromHttpContextAsync().ConfigureAwait(false);
}
return ret;
}
/// <summary>
/// 构建签名
/// </summary>
public string BuildSign(string reqBody)
{
// 去除\r\n和空格再计算签名规避风格样式问题
reqBody = reqBody.Replace("\r", string.Empty).Replace("\n", string.Empty).Replace(" ", string.Empty);
return $"{AppId}{AppSecret.ToLowerInvariant()}{Timestamp}{reqBody}".Md5(Encoding.UTF8);
}
/// <summary>
/// 构建签名从http上下文
/// </summary>
public async Task<string> BuildSignFromHttpContextAsync()
{
var sr = new StreamReader(App.HttpContext.Request.Body);
var reqBody = await sr.ReadToEndAsync().ConfigureAwait(false);
_ = App.HttpContext.Request.Body.Seek(0, SeekOrigin.Begin);
return BuildSign(reqBody);
}
/// <inheritdoc />
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
if (!AppSecret.NullOrEmpty()) {
yield break;
}
// 没有密码, 就要签名+时间戳
if (Sign.NullOrEmpty()) {
yield return new ValidationResult(Ln., new[] { nameof(Sign) });
}
if (Math.Abs(DateTime.Now.TimeUnixUtc() - Timestamp) > _TS_OFFSET_SCOPE_SEC) {
yield return new ValidationResult(Ln., new[] { nameof(Timestamp) });
}
}
}