零 阿里云:为Bucket设置跨域

将allowed origins(来源)设置成 *
将allowed methods(允许methods)设置成 PUT, GET, POST, DELETE, HEAD
将allowed headers(允许headers)设置成 *
将expose headers(暴露headers)设置成 ETag   (这里需要换行)  x-oss-request-id

一 阿里云:创建一个RAM用户专门用来上传图像

假如此用户为 my_ram_user

二 阿里云:为用户 my_ram_user 创建访问密钥 AccessKey

三 阿里云:为用户 my_ram_user 添加权限 AliyunSTSAssumeRoleAccess

上面三步达到了一个目的: 创建一个专用的用户,此用户有可以进行 STS 分配的权力

四 阿里云:创建一个角色

假如此角色为 my_role

记住此角色的 arn ,在代码里要用

五 阿里云:创建一个 权限策略

假如此权限策略为 my_policy

内容为:

将 [BUCKET] 替换为 实际的 bucket

{
    "Version": "1",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "oss:*",
            "Resource": [
                "acs:oss:*:*:[BUCKET]",
                "acs:oss:*:*:[BUCKET]/*"
            ]
        }
    ]
}

六 阿里云:为 my_role 添加权限 my_policy

七 IDE:添加引用

aliyun-net-sdk-Core.dll
aliyun-net-sdk-Sts.dll
Aliyun.OSS.dll

八 写生成STS的代码

//example:REGIONID = oss-cn-hangzhou
//STS_ENDPOINT = sts.cn-hangzhou.aliyuncs.com
DefaultProfile.AddEndpoint(REGIONID, REGIONID, "Sts", STS_ENDPOINT);
IClientProfile   profile = DefaultProfile.GetProfile(REGIONID, ACCESSKEYID, ACCESSKEYSECRET);
DefaultAcsClient client  = new DefaultAcsClient(profile);
// 构造AssumeRole请求
AssumeRoleRequest request = new AssumeRoleRequest();
request.AcceptFormat = FormatType.JSON;
// 指定角色Arn
request.RoleArn         = ROLEARN;
request.RoleSessionName = "PhotoUploaderRole_" + Juyi.Algorithm.Randomicity.Nanoid.Generate();
// 可以设置Token有效期,可选参数,默认3600秒;
request.DurationSeconds = DurationSeconds;

// request.DurationSeconds = 3600;
// 可以设置Token的附加Policy,可以在获取Token时,通过额外设置一个Policy进一步减小Token的权限;
// request.Policy="<policy-content>"
try {
AssumeRoleResponse response = client.GetAcsResponse(request);

var data = new OssSStData();
data.access_key_id     = response.Credentials.AccessKeyId;
data.access_key_secret = response.Credentials.AccessKeySecret;
data.security_token    = response.Credentials.SecurityToken;
data.expiration        = DateTime.Parse(response.Credentials.Expiration).ToLocalTime().ToUnixTimestampSeconds();
data.bucket            = BUCKET;
data.region            = REGIONID;

////Token过期时间;服务器返回UTC时间,这里转换成北京时间显示;
//Console.WriteLine("Expiration: " + DateTime.Parse(response.Credentials.Expiration).ToLocalTime());
return data;
}
catch (Exception ex) {
throw;
Log.Error("OssRule.GetAvatarUploadSST", ex);
return null;
}

九 Vue:安装包 npm install ali-oss

十 vue:主要上传代码

 const client = new OSS({
     region         : sts.region, // 请设置成你的路径地址
     accessKeyId    : sts.access_key_id, // 请设置成你的
     accessKeySecret: sts.access_key_secret, // 请设置成你的
     bucket         : sts.bucket, // 请设置成你的
     stsToken       : sts.security_token,
     secure         : true, // 上传链接返回支持https
 });
 
//imageArrayBuffer 是图像数据
 
await client.put('111.png', new OSS.Buffer(imageArrayBuffer)); 
 

标签: oss, sts, aliyun