最近更新时间:2021-11-04
通常情况下,对象存储桶和对象都是私有的。如果希望第三方用户可以上传对象到存储桶或从桶中下载对象,可以通过安全令牌服务 (Security Token Service, STS) 授权临时的AccessKey、SecretKey和Token,以实现对对象存储的操作。
STS为紫光云提供的临时访问权限管理服务。其优势如下:
您无需将长期密钥(AccessKey和SecretKey)透漏给第三方应用,只需生成一个临时的访问令牌并将令牌交给第三方用户。
您可以自定义这个令牌的访问权限及有效期限,访问令牌过期后会自动失效。
注意:
正式AK/SK只能用于业务层使用,请勿将其直接交给第三方用户,导致信息泄露。
正式AK/SK用户主体为业务服务器,第三方终端用户对应的信息应由业务服务器自己维护。
使用该功能请安装AWSSDK.SecurityToken。安装命令如下:
dotnet add package AWSSDK.SecurityToken --version 3.3.1 |
以下代码用于生成临时的AK、SK和临时Token:
using System; using Amazon.S3; using Amazon.S3.Model; using Amazon.SecurityToken; using Amazon.SecurityToken.Model;
namespace stsEncryption { class Program { static void Main(string[] args) { // sts encryption, return new ak and sk var ak = "*"; var sk = "*"; var stsServer = "http://sts-beijing.unicloudsrv.com"; // 目前只有北京节点拥有STS服务 var stsPolicy = "{\"Version\":\"2012-10-17\",\"Statement\":[{\"Effect\":\"Allow\",\"Action\":[\"s3:List*\"],\"Resource\":[\"arn:aws:s3:::*\"]}]}";// STS生成的账号的policy, 只读权限 var userName = ""; //填写您系统内的用户名,长度2-32字节 var duration = 3600; //临时Token的生效时间,单位:秒
AmazonSecurityTokenServiceClient sts = new AmazonSecurityTokenServiceClient(ak, sk, new AmazonSecurityTokenServiceConfig{ ServiceURL = stsServer });
var request = new GetFederationTokenRequest { Name = userName, DurationSeconds = duration, Policy = stsPolicy };
GetFederationTokenResponse response; try { response = sts.GetFederationTokenAsync(request).GetAwaiter().GetResult(); Console.WriteLine($"temporary token is { response.Credentials.SessionToken }"); // STS服务生成的临时Token Console.WriteLine($"temporary ak is { response.Credentials.AccessKeyId }"); // STS服务生成的临时AK Console.WriteLine($"temporary sk is { response.Credentials.SecretAccessKey }"); // STS服务生成的临时SK
} catch (AmazonS3Exception e) { Console.WriteLine(e.Message); throw; } catch (Exception e) { Console.WriteLine(e.Message); throw; } } } } |
参数取值说明如下。
参数 | 说明 |
ak、sk | AK和SK可以从“紫光云控制台 > 用户中心 > 安全信息管理 ”处获取。 |
stsServer | 是STS服务地址,目前只有北京节点拥有,北京节点可访问内网域名“sts-beijing- internal.unicloudsrv.com”访问该服务, 否则请访问公网域名“sts-beijing.unicloudsrv.com”访问该服务。 |
stsPolicy | 是本次产生的临时账户的policy,遵照policy的准则,样例中的policy适用于ListBucket的API接口。 |
userName | 填写您系统内的用户名,长度为2-32字节。 |
duration | 临时Token的生效时间,单位为秒。 |
由于样例中的policy是适用于ListBucket接口的,固本样例也使用ListBuckets接口,请求的逻辑和参数和ListBuckets接口的规则一致。
以下代码用于使用临时的AK、SK和Token请求ListBuckets接口:
using System; using Amazon.S3; using Amazon.S3.Model;
namespace ListBuckets { class Program { static void Main(string[] args) { var Ak = "xxx"; // 请填写STS服务生成的临时AK var Sk = "xxx"; // 请填写STS服务生成的临时SK var token = “xxx”; // 请填写STS服务生成的临时Token var endpoint = "http://s3.test.com"; // 请填写访问的Endpoint AmazonS3Client serviceClient = new AmazonS3Client(Ak,Sk,token, new AmazonS3Config{ ServiceURL = endpoint }); try { ListBucketsResponse resp; resp = serviceClient.ListBucketsAsync().GetAwaiter().GetResult();
Console.WriteLine($"Number of buckets: {resp.Buckets.Count}"); foreach (S3Bucket bucket in resp.Buckets) { Console.WriteLine("Bucket {0}, Created on {1}", bucket.BucketName, bucket.CreationDate); } } catch (AmazonS3Exception e) { Console.WriteLine(e.Message); throw; } catch (Exception e) { Console.WriteLine(e); throw; }
}
} } |
参数取值说明如下。
参数 | 说明 |
Ak、Sk | 请填写STS服务生成的临时AK和临时SK。 |
token | 请填写STS服务生成的临时Token。 |
endpoint | 请填写需要访问区域的Endpoint地址。 |