mirror of
				https://github.com/nsnail/NetAdmin.git
				synced 2025-10-31 19:35:26 +08:00 
			
		
		
		
	refactor: ♻️ 清理无用代码 (#101)
This commit is contained in:
		| @@ -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) }); |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| } |  | ||||||
		Reference in New Issue
	
	Block a user
	 GitHub
						GitHub