管理访问凭据

更新时间:

在使用阿里云SDK调用OpenAPI操作资源时,必须正确配置凭证信息。C# V1.0 SDK支持多种凭据配置方式,本文详细阐述了如何配置访问凭据,以确保安全有效地使用SDK进行开发。

使用AccessKey

重要
  • 阿里云账号的AccessKey泄露会威胁该账号下所有资源的安全。为保证账号安全,强烈建议您使用RAM用户的AccessKey。具体操作,请参见创建AccessKey

  • 请确保代码运行环境已设置环境变量ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET。具体操作,请参见在Linux、macOS和Windows系统配置环境变量

  • 通过IClientProfile配置AccessKey初始化客户端。

    using Aliyun.Acs.Core;
    using Aliyun.Acs.Core.Profile;
    
    namespace AlibabaCloud.SDK.Sample
    {
        public class Sample
        {
            public static void Main(string[] args)
            {
                IClientProfile profile = DefaultProfile.GetProfile(
                    // 地域ID
                    "<REGION_ID>",
                    // 从环境变量获取RAM用户的AccessKey ID
                    Environment.GetEnvironmentVariable("ALIBABA_CLOUD_ACCESS_KEY_ID"),
                    // 从环境变量获取RAM用户的AccessKey SECRET
                    Environment.GetEnvironmentVariable("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
                DefaultAcsClient client = new DefaultAcsClient(profile);
                // 省略调用API步骤...
            }
        }
    }
    
  • 通过AlibabaCloudCredentialsProvider配置AccessKey初始化客户端。

    using Aliyun.Acs.Core;
    using Aliyun.Acs.Core.Profile;
    using Aliyun.Acs.Core.Auth;
    
    namespace AlibabaCloud.SDK.Sample
    {
        public class Sample
        {
            public static void Main(string[] args)
            {
                AlibabaCloudCredentialsProvider provider = new AccessKeyCredentialProvider(
                    // 从环境变量获取RAM用户的AccessKey ID
                    Environment.GetEnvironmentVariable("ALIBABA_CLOUD_ACCESS_KEY_ID"),
                    // 从环境变量获取RAM用户的AccessKey SECRET
                    Environment.GetEnvironmentVariable("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
                IClientProfile profile = DefaultProfile.GetProfile("<REGION_ID>");
                DefaultAcsClient client = new DefaultAcsClient(profile, provider);
                // 省略调用API步骤...
            }
        }
    }
    

使用STS Token

使用临时访问凭据(STS Token)初始化凭据客户端。

using Aliyun.Acs.Core;
using Aliyun.Acs.Core.Auth;
using Aliyun.Acs.Core.Profile;

namespace AlibabaCloud.SDK.Sample
{
    public class Sample
    {
        public static void Main(string[] args)
        {
            AlibabaCloudCredentialsProvider provider = new StsCredentialProvider(
                // 从环境变量获取RAM用户的AccessKey ID
                Environment.GetEnvironmentVariable("ALIBABA_CLOUD_ACCESS_KEY_ID"),
                // 从环境变量获取RAM用户的AccessKey SECRET
                Environment.GetEnvironmentVariable("ALIBABA_CLOUD_ACCESS_KEY_SECRET"),
                // 从环境变量获取RAM用户的SECURITY TOKEN
                Environment.GetEnvironmentVariable("ALIBABA_CLOUD_SECURITY_TOKEN"));
            IClientProfile profile = DefaultProfile.GetProfile("<REGION_ID>");
            DefaultAcsClient client = new DefaultAcsClient(profile, provider);
            // 省略调用API步骤...
        }
    }
}

使用RamRoleArn

以一个RAM用户的身份调用STS服务的AssumeRole接口获取STS Token。

using Aliyun.Acs.Core;
using Aliyun.Acs.Core.Auth;
using Aliyun.Acs.Core.Profile;

namespace AlibabaCloud.SDK.Sample
{
    public class Sample
    {
        public static void Main(string[] args)
        {
            IClientProfile profile = DefaultProfile.GetProfile("<REGION_ID>");
            AlibabaCloudCredentialsProvider provider = new AccessKeyCredentialProvider(
                // 从环境变量获取RAM用户的AccessKey ID
                Environment.GetEnvironmentVariable("ALIBABA_CLOUD_ACCESS_KEY_ID"),
                // 从环境变量获取RAM用户的AccessKey SECRET
                Environment.GetEnvironmentVariable("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
            // 使用RAM Role Arn
            STSAssumeRoleSessionCredentialsProvider stsProvider = new STSAssumeRoleSessionCredentialsProvider(
                provider,
                "<ROLE_ARN>",
                profile
                );

            DefaultAcsClient client = new DefaultAcsClient(profile, stsProvider);
            // 省略调用API步骤...
        }
    }
}

使用ECSRamRole

为了在提高应用部署安全性的同时增强便利性,阿里云SDK支持通过ECS实例RAM角色Token服务来获取ECS RAM角色的授权信息,以访问阿里云资源和服务。使用这种方式,您在ECS上部署的应用程序无需在SDK中配置授权信息即可访问阿里云API(即无需配置AccessKey)。通过这种方式授权的SDK,将具备该ECS RAM角色的权限。

重要

确保ECS实例已经配置了RAM角色。

using Aliyun.Acs.Core;
using Aliyun.Acs.Core.Profile;
using Aliyun.Acs.Core.Auth;

namespace AlibabaCloud.SDK.Sample
{
    public class Sample
    {
        public static void Main(string[] args)
        {
            IClientProfile profile = DefaultProfile.GetProfile("<REGION_ID>");
            // 使用ECS RAM Role方式
            InstanceProfileCredentialsProvider provider = new InstanceProfileCredentialsProvider(
                "<ROLE_NAME>");
            DefaultAcsClient client = new DefaultAcsClient(profile, provider);
            // 省略调用API步骤...
        }
    }
}

使用OIDCRoleArn

在容器服务Kubernetes版中配置了Worker节点RAM角色后,您可以基于RRSA功能在集群内实现Pod级别的应用关联RAM角色功能。各个应用可以独立扮演不同的RAM角色,并利用获取的临时凭证访问云资源,从而实现应用RAM权限的最小化,并满足无AccessKey访问阿里云OpenAPI的需求,以避免AccessKey泄露。

阿里云容器集群会为不同的应用Pod创建和挂载相应的服务账户OIDC Token文件,并将相关配置信息注入到环境变量中,SDK底层通过获取环境变量的配置信息,调用STS服务的AssumeRoleWithOIDC - OIDC角色SSO时获取扮演角色的临时身份凭证接口换取绑定角色的STS Token。详情请参见通过RRSA配置ServiceAccount的RAM权限实现Pod权限隔离

using Aliyun.Acs.Core;
using Aliyun.Acs.Core.Auth;
using Aliyun.Acs.Core.Profile;

namespace AlibabaCloud.SDK.Sample
{
    public class Sample
    {
        public static void Main(string[] args)
        {
            AlibabaCloudCredentialsProvider provider = new OIDCCredentialsProvider(
                // RAM角色名称ARN
                Environment.GetEnvironmentVariable("ALIBABA_CLOUD_ROLE_ARN"), 
                // OIDC提供商ARN
                Environment.GetEnvironmentVariable("ALIBABA_CLOUD_OIDC_PROVIDER_ARN"), 
                // OIDC Token文件路径
                Environment.GetEnvironmentVariable("ALIBABA_CLOUD_OIDC_TOKEN_FILE"),
                // 自定义临时会话名称
                "<ROLE_SESSION_NAME>",
                // 指定调用STS服务的region id
                "<REGION_ID>");
            IClientProfile profile = DefaultProfile.GetProfile("<REGION_ID>");
            DefaultAcsClient client = new DefaultAcsClient(profile, provider);
            // 省略调用API步骤...
        }
    }
}

使用Bearertoken

说明

只有CCC这个产品支持此方式。

using Aliyun.Acs.Core;
using Aliyun.Acs.Core.Auth;
using Aliyun.Acs.Core.Profile;

namespace AlibabaCloud.SDK.Sample
{
    public class Sample
    {
        public static void Main(string[] args)
        {
            AlibabaCloudCredentialsProvider provider = new BearerTokenCredentialProvider("<BEARER_TOKEN>");
            IClientProfile profile = DefaultProfile.GetProfile("<REGION_ID>");
            DefaultAcsClient client = new DefaultAcsClient(profile, provider);
            // 省略调用API步骤...
        }
    }
}

使用默认凭证提供链

using Aliyun.Acs.Core;
using Aliyun.Acs.Core.Auth.Provider;
using Aliyun.Acs.Core.Profile;

namespace AlibabaCloud.SDK.Sample
{
    public class Sample
    {
        public static void Main(string[] args)
        {
            IClientProfile profile = DefaultProfile.GetProfile("<REGION_ID>");
            var alibabaCloudClientCredential = new DefaultCredentialProvider();
            var client = new DefaultAcsClient(profile,alibabaCloudClientCredential);
            // 省略调用API步骤...
        }
    }
}

默认凭证提供程序链查找可用的凭证,寻找顺序如下:

1. 环境凭证

在环境变量里寻找环境凭证,如果定义了 ALIBABA_CLOUD_ACCESS_KEY_IDALIBABA_CLOUD_ACCESS_KEY_SECRET 环境变量且不为空,程序将使用它们创建默认凭证。

2. OIDC RAM角色

若不存在优先级更高的凭据信息,Credentials工具会在环境变量中获取如下内容:

ALIBABA_CLOUD_ROLE_ARN:RAM角色名称ARN;

ALIBABA_CLOUD_OIDC_PROVIDER_ARN:OIDC提供商ARN;

ALIBABA_CLOUD_OIDC_TOKEN_FILE:OIDC Token文件路径;

若以上三个环境变量都已设置内容,Credentials将会使用变量内容调用STS服务的AssumeRoleWithOIDC接口换取STS Token作为默认凭据。

3. 配置文件

如果用户主目录存在默认文件~/.alibabacloud/credentials.ini (Windows 为 C:\Users\USER_NAME\.alibabacloud\credentials.ini),程序会自动创建指定名称和类型的凭证。可以通过定义ALIBABA_CLOUD_CREDENTIALS_FILE环境变量修改默认文件的路径。可以通过环境变量ALIBABA_CLOUD_PROFILE指定凭据名称来选择凭据,若不设置则使用默认配置 default对应的凭据。

[default]                            # 默认配置
type = access_key                    # 认证方式为 access_key
access_key_id = foo                  # Key
access_key_secret = bar              # Secret

[client1]                            # 命名为 `client1` 的配置
type = ecs_ram_role                  # 认证方式为 ecs_ram_role
role_name = EcsRamRoleTest           # Role Name

[client2]                            # 命名为 `client2` 的配置
type = ram_role_arn                  # 认证方式为 ram_role_arn
access_key_id = foo
access_key_secret = bar
role_arn = role_arn                  # Role Arn
role_session_name = role_session_name # 自定义会话名称

4. 实例 RAM 角色

若不存在优先级更高的凭据信息,Credentials工具会在环境变量中获取ALIBABA_CLOUD_ECS_METADATA(ECS实例RAM角色名称),若存在,程序将会通过ECS的元数据服务(Meta Data Server)获取ECS实例RAM角色的STS Token作为默认凭据信息。