1. 程式人生 > >aliyun oss js直傳且使用服務器端生成簽名

aliyun oss js直傳且使用服務器端生成簽名

語言 span post請求 服務器端 settings vid 控制 2-0 條件

采用JS客戶端直接簽名有一個很嚴重的安全隱患。就是OSS AccessId/AccessKey暴露在前端頁面。可以隨意拿到AccessId/AccessKey,這是非常不安全的做法。

這裏的簽名采用服務端方式生成,前端通過ajax獲取。

在阿裏雲js直傳文檔範例裏,簽名生成只有java,php,python,go四種語言的例子,沒有c#簽名示例。這裏用c#實現一個

其他語言的範例地址:https://help.aliyun.com/document_detail/31926.html?spm=5176.doc31923.6.625.Jpz3L5

示例用的Bucket名字為video,其中Bucket的三種訪問控制,這裏設置為公共讀(匿名讀,寫操作需要身份驗證)

技術分享

OSS PostObject接口介紹

https://help.aliyun.com/document_detail/31988.html?spm=5176.7742976.2.2.uRq26Q

其中Post請求的policy表單域用於驗證請求的合法性。 policy為一段經過UTF-8和base64編碼的JSON文本,聲明了Post請求必須滿足的條件

Policy表單域的示例

{ "expiration": "2014-12-01T12:00:00.000Z","conditions": [{"bucket": "johnsmith" },["starts-with", "$key", "user/eric/"]

]}

Post policy中必須包含expiration和condtions。

計算Signature的具體流程為

  1. 創建一個 UTF-8 編碼的 policy。
  2. 將 policy 進行 base64 編碼,其值即為 policy 表單域該填入的值,將該值作為將要簽名的字符串。
  3. 使用 AccessKeySecret 對要簽名的字符串進行簽名,簽名方法與Head中簽名的計算方法相同(將要簽名的字符串替換為 policy 即可)。

Web直傳服務端簽名

需要安裝aliyun.oss.sdk和Newtonsoft.Json的nuget包

技術分享

技術分享

MVC控制器代碼

 public
class AliyunController : MyControllerBase { public string accessKeyId = System.Configuration.ConfigurationManager.AppSettings["aliyun_ak_id"]; public string accessKeySecret = System.Configuration.ConfigurationManager.AppSettings["aliyun_ak_secret"]; public string bucket = System.Configuration.ConfigurationManager.AppSettings["aliyun_bucket"]; // GET: Aliyun public ContentResult GetPostObjectSignature(int courseId) { string host = "http://"+ bucket + ".oss-cn-shanghai.aliyuncs.com"; const string endpoint = "http://oss-cn-shanghai.aliyuncs.com"; var ossClient = new OssClient(endpoint, accessKeyId, accessKeySecret); var dir = "zhangsan/";//設置用戶上傳指定的前綴,必須以斜線結尾 var expiration = DateTime.Now.AddMinutes(100); var policyConds = new PolicyConditions(); policyConds.AddConditionItem(MatchMode.StartWith, PolicyConditions.CondKey, dir);//上傳目錄 policyConds.AddConditionItem(PolicyConditions.CondContentLengthRange, 1, 1048576000);//允許上傳的文件大小限制 var postPolicy = ossClient.GeneratePostPolicy(expiration, policyConds);//給policyConds添加過期時間並json序列化(格式iso8601:"yyyy-MM-dd‘T‘HH:mm:ss.fff‘Z‘") /*生成的Policy範例 {"expiration":"2017-05-17T20:23:23Z","conditions":[["content-length-range",0,1048576000],["starts-with","$key","zhangsan"]]} */ var base64Policy = Convert.ToBase64String(Encoding.UTF8.GetBytes(postPolicy)); var signature = ComputeSignature(accessKeySecret, base64Policy);//生成簽名 TimeSpan ts = expiration - new DateTime(1970, 1, 1, 0, 0, 0, 0); var expire = Convert.ToInt64(ts.TotalSeconds); Dictionary<string, object> response = new Dictionary<string, object>(); response["accessid"] = accessKeyId; response["host"] = host; response["policy"] = base64Policy; response["signature"] = signature; response["expire"] = expire; //這個參數是設置用戶上傳指定的前綴 response["dir"] = dir; return Content(JsonConvert.SerializeObject(response)); } }

aliyun oss js直傳且使用服務器端生成簽名