mirror of
https://github.com/nsnail/NetAdmin.git
synced 2025-04-22 22:22:51 +08:00
refactor: ♻️ 清理无用代码 (#101)
This commit is contained in:
parent
3847d6fdbb
commit
a5b47c8d6b
@ -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) });
|
||||
}
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user