文档中心 > 通过STS授权临时访问凭证
通过STS授权临时访问凭证

最近更新时间: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

以下代码用于生成临时的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的生效时间,单位为秒。

 

步骤二: 使用临时的AK、SK和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地址。