阿里云 OSS C# SDK RAM如何获取临时访问密钥
在进行阿里云OSS的C#开发时,直接在代码中硬编码永久访问密钥(AccessKeyId/AccessKeySecret)是不可取的,这样容易引发安全问题。最佳做法是通过阿里云的RAM(资源访问管理)结合STS(安全令牌服务)获取临时访问密钥。临时密钥有有效期限制,可以精确控制权限范围,从而大大降低密钥泄露的风险。
本文将从「阿里云控制台RAM/STS配置」「C#项目环境准备」「完整代码实现」「常见问题排查」四个维度,手把手教您如何获取和使用临时访问密钥。即使是新手,也能快速上手。
一、前置说明
核心逻辑: 通过已授权的RAM用户调用STS的AssumeRole接口,扮演指定的RAM角色,从而获取临时访问密钥(包括AccessKeyId、AccessKeySecret、SecurityToken)。获取的临时密钥可以用来操作OSS资源。
准备工作:
- 阿里云账号:用于在控制台进行配置。
- Visual Studio:本文以VS2022和.NET 6为例,其他版本可参考。
- 已创建OSS Bucket:确保您已经创建了OSS Bucket,并确认Bucket的地域(如杭州:oss-cn-hangzhou)。
二、阿里云控制台RAM/STS配置(关键步骤)
这些配置是在阿里云控制台中完成的,不需要编写代码,但每一步都至关重要,尤其是后续代码需要的关键参数(如RAM角色ARN、RAM用户AccessKey)。
2.1 配置1:创建有权调用STS服务的RAM用户
该RAM用户将发起AssumeRole请求,因此需要为其授予调用STS接口的权限,无需授予OSS权限。
1. 登录阿里云控制台,搜索并进入「RAM 访问控制」页面。

2. 在左侧导航栏选择「身份管理」→「用户」,点击「创建用户」。


3. 创建后,保存生成的「AccessKeyId」和「AccessKeySecret」。

4. 为该用户授权:选择用户,点击「新增授权」,搜索并勾选「AliyunSTSAssumeRoleAccess」,点击「确定」。



2.2 配置2:创建用于生成临时密钥的RAM角色
该RAM角色是临时密钥的权限载体。为角色配置OSS操作权限,以允许其执行操作。
- 在RAM控制台左侧导航栏选择「身份管理」→「角色」,点击「创建角色」。

- 信任主体类型为「云账号」,信任主体名称「当前阿里云账号」 ,点击「确认」。

- 输入角色名称和标签

- 创建成功后,复制并保存「ARN」,例如:
acs:ram::1234567890123456:role/oss-temp-role。

2.3 配置3:为RAM角色自定义权限策略
- 在RAM控制台左侧导航栏选择「权限管理」→「权限策略」,点击「创建权限策略」。

- 进入页面 点击 点击[脚本编辑],输入下面代码,点击 [确认] 输入策略名称和备注点击确认。
{
"Version": "1",
"Statement": [
{
"Action": [
"oss:ListObjects",
"oss:GetObject"
],
"Effect": "Allow",
"Resource": [
"acs:oss:*:*:your-bucket-name",
"acs:oss:*:*:your-bucket-name/*"
]
}
]
}


2.3 配置3:为RAM角色新增授权。


三、C#项目环境准备
在Visual Studio中,您需要安装以下三个NuGet包来调用STS服务并操作OSS:
- Aliyun.Acs.Core:阿里云ACS核心SDK。
- Aliyun.Acs.Sts:用于调用AssumeRole接口的STS SDK。
- Aliyun.OSS.SDK.NetCore:用于操作OSS的SDK。
您可以通过NuGet包管理器或Package Manager Console进行安装:
Install-Package Aliyun.Acs.Core
Install-Package Aliyun.Acs.Sts
Install-Package Aliyun.OSS.SDK.NetCore
四、完整C#代码实现
关键部分:
- 调用STS接口获取临时访问密钥。
- 使用临时密钥操作OSS(例如,列出Bucket中的文件)。
示例代码:
using System;
using Aliyun.Acs.Core;
using Aliyun.Acs.Core.Profile;
using Aliyun.Acs.Sts.Model.V20150401;
using Aliyun.OSS;
namespace AliyunOssTempKeyDemo
{
class Program
{
static void Main(string[] args)
{
try
{
// 1. 配置核心参数
string ramUserAccessKeyId = "你的RAM用户AccessKeyId";
string ramUserAccessKeySecret = "你的RAM用户AccessKeySecret";
string roleArn = "acs:ram::1234567890123456:role/oss-temp-role";
string roleSessionName = "OSS-Temp-Session-" + Guid.NewGuid().ToString("N").Substring(0, 8);
int durationSeconds = 3600;
string ossEndpoint = "oss-cn-hangzhou.aliyuncs.com";
string ossBucketName = "你的Bucket名称";
// 2. 调用STS接口,获取临时访问密钥
IClientProfile profile = DefaultProfile.GetProfile("cn-hangzhou", ramUserAccessKeyId, ramUserAccessKeySecret);
DefaultAcsClient acsClient = new DefaultAcsClient(profile);
AssumeRoleRequest request = new AssumeRoleRequest
{
RoleArn = roleArn,
RoleSessionName = roleSessionName,
DurationSeconds = durationSeconds
};
AssumeRoleResponse response = acsClient.GetAcsResponse(request);
var tempCredentials = response.Credentials;
Console.WriteLine("临时访问密钥获取成功!");
Console.WriteLine($"临时AccessKeyId: {tempCredentials.AccessKeyId}");
Console.WriteLine($"临时AccessKeySecret: {tempCredentials.AccessKeySecret}");
Console.WriteLine($"SecurityToken: {tempCredentials.SecurityToken}");
Console.WriteLine($"过期时间: {tempCredentials.Expiration}");
// 3. 使用临时密钥操作OSS
OssClient ossClient = new OssClient(
ossEndpoint,
tempCredentials.AccessKeyId,
tempCredentials.AccessKeySecret,
tempCredentials.SecurityToken);
var objectList = ossClient.ListObjects(ossBucketName);
Console.WriteLine($"\nBucket [{ossBucketName}] 中的文件列表:");
foreach (var obj in objectList.ObjectSummaries)
{
Console.WriteLine($"- 文件名:{obj.Key},大小:{obj.Size} 字节,最后修改时间:{obj.LastModified}");
}
Console.WriteLine("\n操作完成,按任意键退出...");
Console.ReadKey();
}
catch (Exception ex)
{
Console.WriteLine($"操作失败:{ex.Message}");
Console.ReadKey();
}
}
}
}
五、常见问题排查
- InvalidAccessKeyId.NotFound:检查RAM用户的AccessKeyId是否正确,确保用户未被删除。
- AccessDenied(sts:AssumeRole权限不足):确认RAM用户已添加
AliyunSTSAssumeRoleAccess权限。 - AccessDenied(OSS权限不足):确保RAM角色已授予适当的OSS操作权限。
- InvalidSecurityToken:临时密钥已过期或OSS客户端未传入SecurityToken。
六、总结与最佳实践
- 核心流程:控制台配置(RAM用户→角色→权限)→ C#代码调用STS接口获取临时密钥 → 使用
👋 关注我!持续分享 C# 实战技巧、代码示例 & 技术干货
- 获取示例代码,轻松上手!
- 私信输入数字: 63gj17
- 获取代码下载链接
![image]()


浙公网安备 33010602011771号