OSS C# SDK V2
快速接入
接入OSS C# SDK V2的流程如下:
环境准备
适用于
.NET Framework 471
及以上版本。适用于
.NET Standard 2.0
及以上版本。适用于
.NET5.0
及以上版本。如果当前计算环境中不存在所需 .NET 环境或版本过低,请参考以下步骤:
对于.NET Framework:请访问Microsoft 官网下载并安装.NET Framework 4.7.1 或更高版本。
对于.NET Standard:通常 .NET Standard 是由其他.NET实现(如 .NET Framework 或 .NET)支持的,确保您已安装相应的.NET实现即可。
对于.NET:请访问.NET 官网下载并安装.NET 5.0或更高版本。
安装SDK
推荐您使用最新的OSS C# SDK V2版本,确保本文中的代码示例可以正常运行。关于版本功能的更多信息,请参见Releases。
通过 NuGet 安装
检查NuGet是否已安装:
确保你的Visual Studio已经安装了NuGet包管理器。如果未安装,可以通过Visual Studio的“工具”->“获取工具和功能”进入Visual Studio Installer,在工作负载中勾选“.NET桌面开发”或者“ASP.NET和Web开发”,这将自动包含NuGet包管理器。
打开项目:
在Visual Studio中新建一个项目或打开已有项目。
访问NuGet程序包管理器:
在菜单栏选择“工具”->“NuGet程序包管理器”->“管理解决方案的NuGet程序包”。
搜索并安装SDK:
在NuGet包管理器的“浏览”选项卡中,输入
AlibabaCloud.SDK.OSS.V2
进行搜索。在搜索结果中找到
AlibabaCloud.SDK.OSS.V2
,查看其详细信息,并确保选择最新稳定版本。点击“安装”按钮来安装该包。等待安装完成。
确认安装成功:
安装完成后,可以在解决方案资源管理器中的“引用”下看到
AlibabaCloud.SDK.OSS.V2
。此时,你就可以在项目中使用这个SDK提供的功能了。
项目引入方式安装
克隆GitHub仓库:
打开命令提示符或Git Bash,执行以下命令来克隆仓库:
git clone https://github.com/aliyun/alibabacloud-oss-csharp-sdk-v2.git
添加项目到解决方案:
在Visual Studio中右键点击解决方案(Solution),“添加”->“现有项目...”。
浏览到克隆下来的源码目录,选择
AlibabaCloud.OSS.V2.csproj
文件,然后点击“打开”。
添加项目引用:
右键点击你的项目,选择“添加”->“引用...”。
在弹出的对话框中切换到“项目”选项卡,找到并勾选
AlibabaCloud.OSS.V2
项目,点击“确定”。
配置访问凭证
使用 RAM 用户的 AccessKey 配置访问凭证。
在 RAM 控制台,创建使用永久 AccessKey 访问的 RAM 用户,保存 AccessKey,然后为该用户授予
AliyunOSSFullAccess
权限。使用 RAM 用户 AccessKey 配置环境变量。
Linux
在命令行界面执行以下命令来将环境变量设置追加到
~/.bashrc
文件中。echo "export OSS_ACCESS_KEY_ID='YOUR_ACCESS_KEY_ID'" >> ~/.bashrc echo "export OSS_ACCESS_KEY_SECRET='YOUR_ACCESS_KEY_SECRET'" >> ~/.bashrc
执行以下命令使变更生效。
source ~/.bashrc
执行以下命令检查环境变量是否生效。
echo $OSS_ACCESS_KEY_ID echo $OSS_ACCESS_KEY_SECRET
macOS
在终端中执行以下命令,查看默认Shell类型。
echo $SHELL
根据默认Shell类型进行操作。
Zsh
执行以下命令来将环境变量设置追加到
~/.zshrc
文件中。echo "export OSS_ACCESS_KEY_ID='YOUR_ACCESS_KEY_ID'" >> ~/.zshrc echo "export OSS_ACCESS_KEY_SECRET='YOUR_ACCESS_KEY_SECRET'" >> ~/.zshrc
执行以下命令使变更生效。
source ~/.zshrc
执行以下命令检查环境变量是否生效。
echo $OSS_ACCESS_KEY_ID echo $OSS_ACCESS_KEY_SECRET
Bash
执行以下命令来将环境变量设置追加到
~/.bash_profile
文件中。echo "export OSS_ACCESS_KEY_ID='YOUR_ACCESS_KEY_ID'" >> ~/.bash_profile echo "export OSS_ACCESS_KEY_SECRET='YOUR_ACCESS_KEY_SECRET'" >> ~/.bash_profile
执行以下命令使变更生效。
source ~/.bash_profile
执行以下命令检查环境变量是否生效。
echo $OSS_ACCESS_KEY_ID echo $OSS_ACCESS_KEY_SECRET
Windows
CMD
在CMD中运行以下命令。
setx OSS_ACCESS_KEY_ID "YOUR_ACCESS_KEY_ID" setx OSS_ACCESS_KEY_SECRET "YOUR_ACCESS_KEY_SECRET"
运行以下命令,检查环境变量是否生效。
echo %OSS_ACCESS_KEY_ID% echo %OSS_ACCESS_KEY_SECRET%
PowerShell
在PowerShell中运行以下命令。
[Environment]::SetEnvironmentVariable("OSS_ACCESS_KEY_ID", "YOUR_ACCESS_KEY_ID", [EnvironmentVariableTarget]::User) [Environment]::SetEnvironmentVariable("OSS_ACCESS_KEY_SECRET", "YOUR_ACCESS_KEY_SECRET", [EnvironmentVariableTarget]::User)
运行以下命令,检查环境变量是否生效。
[Environment]::GetEnvironmentVariable("OSS_ACCESS_KEY_ID", [EnvironmentVariableTarget]::User) [Environment]::GetEnvironmentVariable("OSS_ACCESS_KEY_SECRET", [EnvironmentVariableTarget]::User)
初始化客户端
使用地域和访问域名初始化 OSSClient,并运行测试代码。
using System.Text; // 引入System.Text命名空间,用于处理字符编码(如UTF-8编码字符串)
using OSS = AlibabaCloud.OSS.V2; // 为阿里云OSS SDK创建别名,简化后续使用
var region = "cn-hangzhou"; // 必须项,设置Bucket所在的区域(Region)。以华东1(杭州)为例,Region填写为cn-hangzhou
var bucket = "your bucket name"; // 必须项,设置目标Bucket名称
var endpoint = null as string; // 可选项,指定访问OSS服务的域名。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com
var key = "your object key"; // 必须项,指定上传的对象名称。格式(folder/objectName)
// 加载OSS SDK的默认配置,此配置会自动从环境变量中读取凭证信息(如AccessKey)
var cfg = OSS.Configuration.LoadDefault();
// 显式设置使用环境变量获取凭证,用于身份验证(格式:OSS_ACCESS_KEY_ID、OSS_ACCESS_KEY_SECRET)
cfg.CredentialsProvider = new OSS.Credentials.EnvironmentVariableCredentialsProvider();
// 设置配置的Bucket区域
cfg.Region = region;
// 若已指定了endpoint,则覆盖默认的endpoint
if(endpoint != null)
{
cfg.Endpoint = endpoint;
}
// 使用配置信息创建OSS客户端实例
using var client = new OSS.Client(cfg);
// 待上传的对象内容。示例内容:简单字符串"hello oss!",实际场景中可为文件流、字节数组等
var content = "hello oss!";
// 将字符串转换为UTF-8编码的字节数组,再包装为MemoryStream
// MemoryStream用于在内存中处理数据流,适合小文件上传;大文件建议使用FileStream
var bodyStream = new MemoryStream(Encoding.UTF8.GetBytes(content));
// 调用PutObjectAsync方法异步上传对象(需传入包含Bucket、Key和Body的请求对象)
// 该方法会将bodyStream中的数据上传至指定Bucket的Key路径下
var result = await client.PutObjectAsync(new OSS.Models.PutObjectRequest()
{
Bucket = bucket, // 目标Bucket名称
Key = key, // 对象在Bucket中的唯一Key
Body = bodyStream // 要上传的内容流(此处为内存中的字符串数据)
});
// 打印上传结果
Console.WriteLine("PutObject done"); // 提示操作完成
Console.WriteLine($"StatusCode: {result.StatusCode}"); // HTTP状态码
Console.WriteLine($"RequestId: {result.RequestId}"); // RequestId,用于阿里云排查问题
Console.WriteLine("Response Headers:"); // 响应头信息
result.Headers.ToList().ForEach(x => Console.WriteLine(x.Key + " : " + x.Value)); // 遍历并打印所有响应头
运行后将会输出上传文件成功的结果:
PutObject done
StatusCode: 200
RequestId: 68808D6D6A91E53037F7AAE9
Response Headers:
Server : AliyunOSS
Date : Wed, 23 Jul 2025 07:21:17 GMT
Connection : keep-alive
x-oss-request-id : 68808D6D6A91E53037F7AAE9
Vary : Origin
ETag : "968205D07B5A124D6ADA9336826C2C90"
x-oss-hash-crc64ecma : 11833582957755287462
x-oss-version-id : CAEQpgEYgYCA3fPQ2MEZIiA2ZmI4NGZkZWQzMWY0ZDZkOTFmMjUxYzRkNGMxODdkZg--
x-oss-server-time : 90
Content-Length : 0
Content-MD5 : loIF0HtaEk1q2pM2gmwskA==
客户端配置
使用自定义域名
使用OSS默认域名访问时,可能会出现文件禁止访问、文件无法预览等问题;通过绑定自定义域名至Bucket默认域名,不仅支持浏览器直接预览文件,还可结合CDN加速分发。
using OSS = AlibabaCloud.OSS.V2; // 为阿里云OSS SDK创建别名,简化后续使用
var region = "cn-hangzhou"; // 必须项,设置Bucket所在的区域(Region)。以华东1(杭州)为例,Region填写为cn-hangzhou
var endpoint = "https://www.example-***.com"; // 必须项,请填写您的自定义域名。例如www.example-***.com
// 加载OSS SDK的默认配置,此配置会自动从环境变量中读取凭证信息(如AccessKey)
var cfg = OSS.Configuration.LoadDefault();
// 显式设置使用环境变量获取凭证,用于身份验证(格式:OSS_ACCESS_KEY_ID、OSS_ACCESS_KEY_SECRET)
cfg.CredentialsProvider = new OSS.Credentials.EnvironmentVariableCredentialsProvider();
// 设置配置的Bucket区域
cfg.Region = region;
// 若已指定了endpoint,则覆盖默认的endpoint
if (endpoint != null)
{
cfg.Endpoint = endpoint;
}
// 请注意,设置true开启CNAME选项,否则无法使用自定义域名
cfg.UseCName = true;
// 使用配置信息创建OSS客户端实例
using var client = new OSS.Client(cfg);
// 使用创建好的client执行后续操作...
使用内网域名
使用内网域名访问同地域的OSS资源,可以降低流量成本并提高访问速度。
using OSS = AlibabaCloud.OSS.V2; // 为阿里云OSS SDK创建别名,简化后续使用
var region = "cn-hangzhou"; // 必须项,设置Bucket所在的区域(Region)。以华东1(杭州)为例,Region填写为cn-hangzhou
var endpoint = "https://oss-cn-hangzhou-internal.aliyuncs.com"; // 可选项,指定访问OSS服务的内网域名。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou-internal.aliyuncs.com
// 加载OSS SDK的默认配置,此配置会自动从环境变量中读取凭证信息(如AccessKey)
var cfg = OSS.Configuration.LoadDefault();
// 显式设置使用环境变量获取凭证,用于身份验证(格式:OSS_ACCESS_KEY_ID、OSS_ACCESS_KEY_SECRET)
cfg.CredentialsProvider = new OSS.Credentials.EnvironmentVariableCredentialsProvider();
// 设置配置的Bucket区域
cfg.Region = region;
// 若已指定了endpoint,则覆盖默认的endpoint
if (endpoint != null)
{
cfg.Endpoint = endpoint;
}
// 您也可以无需指定内网endpoint,直接设置cfg.UseInternalEndpoint = true配置内网域名
// cfg.UseInternalEndpoint = true;
// 使用配置信息创建OSS客户端实例
using var client = new OSS.Client(cfg);
// 使用创建好的client执行后续操作...
使用传输加速域名
using OSS = AlibabaCloud.OSS.V2; // 为阿里云OSS SDK创建别名,简化后续使用
var region = "cn-hangzhou"; // 必须项,设置Bucket所在的区域(Region)。以华东1(杭州)为例,Region填写为cn-hangzhou
var endpoint = "https://oss-accelerate.aliyuncs.com"; // 可选项,填写Bucket所在地域对应的传输加速Endpoint。以华东1(杭州)为例,Endpoint填写为'https://oss-accelerate.aliyuncs.com'
// 加载OSS SDK的默认配置,此配置会自动从环境变量中读取凭证信息(如AccessKey)
var cfg = OSS.Configuration.LoadDefault();
// 显式设置使用环境变量获取凭证,用于身份验证(格式:OSS_ACCESS_KEY_ID、OSS_ACCESS_KEY_SECRET)
cfg.CredentialsProvider = new OSS.Credentials.EnvironmentVariableCredentialsProvider();
// 设置配置的Bucket区域
cfg.Region = region;
// 若已指定了endpoint,则覆盖默认的endpoint
if (endpoint != null)
{
cfg.Endpoint = endpoint;
}
// 您也可以无需指定传输加速endpoint,直接设置cfg.UseAccelerateEndpoint = true配置传输加速域名
// cfg.UseAccelerateEndpoint = true;
// 使用配置信息创建OSS客户端实例
using var client = new OSS.Client(cfg);
// 使用创建好的client执行后续操作...
使用专有域
using OSS = AlibabaCloud.OSS.V2; // 为阿里云OSS SDK创建别名,简化后续使用
var region = "cn-hangzhou"; // 必须项,设置Bucket所在的区域(Region)。以华东1(杭州)为例,Region填写为cn-hangzhou
var endpoint = "https://service.corp.example.com"; // 必须项,请填写您的专有域。例如:https://service.corp.example.com
// 加载OSS SDK的默认配置,此配置会自动从环境变量中读取凭证信息(如AccessKey)
var cfg = OSS.Configuration.LoadDefault();
// 显式设置使用环境变量获取凭证,用于身份验证(格式:OSS_ACCESS_KEY_ID、OSS_ACCESS_KEY_SECRET)
cfg.CredentialsProvider = new OSS.Credentials.EnvironmentVariableCredentialsProvider();
// 设置配置的Bucket区域
cfg.Region = region;
// 若已指定了endpoint,则覆盖默认的endpoint
if (endpoint != null)
{
cfg.Endpoint = endpoint;
}
// 使用配置信息创建OSS客户端实例
using var client = new OSS.Client(cfg);
// 使用创建好的client执行后续操作...
使用金融云域名
以下是使用金融云域名配置OSSClient的示例代码。
using OSS = AlibabaCloud.OSS.V2; // 为阿里云OSS SDK创建别名,简化后续使用
var region = "cn-hangzhou"; // 必须项,设置Bucket所在的区域(Region)。以华东1(杭州)为例,Region填写为cn-hangzhou
// 必须项, 填写Bucket所在地域对应的内网Endpoint。以华东1 金融云为例,Endpoint填写为'https://oss-cn-hzjbp-a-internal.aliyuncs.com',
// 如需指定为http协议,请在指定域名时填写为'http://oss-cn-hzjbp-a-internal.aliyuncs.com'
var endpoint = "https://oss-cn-hzjbp-a-internal.aliyuncs.com";
// 加载OSS SDK的默认配置,此配置会自动从环境变量中读取凭证信息(如AccessKey)
var cfg = OSS.Configuration.LoadDefault();
// 显式设置使用环境变量获取凭证,用于身份验证(格式:OSS_ACCESS_KEY_ID、OSS_ACCESS_KEY_SECRET)
cfg.CredentialsProvider = new OSS.Credentials.EnvironmentVariableCredentialsProvider();
// 设置配置的Bucket区域
cfg.Region = region;
// 若已指定了endpoint,则覆盖默认的endpoint
if (endpoint != null)
{
cfg.Endpoint = endpoint;
}
// 使用配置信息创建OSS客户端实例
using var client = new OSS.Client(cfg);
// 使用创建好的client执行后续操作...
使用政务云域名
以下是使用政务云域名配置OSSClient的示例代码。
using OSS = AlibabaCloud.OSS.V2; // 为阿里云OSS SDK创建别名,简化后续使用
var region = "cn-north-2-gov-1"; // 必须项,设置Bucket所在的区域(Region)。以华北2 阿里政务云1为例,Region填写为cn-north-2-gov-1
// 必须项,填写Bucket所在地域对应的内网Endpoint。以华北2 阿里政务云1为例,Endpoint填写为'https://oss-cn-north-2-gov-1-internal.aliyuncs.com',
// 如需指定为http协议,请在指定域名时填写为'http://oss-cn-north-2-gov-1-internal.aliyuncs.com'
var endpoint = "https://oss-cn-north-2-gov-1-internal.aliyuncs.com";
// 加载OSS SDK的默认配置,此配置会自动从环境变量中读取凭证信息(如AccessKey)
var cfg = OSS.Configuration.LoadDefault();
// 显式设置使用环境变量获取凭证,用于身份验证(格式:OSS_ACCESS_KEY_ID、OSS_ACCESS_KEY_SECRET)
cfg.CredentialsProvider = new OSS.Credentials.EnvironmentVariableCredentialsProvider();
// 设置配置的Bucket区域
cfg.Region = region;
// 若已指定了endpoint,则覆盖默认的endpoint
if (endpoint != null)
{
cfg.Endpoint = endpoint;
}
// 使用配置信息创建OSS客户端实例
using var client = new OSS.Client(cfg);
// 使用创建好的client执行后续操作...
访问凭证配置
OSS 提供多种凭证初始化方式。请根据您的认证和授权需求选择合适的初始化方式。
使用RAM用户的AK
如果您的应用程序部署运行在安全、稳定且不易受外部攻击的环境中,需要长期访问您的OSS,且不能频繁轮转凭证时,您可以使用阿里云主账号或RAM用户的AK(Access Key ID、Access Key Secret)初始化凭证提供者。需要注意的是,该方式需要您手动维护一个AK,存在安全性风险和维护复杂度增加的风险。
阿里云账号拥有资源的全部权限,AK一旦泄露,会给系统带来巨大风险,不建议使用。推荐使用最小化授权的RAM用户的AK。
如需创建RAM用户的AK,请直接访问创建AccessKey。RAM用户的Access Key ID、Access Key Secret信息仅在创建时显示,请及时保存,如若遗忘请考虑创建新的AK进行轮换。
环境变量
使用RAM用户AccessKey配置环境变量。
Linux
在命令行界面执行以下命令来将环境变量设置追加到
~/.bashrc
文件中。echo "export OSS_ACCESS_KEY_ID='YOUR_ACCESS_KEY_ID'" >> ~/.bashrc echo "export OSS_ACCESS_KEY_SECRET='YOUR_ACCESS_KEY_SECRET'" >> ~/.bashrc
执行以下命令使变更生效。
source ~/.bashrc
执行以下命令检查环境变量是否生效。
echo $OSS_ACCESS_KEY_ID echo $OSS_ACCESS_KEY_SECRET
macOS
在终端中执行以下命令,查看默认Shell类型。
echo $SHELL
根据默认Shell类型进行操作。
Zsh
执行以下命令来将环境变量设置追加到
~/.zshrc
文件中。echo "export OSS_ACCESS_KEY_ID='YOUR_ACCESS_KEY_ID'" >> ~/.zshrc echo "export OSS_ACCESS_KEY_SECRET='YOUR_ACCESS_KEY_SECRET'" >> ~/.zshrc
执行以下命令使变更生效。
source ~/.zshrc
执行以下命令检查环境变量是否生效。
echo $OSS_ACCESS_KEY_ID echo $OSS_ACCESS_KEY_SECRET
Bash
执行以下命令来将环境变量设置追加到
~/.bash_profile
文件中。echo "export OSS_ACCESS_KEY_ID='YOUR_ACCESS_KEY_ID'" >> ~/.bash_profile echo "export OSS_ACCESS_KEY_SECRET='YOUR_ACCESS_KEY_SECRET'" >> ~/.bash_profile
执行以下命令使变更生效。
source ~/.bash_profile
执行以下命令检查环境变量是否生效。
echo $OSS_ACCESS_KEY_ID echo $OSS_ACCESS_KEY_SECRET
Windows
CMD
在CMD中运行以下命令。
setx OSS_ACCESS_KEY_ID "YOUR_ACCESS_KEY_ID" setx OSS_ACCESS_KEY_SECRET "YOUR_ACCESS_KEY_SECRET"
运行以下命令,检查环境变量是否生效。
echo %OSS_ACCESS_KEY_ID% echo %OSS_ACCESS_KEY_SECRET%
PowerShell
在PowerShell中运行以下命令。
[Environment]::SetEnvironmentVariable("OSS_ACCESS_KEY_ID", "YOUR_ACCESS_KEY_ID", [EnvironmentVariableTarget]::User) [Environment]::SetEnvironmentVariable("OSS_ACCESS_KEY_SECRET", "YOUR_ACCESS_KEY_SECRET", [EnvironmentVariableTarget]::User)
运行以下命令,检查环境变量是否生效。
[Environment]::GetEnvironmentVariable("OSS_ACCESS_KEY_ID", [EnvironmentVariableTarget]::User) [Environment]::GetEnvironmentVariable("OSS_ACCESS_KEY_SECRET", [EnvironmentVariableTarget]::User)
参考上述方式修改系统环境变量后,请重启或刷新您的编译运行环境,包括IDE、命令行界面、其他桌面应用程序及后台服务,以确保最新的系统环境变量成功加载。
使用环境变量来传递凭证信息。
using OSS = AlibabaCloud.OSS.V2; // 为阿里云OSS SDK创建别名,简化后续使用 var region = "cn-hangzhou"; // 必须项,设置Bucket所在的区域(Region)。以华东1(杭州)为例,Region填写为cn-hangzhou var endpoint = null as string; // 可选项,指定访问OSS服务的域名。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com // 加载OSS SDK的默认配置,此配置会自动从环境变量中读取凭证信息(如AccessKey) var cfg = OSS.Configuration.LoadDefault(); // 显式设置使用环境变量获取凭证,用于身份验证(格式:OSS_ACCESS_KEY_ID、OSS_ACCESS_KEY_SECRET) cfg.CredentialsProvider = new OSS.Credentials.EnvironmentVariableCredentialsProvider(); // 设置配置的Bucket区域 cfg.Region = region; // 若已指定了endpoint,则覆盖默认的endpoint if(endpoint != null) { cfg.Endpoint = endpoint; } // 使用配置信息创建OSS客户端实例 using var client = new OSS.Client(cfg);
静态凭证
以下示例代码展示了如何对访问凭据直接进行硬编码,显式设置要使用的访问密钥。
请勿将访问凭据嵌入到生产环境的应用程序中,此方法仅用于测试目的。
using OSS = AlibabaCloud.OSS.V2; // 为阿里云OSS SDK创建别名,简化后续使用
var region = "cn-hangzhou"; // 必须项,设置Bucket所在的区域(Region)。以华东1(杭州)为例,Region填写为cn-hangzhou
var endpoint = null as string; // 可选项,指定访问OSS服务的域名。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com
var cfg = OSS.Configuration.LoadDefault();
// 填写RAM账号AccessKey ID和AccessKey Secret。
var access_key_id = "yourAccessKeyId";
var access_key_secret = "yourAccessKeySecret";
// 创建静态凭证提供者,显式设置RAM账号密钥AccessKey ID和AccessKey Secret
cfg.CredentialsProvider = new OSS.Credentials.StaticCredentialsProvider(access_key_id,access_key_secret);
// 设置配置的Bucket区域
cfg.Region = region;
// 若已指定了endpoint,则覆盖默认的endpoint
if(endpoint != null)
{
cfg.Endpoint = endpoint;
}
// 使用配置信息创建OSS客户端实例
using var client = new OSS.Client(cfg);
使用STS临时访问凭证
如果您的应用程序需要临时访问OSS,您可以使用通过STS服务获取的临时身份凭证(Access Key ID、Access Key Secret和Security Token)初始化凭证提供者。需要注意的是,该方式需要您手动维护一个STS Token,存在安全性风险和维护复杂度增加的风险。此外,如果您需要多次临时访问OSS,您需要手动刷新STS Token。
如果您希望通过OpenAPI的方式简单快速获取到STS临时访问凭证,请参见AssumeRole - 获取扮演角色的临时身份凭证。
如果您希望通过SDK的方式获取STS临时访问凭证,请参见使用STS临时访问凭证访问OSS。
请注意,STS Token在生成的时候需要指定过期时间,过期后自动失效不能再使用。
如果您希望获取关于STS服务的接入点列表,请参见服务接入点。
环境变量
使用临时身份凭证设置环境变量。
Mac OS X/Linux/Unix
警告请注意,此处使用的是通过STS服务获取的临时身份凭证(Access Key ID、Access Key Secret和Security Token),而非RAM用户的Access Key和Access Key Secret。
请注意区分STS服务获取的Access Key ID以STS开头,例如“STS.L4aBSCSJVMuKg5U1****”。
export OSS_ACCESS_KEY_ID=<STS_ACCESS_KEY_ID> export OSS_ACCESS_KEY_SECRET=<STS_ACCESS_KEY_SECRET> export OSS_SESSION_TOKEN=<STS_SECURITY_TOKEN>
Windows
警告请注意,此处使用的是通过STS服务获取的临时身份凭证(Access Key ID、Access Key Secret和Security Token),而非RAM用户的AK(Access Key ID、Access Key Secret)。
请注意区分STS服务获取的Access Key ID以STS开头,例如“STS.L4aBSCSJVMuKg5U1****”。
set OSS_ACCESS_KEY_ID=<STS_ACCESS_KEY_ID> set OSS_ACCESS_KEY_SECRET=<STS_ACCESS_KEY_SECRET> set OSS_SESSION_TOKEN=<STS_SECURITY_TOKEN>
通过环境变量来传递凭证信息。
using OSS = AlibabaCloud.OSS.V2; // 为阿里云OSS SDK创建别名,简化后续使用 var region = "cn-hangzhou"; // 必须项,设置Bucket所在的区域(Region)。以华东1(杭州)为例,Region填写为cn-hangzhou var endpoint = null as string; // 可选项,指定访问OSS服务的域名。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com // 加载OSS SDK的默认配置,此配置会自动从环境变量中读取凭证信息(如AccessKey) var cfg = OSS.Configuration.LoadDefault(); // 显式设置使用环境变量获取凭证,用于身份验证(格式:OSS_ACCESS_KEY_ID、OSS_ACCESS_KEY_SECRET、OSS_SESSION_TOKEN) cfg.CredentialsProvider = new OSS.Credentials.EnvironmentVariableCredentialsProvider(); // 设置配置的Bucket区域 cfg.Region = region; // 若已指定了endpoint,则覆盖默认的endpoint if(endpoint != null) { cfg.Endpoint = endpoint; } // 使用配置信息创建OSS客户端实例 using var client = new OSS.Client(cfg);
静态凭证
以下示例代码展示了如何对访问凭据直接进行硬编码,显式设置要使用的临时访问密钥。
请勿将访问凭据嵌入到生产环境的应用程序中,此方法仅用于测试目的。
using OSS = AlibabaCloud.OSS.V2; // 为阿里云OSS SDK创建别名,简化后续使用
var region = "cn-hangzhou"; // 必须项,设置Bucket所在的区域(Region)。以华东1(杭州)为例,Region填写为cn-hangzhou
var endpoint = null as string; // 可选项,指定访问OSS服务的域名。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com
var cfg = OSS.Configuration.LoadDefault();
// 填写获取的临时访问密钥AccessKey ID和AccessKey Secret,非阿里云账号AccessKey ID和AccessKey Secret。
// 请注意区分STS服务获取的Access Key ID是以STS开头,如下所示。
var access_key_id = "STS.****************";
var access_key_secret = "yourAccessKeySecret";
// 填写获取的STS安全令牌(SecurityToken)。
var securityToken = "yourSecurityToken";
// 创建静态凭证提供者,显式设置临时访问密钥AccessKey ID和AccessKey Secret,以及STS安全令牌
cfg.CredentialsProvider = new OSS.Credentials.StaticCredentialsProvide(access_key_id, access_key_secret, securityToken);
// 设置配置的Bucket区域
cfg.Region = region;
// 若已指定了endpoint,则覆盖默认的endpoint
if(endpoint != null)
{
cfg.Endpoint = endpoint;
}
// 使用配置信息创建OSS客户端实例
using var client = new OSS.Client(cfg);
使用RAMRoleARN
如果您的应用程序需要授权访问OSS,例如跨阿里云账号访问OSS,您可以使用RAMRoleARN初始化凭证提供者。该方式底层实现是STS Token。通过指定RAM角色的ARN(Alibabacloud Resource Name),Credentials工具会前往STS服务获取STS Token,并在会话到期前调用AssumeRole接口申请新的STS Token。此外,您还可以通过为policy
赋值来限制RAM角色到一个更小的权限集合。
阿里云账号拥有资源的全部权限,AK一旦泄露,会给系统带来巨大风险,不建议使用。推荐使用最小化授权的RAM用户的AK。
如需创建RAM用户的AK,请直接访问创建AccessKey。RAM用户的Access Key ID、Access Key Secret信息仅在创建时显示,请及时保存,如若遗忘请考虑创建新的AK进行轮换。
如需获取RAMRoleARN,请直接访问CreateRole - 创建角色。
添加Aliyun.Credentials依赖。
dotnet add package Aliyun.Credentials --source https://api.nuget.org/v3/index.json
配置AK和RAMRoleARN作为访问凭证。
using OSS = AlibabaCloud.OSS.V2; // 为阿里云OSS SDK创建别名,简化后续使用 var region = "cn-hangzhou"; // 必须项,设置Bucket所在的区域(Region)。以华东1(杭州)为例,Region填写为cn-hangzhou var endpoint = null as string; // 可选项,指定访问OSS服务的域名。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com // 阿里云凭证配置 - 使用RAM角色ARN方式 // 更多凭证类型示例参考:https://github.com/aliyun/credentials-csharp var credConfig = new Aliyun.Credentials.Models.Config() { // 指定凭证类型为RAM角色ARN Type = "ram_role_arn", // 从环境变量读取AccessKeyId AccessKeyId = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_ID"), // 从环境变量读取AccessKeySecret AccessKeySecret = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_SECRET"), // RAM角色ARN,格式:acs:ram::USER_Id:role/ROLE_NAME // 也可通过环境变量ALIBABA_CLOUD_ROLE_ARN设置 RoleArn = "acs:ram::***************:role/******", // 角色会话名称,用于标识当前会话 RoleSessionName = "<RoleSessionName>", // 可选参数,限制STS令牌的权限范围 Policy = "<Policy>", // 可选参数,设置STS令牌的有效期(秒) RoleSessionExpiration = 3600, }; // 创建凭证客户端实例,用于获取临时访问凭证 var credClient = new Aliyun.Credentials.Client(credConfig); // 将通用凭证转换为OSS SDK所需的凭证提供器 var credentialsProvider = new OSS.Credentials.CredentialsProvideFunc(() => { // 获取临时凭证 var credential = credClient.GetCredential(); // 构造OSS SDK所需的凭证对象 return new OSS.Credentials.Credentials( credential.AccessKeyId, // 临时AccessKey ID credential.AccessKeySecret, // 临时AccessKey Secret credential.SecurityToken); // 安全令牌(STS Token) }); // 加载OSS SDK的默认配置 // 默认从环境变量中加载凭证信息(此处已被自定义凭证覆盖) var cfg = OSS.Configuration.LoadDefault(); // 设置OSS区域 cfg.Region = region; // 设置自定义凭证提供器 cfg.CredentialsProvider = credentialsProvider; // 如果指定了自定义endpoint,则覆盖默认设置 if (endpoint != null) { cfg.Endpoint = endpoint; } // 使用配置创建OSS客户端实例 using var client = new OSS.Client(cfg); // 创建ListBuckets操作的分页器 // 用于获取当前账号下的所有OSS存储桶 var paginator = client.ListBucketsPaginator(new OSS.Models.ListBucketsRequest()); // 异步迭代存储桶分页结果 Console.WriteLine("Buckets:"); await foreach (var page in paginator.IterPageAsync()) { // 遍历每个页面中的存储桶 foreach (var bucket in page.Buckets ?? []) { // 输出存储桶信息:名称、存储类型和位置 Console.WriteLine($"Bucket:{bucket.Name}, {bucket.StorageClass}, {bucket.Location}"); } }
使用ECSRAMRole
如果您的应用程序运行在ECS实例、ECI实例、容器服务Kubernetes版的Worker节点中,建议您使用ECSRAMRole初始化凭证提供者。该方式底层实现是STS Token。ECSRAMRole允许您将一个角色关联到ECS实例、ECI实例或容器服务 Kubernetes 版的Worker节点,实现在实例内部自动刷新STS Token。该方式无需您提供一个AK或STS Token,消除了手动维护AK或STS Token的风险。如何获取ECSRAMRole,请参见CreateRole - 创建角色。
添加Aliyun.Credentials依赖。
dotnet add package Aliyun.Credentials --source https://api.nuget.org/v3/index.json
配置ECSRAMRole作为访问凭证。
using OSS = AlibabaCloud.OSS.V2; // 为阿里云OSS SDK创建别名,简化后续使用 using Aliyun.Credentials.Models; var region = "cn-hangzhou"; // 必须项,设置Bucket所在的区域(Region)。以华东1(杭州)为例,Region填写为cn-hangzhou var endpoint = null as string; // 可选项,指定访问OSS服务的域名。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com // 创建凭证配置,使用ECS RAM角色方式认证 var credConfig = new Aliyun.Credentials.Models.Config() { // 凭证类型 Type = "ecs_ram_role", // 账户RoleName,非必填,不填则自动获取,建议设置,可以减少请求up to reduce requests RoleName = "<RoleName>" }; // 创建凭证客户端,用于获取临时访问凭证 var credClient = new Aliyun.Credentials.Client(credConfig); // 将通用凭证转换为OSS SDK所需的凭证提供器 var credentialsProvider = new OSS.Credentials.CredentialsProviderFunc(() => { // 获取临时凭证 var credential = credClient.GetCredential(); // 构造OSS SDK所需的凭证对象 return new OSS.Credentials.Credentials( credential.AccessKeyId, // 临时AccessKey ID credential.AccessKeySecret, // 临时AccessKey Secret credential.SecurityToken); // 安全令牌(STS Token) }); // 加载OSS客户端的默认配置 var cfg = OSS.Configuration.LoadDefault(); // 设置OSS区域 cfg.Region = region; // 设置自定义凭证提供器 cfg.CredentialsProvider = credentialsProvider; // 如果指定了自定义endpoint,则覆盖默认设置 if (endpoint != null) { cfg.Endpoint = endpoint; } // 使用配置创建OSS客户端实例 using var client = new OSS.Client(cfg); // 用于获取当前角色账号下的所有OSS存储桶 var paginator = client.ListBucketsPaginator(new OSS.Models.ListBucketsRequest()); // 异步迭代存储桶分页结果 Console.WriteLine("Buckets:"); await foreach (var page in paginator.IterPageAsync()) { // 遍历每个页面中的存储桶 foreach (var bucket in page.Buckets ?? []) { // 输出存储桶信息:名称、存储类型和位置 Console.WriteLine($"Bucket:{bucket.Name}, {bucket.StorageClass}, {bucket.Location}"); } }
使用OIDCRoleARN
在容器服务Kubernetes版中设置了Worker节点RAM角色后,对应节点内的Pod中的应用也就可以像ECS上部署的应用一样,通过元数据服务(Meta Data Server)获取关联角色的STS Token。但如果容器集群上部署的是不可信的应用(比如部署您的客户提交的应用,代码也没有对您开放),您可能并不希望它们能通过元数据服务获取Worker节点关联实例RAM角色的STS Token。为了避免影响云上资源的安全,同时又能让这些不可信的应用安全地获取所需的STS Token,实现应用级别的权限最小化,您可以使用RRSA(RAM Roles for Service Account)功能。该方式底层实现是STS Token。阿里云容器集群会为不同的应用Pod创建和挂载相应的服务账户OIDC Token文件,并将相关配置信息注入到环境变量中,Credentials工具通过获取环境变量的配置信息,调用STS服务的AssumeRoleWithOIDC接口换取绑定角色的STS Token。该方式无需您提供一个AK或STS Token,消除了手动维护AK或STS Token的风险。详情请参见通过RRSA配置ServiceAccount的RAM权限实现Pod权限隔离。
添加Aliyun.Credentials依赖。
dotnet add package Aliyun.Credentials --source https://api.nuget.org/v3/index.json
配置OIDCRoleArn作为访问凭证。
using OSS = AlibabaCloud.OSS.V2; // 为阿里云OSS SDK创建别名,简化后续使用 using Aliyun.Credentials.Models; var region = "cn-hangzhou"; // 必须项,设置Bucket所在的区域(Region)。以华东1(杭州)为例,Region填写为cn-hangzhou var endpoint = null as string; // 可选项,指定访问OSS服务的域名。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com // 创建凭证配置,使用ECS RAM角色方式认证 var credConfig = new Aliyun.Credentials.Models.Config() { // 凭证类型 Type = "oidc_role_arn", // 格式: acs:ram::用户Id:role/角色名 // roleArn 可不设,但需要通过设置 ALIBABA_CLOUD_ROLE_ARN 来代替 RoleArn = "<RoleArn>", // 格式: acs:ram::用户Id:oidc-provider/OIDC身份提供商名称 // OIDCProviderArn 可不设,但需要通过设置 ALIBABA_CLOUD_OIDC_PROVIDER_ARN 来代替 OIDCProviderArn = "<OIDCProviderArn>", // 格式: path // OIDCTokenFilePath 可不设,但需要通过设置 ALIBABA_CLOUD_OIDC_TOKEN_FILE 来代替 OIDCTokenFilePath = "/Users/xxx/xxx", // 角色会话名称 RoleSessionName = "<RoleSessionName>", // 可选, 限制 STS Token 的权限 Policy = "<Policy>", // 可选, 限制 STS Token 的有效时间 RoleSessionExpiration = 3600, }; // 创建凭证客户端,用于获取临时访问凭证 var credClient = new Aliyun.Credentials.Client(credConfig); // 将通用凭证转换为OSS SDK所需的凭证提供器 var credentialsProvider = new OSS.Credentials.CredentialsProvideFunc(() => { // 获取临时凭证 var credential = credClient.GetCredential(); // 构造OSS SDK所需的凭证对象 return new OSS.Credentials.Credentials( credential.AccessKeyId, // 临时AccessKey ID credential.AccessKeySecret, // 临时AccessKey Secret credential.SecurityToken); // 安全令牌(STS Token) }); // 加载OSS客户端的默认配置 var cfg = OSS.Configuration.LoadDefault(); // 设置OSS区域 cfg.Region = region; // 设置自定义凭证提供器 cfg.CredentialsProvider = credentialsProvider; // 如果指定了自定义endpoint,则覆盖默认设置 if (endpoint != null) { cfg.Endpoint = endpoint; } // 使用配置创建OSS客户端实例 using var client = new OSS.Client(cfg); // 用于获取当前角色账号下的所有OSS存储桶 var paginator = client.ListBucketsPaginator(new OSS.Models.ListBucketsRequest()); // 异步迭代存储桶分页结果 Console.WriteLine("Buckets:"); await foreach (var page in paginator.IterPageAsync()) { // 遍历每个页面中的存储桶 foreach (var bucket in page.Buckets ?? []) { // 输出存储桶信息:名称、存储类型和位置 Console.WriteLine($"Bucket:{bucket.Name}, {bucket.StorageClass}, {bucket.Location}"); } }
使用自定义访问凭证
当以上凭证配置方式不满足要求时,您可以自定义获取凭证的方式。
通过Credentials.CredentialsProvideFunc接口
using OSS = AlibabaCloud.OSS.V2; // 为阿里云OSS SDK创建别名,简化后续使用
var region = "cn-hangzhou"; // 必须项,设置Bucket所在的区域(Region)。以华东1(杭州)为例,Region填写为cn-hangzhou
var endpoint = null as string; // 可选项,指定访问OSS服务的域名。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com
// 显式设置访问凭证,仅作演示用例。实际项目中您可以通过获取环境变量方式获取
var AccessKeyId = "your AccessKeyId"; // 必须项,RAM用户或STS临时访问凭证AccessKeyId
var AccessKeySecret = "your AccessKeySecret"; // 必须项,RAM用户或STS临时访问凭证AccessKeySecret
// var SecurityToken = "your STS Token"; // 可选项,使用临时访问凭证可配置此变量
// 将通用凭证转换为OSS SDK所需的凭证提供器
var credentialsProvider = new OSS.Credentials.CredentialsProvideFunc(() =>
{
// 使用长期凭证构造OSS SDK所需的凭证对象
return new OSS.Credentials.Credentials(
AccessKeyId, // RAM用户AccessKey ID
AccessKeySecret); // RAM用户AccessKey Secret
// 使用临时访问凭证构造OSS SDK所需的凭证对象
// return new OSS.Credentials.Credentials(
// AccessKeyId, // 临时AccessKey ID
// AccessKeySecret, // 临时AccessKey Secret
// SecurityToken); // 安全令牌(STS Token)
});
// 加载OSS客户端的默认配置
var cfg = OSS.Configuration.LoadDefault();
// 设置OSS区域
cfg.Region = region;
// 设置自定义凭证提供器
cfg.CredentialsProvider = credentialsProvider;
// 如果指定了自定义endpoint,则覆盖默认设置
if (endpoint != null)
{
cfg.Endpoint = endpoint;
}
// 使用配置创建OSS客户端实例
using var client = new OSS.Client(cfg);
// 用于获取当前角色账号下的所有OSS存储桶
var paginator = client.ListBucketsPaginator(new OSS.Models.ListBucketsRequest());
// 异步迭代存储桶分页结果
Console.WriteLine("Buckets:");
await foreach (var page in paginator.IterPageAsync())
{
// 遍历每个页面中的存储桶
foreach (var bucket in page.Buckets ?? [])
{
// 输出存储桶信息:名称、存储类型和位置
Console.WriteLine($"Bucket:{bucket.Name}, {bucket.StorageClass}, {bucket.Location}");
}
}
示例代码
OSS C# SDK V2提供丰富的示例代码供参考或直接使用。
示例内容 | GitHub示例文件 |