Aliyun

RAM 创建用户

登录https://ram.console.aliyun.com/
用户管理 功能中,新建一个 duchaoqun 用户,记录 AccessKeyIDAccessKeySecret
点击用户进入 用户授权策略 添加一个权限 AliyunSTSAssumeRoleAccess
角色管理 里面,再创建一个 duchaoqun 的角色,记录 Arn 字符串,最后给这个角色授权 AliyunOSSFullAccess

App-Token-Server

在 app-token-server 上配置用户和角色的信息,然后APP再发起请求的时候,返回临时的权限。

{
  "AccessKeyID": "",
  "AccessKeySecret": "",
  "RoleArn": "acs:ram::",
  "TokenExpireTime": "3600",
  "PolicyFile": "policy/bucket_write_policy.txt"
}

AccessKeyID:填写用户的AccessKeyID。
AccessKeySecret:填写用户的AccessKeySecret。
RoleArn:填写角色的RoleArn。
TokenExpireTime:指Android/iOS应用取到这个Token的失效时间,注意,最少是900s,默认值可以不修改。
PolicyFile:填写的是该Token所要拥有的权限列表的文件,默认值可以不修改。

三种最常用token权限文件,放于policy目录下面。分别是:

all_policy.txt:指定了该token拥有对该账号下创建Bucket、删除Bucket、上传文件、下载文件、删除文件的权限 。
bucket_read_policy.txt:指定了该token拥有该账号下对指定Bucket的读权限。
bucket_read_write_policy.txt:指定了该token拥有该账号下对指定Bucket的读写权限。
如果您想要指定这个Token只能对指定的bucket有读写权限, 请把(bucket_read_policy.txt、 bucket_read_write_policy.txt)这些文件里面$BUCKET_NAME直接替换成指定的bucket名字。

在我们指定的服务器上启动服务:java -jar oss-token-server.jar [port]

返回的数据内容:

{
  "status":"200",
  "AccessKeyId":"",
  "AccessKeySecret":"",
  "Expiration":"2020-04-01T03:42:11Z"
}

App-Token-Server policy 权限配置

子账号拥有单个bucket(duchaoqun)的全部权限,Server端的配置如下,然后再OSS的web端配置Bucket的授权策略为 duchaoqun/* duchaoqun 读/写 允许

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

C#Demo

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Net;
using System.Web.Script.Serialization;
using System.IO;
using Aliyun.OSS;

namespace Socks
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            HttpWebRequest req = WebRequest.Create("http://fssdemo.rexen.com.cn:7080/") as HttpWebRequest;
            HttpWebResponse rep = req.GetResponse() as HttpWebResponse;
            JavaScriptSerializer js = new JavaScriptSerializer();
            var reader = new StreamReader(rep.GetResponseStream());
            var objText = reader.ReadToEnd();
            StsData json = js.Deserialize(objText, typeof(StsData)) as StsData;

            Console.WriteLine(json.Status);

            var endpoint = "oss-cn-beijing.aliyuncs.com";
            var accessKeyId = json.AccessKeyId;
            var accessKeySecret = json.AccessKeySecret;
            var securityToken = json.SecurityToken;

            var ossStsClient = new OssClient(endpoint, accessKeyId, accessKeySecret, securityToken);

            string filePath = @"D:db.sqlite";  //获取本机路径,找到文件
            StreamReader sr = new StreamReader(filePath, Encoding.Default);   //创建文件流
                                                                              // 上传文件。
            ossStsClient.PutObject("rexen", "test", sr.BaseStream);
            Console.WriteLine("Put object succeeded");
        }
    }
    public class StsData
    {
        public string Status { get; set; }
        public string AccessKeyId { get; set; }
        public string AccessKeySecret { get; set; }
        public string SecurityToken { get; set; }
        public string Expiration { get; set; }
    }
}

Server 相应问题

ErrorCode: NoPermission ErrorMessage: Roles may not be assumed by root accounts.
使用主用户的密钥调用AssumeRole,请使用子用户的密钥。

ErrorCode: MissingSecurityToken ErrorMessage: SecurityToken is mandatory for this action.
使用临时用户的密钥调用AssumeRole,请使用子用户的密钥。

Error code: InvalidAccessKeyId.NotFound Error message: Specified access key is not found.
AccessKeyId无效,请检查是否写错,特别是前后不能后空格。

Error code: InvalidAccessKeyId.Inactive Error message: Specified access key is disabled.
使用的子用户的密钥,已经被禁止,请启用密钥或更换密钥。 密钥是否被禁止,请控制台的“访问控制->用户管理->管理->用户详情->用户AccessKey”确认,并开启。

ErrorCode: InvalidParameter.PolicyGrammar ErrorMessage: The parameter Policy has not passed grammar check.
角色扮演时指定的授权策略无效。AssumeRole时可以指定授权(Policy),也可以不指定。如果指定授权策略,则临时用户的权限是指定的授权策略和角色权限的交集;如果不指定授权策略,临时用户的权限是角色的权限。报该错误时,请检查指定的授权策略Policy。不推荐临时用户扮演角色时指定授权策略。如果的确需要使用授权策略,强烈建使用 RAM Policy Editor 生成授权策略。

ErrorCode: InvalidParameter.RoleSessionName ErrorMessage: The parameter RoleSessionName is wrongly formed.
角色扮演时指定RoleSessionName无效。此参数用来区分不同的Token,以标明谁在使用此Token,便于审计; 格式:^[a-zA-Z0-9.@-_]+$,2-32个字符,了解更多请参看 扮演角色操作接口。如命名a,1,abc*abc,忍者神龟等都是非法的

ErrorCode: InvalidParameter.DurationSeconds Error message: The Min/Max value of DurationSeconds is 15min/1hr.
角色扮演时指定的过期时间无效,即AssumeRoleRequest.setDurationSeconds参数无效。角色扮演时可以指定过期时间,单位为秒,有效时间是900 ~ 3600,如assumeRoleRequest.setDurationSeconds(60L * 20); 20分钟内有效。

ErrorCode: NoPermission ErrorMessage: No permission perform sts:AssumeRole on this Role. Maybe you are not authorized to perform sts:AssumeRole or the specified role does not trust you
原因1:AssumeRole的子用户没有权限,请给子用户授予AliyunSTSAssumeRoleAccess系统授权策略。请在“访问控制->用户管理->授权->可选授权策略名称”中给子用户授权AliyunSTSAssumeRoleAccess。
原因2:申请角色扮演的子用户的云账号ID与角色的“受信云账号ID”不符,请角色创建者确认并修改。子用户的云账号ID,即创建子用户的主用户的ID;角色的云账号ID,即创建角色的主用户的云账号ID。请在如下位置确认修改 访问控制 -> 角色管理 -> 管理 -> 角色详细 -> 编辑基本信息 中确认修改。
原因3:角色的类型错误,如果角色的类型分为“用户角色”和“服务角色”,服务角色不能使用AssumeRole扮演临时用户。

参考文档

https://help.aliyun.com/document_detail/100624.html?spm=a2c4g.11186623.2.10.7fc6418bKdfMR6
https://help.aliyun.com/document_detail/32093.html?spm=a2c4g.11186623.6.1181.16d52d71KXDHZE
https://www.lastupdate.net/4681.html

About

企鹅号码:848408012
企鹅群号:465073050
私人邮箱:du.chao.qun@163.com
备注说明:欢迎联系交流,共同学习进步,转载请注明出处,谢谢。

Published by

风君子

独自遨游何稽首 揭天掀地慰生平

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注