Aliyun - RAM & STS
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#concept-xzh-nzk-2gb
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
- 备注说明:欢迎联系交流,共同学习进步,转载请注明出处,谢谢。
本文来自博客园,作者:duchaoqun,转载请注明原文链接:https://www.cnblogs.com/duchaoqun/p/12611408.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?