RAM 创建用户
登录https://ram.console.aliyun.com/
在 用户管理
功能中,新建一个 duchaoqun
用户,记录 AccessKeyID
和 AccessKeySecret
。
点击用户进入 用户授权策略
添加一个权限 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
备注说明:欢迎联系交流,共同学习进步,转载请注明出处,谢谢。