From 8b613a5275e6fe23b91f65cc6a7fba720ae4d7ef Mon Sep 17 00:00:00 2001 From: 移动系统liao <liaoxujun@qq.com> Date: 星期二, 18 二月 2025 11:10:35 +0800 Subject: [PATCH] 完成阿里云本地上传token生成,实现小程序本地上传 --- cylsg/EzUpFile/EzFileUploadService.cs | 247 +++++++++++++++++++++++++++++++++++++++++++++++-- 1 files changed, 235 insertions(+), 12 deletions(-) diff --git a/cylsg/EzUpFile/EzFileUploadService.cs b/cylsg/EzUpFile/EzFileUploadService.cs index e48e3c8..568e928 100644 --- a/cylsg/EzUpFile/EzFileUploadService.cs +++ b/cylsg/EzUpFile/EzFileUploadService.cs @@ -1,5 +1,7 @@ 锘� +using Aliyun.Acs.Core.Exceptions; using Aliyun.OSS; + using Aliyun.OSS.Util; using cylsg.utility; using cylsg.utility.Extend; @@ -10,14 +12,16 @@ using Microsoft.AspNetCore.Http; using SqlSugar; -using System; -using System.Buffers.Text; using System.Drawing; using System.Globalization; -using System.Security.Policy; +using System.Security.Cryptography; +using System.Text; +using Tea; using TencentCloud.Ocr.V20181119.Models; -using TencentCloud.Teo.V20220901.Models; + using Task = System.Threading.Tasks.Task; +using Newtonsoft.Json; +using static AlibabaCloud.SDK.Sts20150401.Models.AssumeRoleResponseBody; namespace EzUpFile { /// <summary> @@ -29,12 +33,12 @@ private readonly HttpRequest? _request; private readonly ISqlSugarClient _sqlSugarClient; private readonly ITencentCloudService _tcs; - public EzFileUploadService(IHttpContextAccessor httpContext, ISqlSugarClient sqlSugarClient,ITencentCloudService tencentCloudService) + public EzFileUploadService(IHttpContextAccessor httpContext, ISqlSugarClient sqlSugarClient, ITencentCloudService tencentCloudService) { _request = httpContext.HttpContext?.Request ?? null; _sqlSugarClient = sqlSugarClient; - _tcs= tencentCloudService; + _tcs = tencentCloudService; } /// <summary> @@ -178,7 +182,7 @@ throw Oops.Oh(ex.Message); } - //杩斿洖缁橴Editor鐨勬彃鍏ョ紪杈戝櫒鐨勫浘鐗囩殑src + return App.Configuration["FileUploadOptions:AliOSSSaveBaseUrl"] + filePath; } @@ -349,7 +353,7 @@ catch (Exception e) { - throw Oops.Oh(e.Message+"鑵捐浜戯紝鎴栬�呴樋閲屼簯鎿嶄綔閿欒"); + throw Oops.Oh(e.Message + "鑵捐浜戯紝鎴栬�呴樋閲屼簯鎿嶄綔閿欒"); } } catch (Exception e) @@ -426,7 +430,7 @@ } - public async Task<(bool,string)> IaiAddPerso(string CoredID,string Name,int PersonGender) + public async Task<(bool, string)> IaiAddPerso(string CoredID, string Name, int PersonGender) { try { @@ -466,12 +470,12 @@ var arr = ms.ToArray(); string img64 = Convert.ToBase64String(arr); - bool info = false; + bool info = false; string url = ""; try { - info = _tcs.IaiAddPerso(img64, CoredID, Name, PersonGender); + info = _tcs.IaiAddPerso(img64, CoredID, Name, PersonGender); url = await UploadFilesFByBase64(img64); @@ -490,7 +494,7 @@ throw Oops.Oh(e.Message); } } -/// <inheritdoc/> + /// <inheritdoc/> public async Task<(bool, string)> IaiAddPerso(string imgBase64, string CoredID, string Name, int PersonGender) { @@ -527,5 +531,224 @@ #endregion + + #region 鏈湴涓婁紶浜戞湇鍔″櫒鍑瘉璁$畻 + + + public Dictionary<string, string> GetToken1() + { + + var dir = DateTime.Now.ToString("yyyyMMdd") + "/"; + // 鏋勯�燨ssClient瀹炰緥銆� endpoint 鏍煎紡:https://oss-cn-beijing.aliyuncs.com + // var ossClient = new OssClient( App.Configuration["FileUploadOptions:AliOSSSaveBaseUrl"], App.Configuration["FileUploadOptions:AliOSSAccessKeyID"], App.Configuration["FileUploadOptions:AliOSSAccessKeySecret"]); + var rt = GetSTSToken(); + + + + + String securityToken = rt.AccessKeySecret; //鑾峰彇Token + var config = new PolicyConditions(); + + config.AddConditionItem(PolicyConditions.CondContentLengthRange, 1, 1024L * 1024 * 1024 * 5);// 鏂囦欢澶у皬鑼冨洿锛氬崟浣峛yte + config.AddConditionItem(MatchMode.StartWith, PolicyConditions.CondKey, dir); + //鎹呭悕 + config.AddConditionItem("bucket", App.Configuration["FileUploadOptions:AliOSSBucketName"]); + config.AddConditionItem("x-oss-signature-version", "OSS4-HMAC-SHA256"); + config.AddConditionItem("x-oss-security-token", securityToken); + // //璇锋眰鏃堕棿 + config.AddConditionItem("x-oss-date", DateTime.Now.ToString("yyyyMMdd'T'HHmmss'Z'")); + config.AddConditionItem("x-oss-credential", App.Configuration["FileUploadOptions:AliOSSAccessKeyID"] + "/" + DateTime.Now.ToString("yyyyMMdd") + "/cn-chengdu/oss/aliyun_v4_request"); + var expire = DateTimeOffset.Now.AddMinutes(30);// 杩囨湡鏃堕棿 + + // 鐢熸垚 Policy锛屽苟杩涜 Base64 缂栫爜 + // var policy = ossClient.GeneratePostPolicy(expire.LocalDateTime, config); + // var policyBase64 = Convert.ToBase64String(Encoding.UTF8.GetBytes(policy)); + + // 璁$畻绛惧悕 + var hmac = new HMACSHA1(Encoding.UTF8.GetBytes(App.Configuration["FileUploadOptions:AliOSSAccessKeySecret"])); + // var bytes = hmac.ComputeHash(Encoding.UTF8.GetBytes(policyBase64)); + // var sign = Convert.ToBase64String(bytes); + + return new Dictionary<string, string>(); + } + + + + + + + public static AlibabaCloud.SDK.Sts20150401.Client CreateClient() + { + // 宸ョ▼浠g爜娉勯湶鍙兘浼氬鑷� AccessKey 娉勯湶锛屽苟濞佽儊璐﹀彿涓嬫墍鏈夎祫婧愮殑瀹夊叏鎬с�備互涓嬩唬鐮佺ず渚嬩粎渚涘弬鑰冦�� + // 寤鸿浣跨敤鏇村畨鍏ㄧ殑 STS 鏂瑰紡锛屾洿澶氶壌鏉冭闂柟寮忚鍙傝锛歨ttps://help.aliyun.com/document_detail/378671.html銆� + AlibabaCloud.OpenApiClient.Models.Config config = new AlibabaCloud.OpenApiClient.Models.Config + { + // 蹇呭~锛岃纭繚浠g爜杩愯鐜璁剧疆浜嗙幆澧冨彉閲� ALIBABA_CLOUD_ACCESS_KEY_ID銆� + AccessKeyId = "LTAI5tKegnEbaSRPFRwDxeFd", + // 蹇呭~锛岃纭繚浠g爜杩愯鐜璁剧疆浜嗙幆澧冨彉閲� ALIBABA_CLOUD_ACCESS_KEY_SECRET銆� + AccessKeySecret = "9Hv6VYgWhpDHCMkwMLHiqF6ihusjdl", + }; + // Endpoint 璇峰弬鑰� https://api.aliyun.com/product/Sts + config.Endpoint = "sts.cn-chengdu.aliyuncs.com"; + return new AlibabaCloud.SDK.Sts20150401.Client(config); + } + + /// <summary> + /// 鑾峰彇涓存椂鍑瘉 + /// </summary> + public static AssumeRoleResponseBodyCredentials GetSTSToken() + { + AlibabaCloud.SDK.Sts20150401.Client client = CreateClient(); + AlibabaCloud.SDK.Sts20150401.Models.AssumeRoleRequest assumeRoleRequest = new AlibabaCloud.SDK.Sts20150401.Models.AssumeRoleRequest + { + Policy = "{\"Statement\": [{\"Action\": [\"*\"],\"Effect\": \"Allow\",\"Resource\": [\"*\"]}],\"Version\":\"1\"}", + DurationSeconds = 3600, + RoleArn = "acs:ram::1299465997752835:role/weixinupdatarl", + RoleSessionName = "weixinupdataRl", + }; + AlibabaCloud.TeaUtil.Models.RuntimeOptions runtime = new AlibabaCloud.TeaUtil.Models.RuntimeOptions(); + try + { + // 澶嶅埗浠g爜杩愯璇疯嚜琛屾墦鍗� API 鐨勮繑鍥炲�� + var data = client.AssumeRoleWithOptions(assumeRoleRequest, runtime); + if (data.StatusCode == 200) + { + + return data.Body?.Credentials; + } + throw Oops.Oh("闃块噷浜戣幏鍙栦复鏃跺嚟璇侀敊璇�"); + } + catch (TeaException error) + { + + AlibabaCloud.TeaUtil.Common.AssertAsString(error.Message); + throw; + } + catch (Exception _error) + { + TeaException error = new TeaException(new Dictionary<string, object> + { + { "message", _error.Message } + }); + + AlibabaCloud.TeaUtil.Common.AssertAsString(error.Message); + throw error; + } + } + /// <summary> + /// + /// </summary> + /// <returns></returns> + public Dictionary<string, string> GetToken() + { + // 鑾峰彇鐜鍙橀噺 + + string regionId = "cn-chengdu"; + string roleSessionName = "weixinupdataRl"; + + + + + + + + // 瀹氫箟STS涓存椂璁块棶鍑瘉鍙橀噺 + string stsAccessKeyId = null; + string stsSecretAccessKey = null; + string securityToken = null; + + try + { + var rt = GetSTSToken(); + + stsAccessKeyId = rt.AccessKeyId; + stsSecretAccessKey = rt.AccessKeySecret; + securityToken = rt.SecurityToken; + } + catch (ServerException e) + { + throw; + } + catch (ClientException e) + { + throw; + } + + // 鏍煎紡鍖栬姹傛棩鏈� + DateTimeOffset now = DateTimeOffset.UtcNow; + string dtObj1 = now.ToString("yyyyMMdd'T'HHmmss'Z'", CultureInfo.InvariantCulture); + string dtObj2 = now.ToString("yyyyMMdd", CultureInfo.InvariantCulture); + string expirationTime = now.AddHours(3).ToString("yyyy-MM-dd'T'HH:mm:ss.fff'Z'", CultureInfo.InvariantCulture); + + // 鍒涘缓policy + Dictionary<string, object> policy = new Dictionary<string, object> + { + { "expiration", expirationTime }, + { "conditions", new List<object> + { + new Dictionary<string, string> { { "bucket", App.Configuration["FileUploadOptions:AliOSSBucketName"] } }, // 璇峰皢<bucketname>鏇挎崲涓烘偍鐨勫疄闄匓ucket鍚嶇О + new Dictionary<string, string> { { "x-oss-signature-version", "OSS4-HMAC-SHA256" } }, + new Dictionary<string, string> { { "x-oss-credential", $"{stsAccessKeyId}/{dtObj2}/{regionId}/oss/aliyun_v4_request" } }, // 璇峰皢<cn-hangzhou>鏇挎崲涓烘偍鐨勫疄闄匓ucket鎵�澶勫湴鍩燂紝渚嬪鍖椾含鍦板煙涓猴細cn-beijing + new Dictionary<string, string> { { "x-oss-security-token", securityToken } }, + new Dictionary<string, string> { { "x-oss-date", dtObj1 } } + } + } + }; + + string jsonPolicy = JsonConvert.SerializeObject(policy); + + // 鏋勯�犲緟绛惧悕瀛楃涓诧紙StringToSign锛� + string stringToSign = Convert.ToBase64String(Encoding.UTF8.GetBytes(jsonPolicy)); + + // 璁$畻SigningKey + byte[] dateKey = HmacSha256("aliyun_v4" + stsSecretAccessKey, dtObj2); + byte[] dateRegionKey = HmacSha256(dateKey, regionId); // 璇峰皢<cn-hangzhou>鏇挎崲涓烘偍鐨勫疄闄匓ucket鎵�澶勫湴鍩燂紝渚嬪鍖椾含鍦板煙涓猴細cn-beijing + byte[] dateRegionServiceKey = HmacSha256(dateRegionKey, "oss"); + byte[] signingKey = HmacSha256(dateRegionServiceKey, "aliyun_v4_request"); + + // 璁$畻Signature + byte[] result = HmacSha256(signingKey, stringToSign); + string signature = BitConverter.ToString(result).Replace("-", "").ToLower(); + + Dictionary<string, string> messageMap = new Dictionary<string, string> + { + { "security_token", securityToken }, + { "signature", signature }, + { "x_oss_date", dtObj1 }, + { "x_oss_credential", $"{stsAccessKeyId}/{dtObj2}/{regionId}/oss/aliyun_v4_request" }, // 璇峰皢<cn-hangzhou>鏇挎崲涓烘偍鐨勫疄闄匓ucket鎵�澶勫湴鍩燂紝渚嬪鍖椾含鍦板煙涓猴細cn-beijing + { "x_oss_signature_version", "OSS4-HMAC-SHA256" }, + { "policy", stringToSign } + }; + + // 鎵撳嵃杩斿洖鑷冲鎴风鐨勭鍚嶄俊鎭� + return messageMap; + } + + + + private static byte[] HmacSha256(byte[] key, string message) + { + using (HMACSHA256 hmac = new HMACSHA256(key)) + { + return hmac.ComputeHash(Encoding.UTF8.GetBytes(message)); + } + } + + private static byte[] HmacSha256(string key, string message) + { + using (HMACSHA256 hmac = new HMACSHA256(Encoding.UTF8.GetBytes(key))) + { + return hmac.ComputeHash(Encoding.UTF8.GetBytes(message)); + } + } + + + + #endregion } + + + + } + -- Gitblit v1.9.1