前端直传oss需要在oss配置域名权限吗

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了前端直传oss需要在oss配置域名权限吗相关的知识,希望对你有一定的参考价值。

参考技术A 对于前端直传OSS,是需要在OSS上配置域名权限的。OSS是一种面向开放云存储服务,它可以存储用户的文件,并提供访问和下载的权限。 因此,如果要使用OSS的前端直传功能,就需要在OSS上配置域名权限。

配置域名权限的步骤如下:
1.登录OSS控制台,选择需要配置的存储空间,点击进入该存储空间的基本信息界面。
2.点击“域名访问”,选择“自定义域名”,输入需要配置的域名,并点击“确认”按钮。
3.然后可以在“域名访问”页面中看到已配置的域名,并可以看到它的访问权限,这些权限可以自定义设置。
4.最后,可以点击“确定”按钮,完成域名的配置。

通过以上步骤,可以在OSS上配置域名权限,以实现前端直传OSS的功能。
参考技术B 是的,在使用OSS前端直传时,需要对OSS进行域名权限配置,以便确保资源的安全性。具体而言,OSS支持通过域名限制客户端的访问,具体权限类型包括:“允许”、“拒绝”和“允许指定IP段”。在设置域名权限时,可以精确到用户、操作和对象等多个维度。此外,OSS还支持在指定的IP段(比如某个区域)中执行某些操作,以及在指定IP段(比如某个区域)中禁止执行某些操作。例如,可以限制只有来自指定IP段的访问才能访问OSS,或者只能在指定IP段(比如某个区域)中执行某些操作,以及在指定IP段(比如某个区域)中禁止执行某些操作。通过设置域名权限,可以确保OSS的安全性,同时也可以减少不必要的资源浪费。 参考技术C 前端直传OSS是指将文件直接从客户端(即用户的浏览器)上传到阿里云对象存储(OSS),而不需要通过后端服务器进行中转。在使用前端直传OSS时,通常需要在阿里云OSS的Bucket设置中配置CORS规则以允许跨域请求和上传操作。同时,在Bucket的权限管理中,需要为使用前端直传OSS的用户设置相应的访问权限,以确保只有授权的用户才能进行上传操作。在配置域名权限方面,如果前端直传OSS要跨域上传,需要在OSS控制台中配置跨域资源共享(CORS)规则,并将相关域名加入到规则中,否则会出现跨域上传失败的问题。但是,如果前端直传OSS仅限于在同一个域名下上传,则无需配置域名权限 参考技术D 是的,如果要通过OSS前端直传,肯定要配置域名权限,目的是为了使得前端能够正常的把文件上传到指定的OSS的Bucket中,否则连接OSS的请求会被拒绝。

aliyun oss js直传且使用服务器端生成签名

web直传的好处:用户通过浏览器直接上传到阿里云OSS,对web服务器没有压力!

这里的服务端代码仅仅用来计算签名,不处理上传!如果.net服务端直传(支持分片和断点续传),参考OSS .NET SDK(https://help.aliyun.com/document_detail/32090.html)

WEB端表单上传,需要签名域Signature,通过js计算签名,AccessKeyID和AcessKeySecret会暴露在前端页面,严重安全隐患,因此用服务端计算签名再返回给浏览器,浏览器通过表单(multipart/form-data 编码)的方式就可以直接上传文件到OSS了,

 

阿里官网文档https://help.aliyun.com/document_detail/31926.html (Java,Python,PHP,Go,Ruby签名示例)没有提供C#版本的签名计算代码,这里提供一个供参考

PostObject API参考: https://help.aliyun.com/document_detail/31988.html

什么是Post Policy?

Post请求的policy表单域用于验证请求的合法性。 policy为一段经过UTF-8和base64编码的JSON文本,声明了Post请求必须满足的条件。

Policy表单域的示例 (JSON格式)

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

注意:Post policy中必须包含expiration和condtions。

什么是Post Signature

Post请求的Signature表单域是根据Policy计算的

计算Signature的具体流程为

  1. 创建一个 UTF-8 编码的 policy。
  2. 将 policy 进行 base64 编码,其值即为 policy 表单域该填入的值,将该值作为将要签名的字符串。
  3. 使用 AccessKeySecret 对要签名的字符串进行签名。

 

 C#签名代码(MVC)

前提:需要安装aliyun.oss.sdk和Newtonsoft.Json的nuget包

 public class AliyunController : MyControllerBase
    {
        public string accessKeyId = System.Configuration.ConfigurationManager.AppSettings["aliyun_ak_id"];//请填写您的AccessKeyId。
        public string accessKeySecret = System.Configuration.ConfigurationManager.AppSettings["aliyun_ak_secret"];//请填写您的AccessKeySecret
        public string bucket = System.Configuration.ConfigurationManager.AppSettings["aliyun_bucket"];//请填写您的bucket name
        // GET: Aliyun
        public ContentResult GetPostObjectSignature(int courseId)
        {
            string host = "http://"+ bucket + ".oss-cn-shanghai.aliyuncs.com";//请填写您的bucket endpoint。

            const string endpoint = "http://oss-cn-shanghai.aliyuncs.com";//请填写您的endpoint

            //第一步,构造policy
            var dir = "zhangsan/";//设置当前用户上传指定的前缀,必须以斜线结尾,类似目录(OSS不存在多级目录,但是可以模拟)
            var expiration = DateTime.Now.AddMinutes(100);
            var policyConds = new PolicyConditions();
            policyConds.AddConditionItem(MatchMode.StartWith, PolicyConditions.CondKey, dir);//上传目录
            policyConds.AddConditionItem(PolicyConditions.CondContentLengthRange, 1, 1048576000);//允许上传的文件大小限制       
        var ossClient = new OssClient(endpoint, accessKeyId, accessKeySecret);//调用阿里云SDK的API
        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"]]}
                */
            //第二步 将policy 的json字符串进行base64编码

            var base64Policy = Convert.ToBase64String(Encoding.UTF8.GetBytes(postPolicy));

            //第三步,生成签名(哈希算法)
            var signature = ComputeSignature(accessKeySecret, base64Policy);//生成签名
            
             //以下返回给前端表单域或者阿里云OSS的js api
            TimeSpan ts = expiration - new DateTime(1970, 1, 1, 0, 0, 0, 0);
            var expire = Convert.ToInt64(ts.TotalSeconds);

            Dictionary<string, object> response_dic = new Dictionary<string, object>();
            response_dic["accessid"] = accessKeyId;
            response_dic["host"] = host;
            response_dic["policy"] = base64Policy;
            response_dic["signature"] = signature;
            response_dic["expire"] = expire;
            //这个参数是设置用户上传指定的前缀
            response_dic["dir"] = dir;
            return Content(JsonConvert.SerializeObject(response_dic));
        }
      private string ComputeSignature(string key, string data)
        {
            using (var algorithm = KeyedHashAlgorithm.Create("HmacSHA1".ToUpperInvariant()))
            {
                algorithm.Key = Encoding.UTF8.GetBytes(key.ToCharArray());
                return Convert.ToBase64String(
                    algorithm.ComputeHash(Encoding.UTF8.GetBytes(data.ToCharArray())));
            }
        }

}

 

以上是关于前端直传oss需要在oss配置域名权限吗的主要内容,如果未能解决你的问题,请参考以下文章

前端直传oss

前端图片直传OSS试验

vue前端oss直传(formdata方式)

阿里云 OSS 网页端直传

aliyun oss js直传且使用服务器端生成签名

Web直传阿里云OSS服务端临签名总结 2021-01-28