本文介紹如何使用STS以及簽名URL臨時授權訪問OSS資源。
由于STS臨時賬號以及簽名URL均需設置有效時長,當您使用STS臨時賬號生成簽名URL執行相關操作(例如上傳、下載文件)時,以最小的有效時長為準。例如您的STS臨時賬號的有效時長設置為1200秒、簽名URL設置為3600秒時,當有效時長超過1200秒后,您無法使用此STS臨時賬號生成的簽名URL上傳文件。
注意事項
使用STS臨時授權
OSS可以通過阿里云STS(Security Token Service)進行臨時授權訪問。阿里云STS是為云計算用戶提供臨時訪問令牌的Web服務。通過STS,您可以為第三方應用或子用戶(即用戶身份由您自己管理的用戶)頒發一個自定義時效和權限的訪問憑證。關于STS的更多信息,請參見STS介紹。
STS的優勢如下:
您無需透露您的長期密鑰(AccessKey)給第三方應用,只需生成一個訪問令牌并將令牌交給第三方應用。您可以自定義這個令牌的訪問權限及有效期限。
您無需關心權限撤銷問題,訪問令牌過期后自動失效。
通過STS臨時授權訪問OSS的步驟如下:
獲取臨時訪問憑證
臨時訪問憑證包括臨時訪問密鑰(AccessKey ID和AccessKey Secret)和安全令牌(SecurityToken)。臨時訪問憑證有效時間單位為秒,最小值為900,最大值以當前角色設定的最大會話時間為準。更多信息,請參見設置RAM角色最大會話時間。
您可以通過以下兩種方式獲取臨時訪問憑證。
方式一
通過調用STS服務的AssumeRole接口獲取臨時訪問憑證。
方式二
通過各語言STS SDK獲取臨時訪問憑證。
使用STS憑證構造簽名請求。
using Aliyun.OSS; // yourEndpoint填寫Bucket所在地域對應的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。 var endpoint = "yourEndpoint"; 運行本代碼示例之前,請確保已使用STS服務獲取的臨時訪問密鑰設置環境變量YOUR_ACCESS_KEY_ID和YOUR_ACCESS_KEY_SECRET。 var accessKeyId = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_ID"); var accessKeySecret = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_SECRET"); // 從STS服務獲取的安全令牌(SecurityToken)。 var securityToken = "yourSecurityToken"; // 獲取STS臨時憑證后,您可以通過其中的安全令牌(SecurityToken)和臨時訪問密鑰(AccessKeyId和AccessKeySecret)生成OSSClient。 // 創建OSSClient實例。 var ossStsClient = new OssClient(endpoint, accessKeyId, accessKeySecret, securityToken); // 執行OSS相關操作。
使用簽名URL臨時授權
注意事項
生成簽名URL過程中,SDK利用本地存儲的密鑰信息,根據特定算法計算出簽名(signature),然后將其附加到URL上,以確保URL的有效性和安全性。這一系列計算和構造URL的操作都是在客戶端完成,不涉及網絡請求到服務端。因此,生成簽名URL時不需要授予調用者特定權限。但是,為避免第三方用戶無法對簽名URL授權的資源執行相關操作,需要確保調用生成簽名URL接口的身份主體被授予對應的權限。
例如,通過簽名URL上傳文件時,需要授予oss:PutObject權限。通過簽名URL下載或預覽文件時,需要授予oss:GetObject權限。
您可以將生成的簽名URL提供給訪客進行臨時訪問。生成簽名URL時,您可以自定義URL的過期時間來限制訪客的訪問時長。
如果需要生成HTTPS協議的簽名URL,請將Endpoint中的通信協議設置為HTTPS。
通過以下示例生成的簽名URL中如果包含特殊符號
+
,可能出現無法正常訪問該簽名URL的現象。如需正常訪問該簽名URL,請將簽名URL中的+
替換為%2B
。
以下是使用簽名URL臨時授權的常見示例。使用簽名URL進行臨時授權的完整示例代碼,請參見GitHub。
生成簽名URL并通過簽名URL上傳文件
生成用于上傳的簽名URL
using Aliyun.OSS; using Aliyun.OSS.Common; // 填寫Bucket所在地域對應的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。 var endpoint = "https://oss-cn-hangzhou.aliyuncs.com"; // 從環境變量中獲取訪問憑證。運行本代碼示例之前,請確保已設置環境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。 var accessKeyId = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_ID"); var accessKeySecret = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_SECRET"); // 填寫Bucket名稱,例如examplebucket。 var bucketName = "examplebucket"; // 填寫Object完整路徑,完整路徑中不包含Bucket名稱,例如exampledir/exampleobject.txt。 var objectName = "exampledir/exampleobject.txt"; var objectContent = "More than just cloud."; // 創建OSSClient實例。 var client = new OssClient(endpoint, accessKeyId, accessKeySecret); try { // 生成簽名URL。 var generatePresignedUriRequest = new GeneratePresignedUriRequest(bucketName, objectName, SignHttpMethod.Put) { // 設置簽名URL過期時間,默認值為3600秒。 Expiration = DateTime.Now.AddHours(1), }; var signedUrl = client.GeneratePresignedUri(generatePresignedUriRequest); } catch (OssException ex) { Console.WriteLine("Failed with error code: {0}; Error info: {1}. \nRequestID:{2}\tHostID:{3}", ex.ErrorCode, ex.Message, ex.RequestId, ex.HostId); } catch (Exception ex) { Console.WriteLine("Failed with error info: {0}", ex.Message); }
通過簽名URL上傳文件
您可以參考移動端Android SDK通過簽名URL上傳文件。更多信息,請參見通過簽名URL上傳文件。
生成簽名URL并通過簽名URL下載文件
生成用于下載的簽名URL
using Aliyun.OSS; using Aliyun.OSS.Common; // 填寫Bucket所在地域對應的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。 var endpoint = "https://oss-cn-hangzhou.aliyuncs.com"; // 從環境變量中獲取訪問憑證。運行本代碼示例之前,請確保已設置環境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。 var accessKeyId = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_ID"); var accessKeySecret = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_SECRET"); // 填寫Bucket名稱,例如examplebucket。 var bucketName = "examplebucket"; // 填寫Object完整路徑,完整路徑中不包含Bucket名稱,例如exampledir/exampleobject.txt。 var objectName = "exampledir/exampleobject.txt"; // 填寫Object下載到本地文件的完整路徑。例如D:\\localpath\\examplefile.txt。如果指定的本地文件存在會覆蓋,不存在則新建。 var downloadFilename = "D:\\localpath\\examplefile.txt"; // 創建OSSClient實例。 var client = new OssClient(endpoint, accessKeyId, accessKeySecret); try { var metadata = client.GetObjectMetadata(bucketName, objectName); var etag = metadata.ETag; // 生成簽名URL。 var req = new GeneratePresignedUriRequest(bucketName, objectName, SignHttpMethod.Get) { // 設置簽名URL過期時間,默認值為3600秒。 Expiration = DateTime.Now.AddHours(1), }; var uri = client.GeneratePresignedUri(req); } catch (OssException ex) { Console.WriteLine("Failed with error code: {0}; Error info: {1}. \nRequestID:{2}\tHostID:{3}", ex.ErrorCode, ex.Message, ex.RequestId, ex.HostId); } catch (Exception ex) { Console.WriteLine("Failed with error info: {0}", ex.Message); }
通過簽名URL下載文件
您可以參考移動端Android SDK通過簽名URL下載文件。更多信息,請參見通過簽名URL下載文件。