2017-06-13 108 views
2

我在我的c#web應用程序中寫入了一種從Azure存儲帳戶中刪除舊blob的方法。 這是我的代碼:c#以編程方式獲取Azure存儲帳戶權限

public void CleanupIotHubExpiredBlobs() 
     { 

       const string StorageAccountName = "storageName"; 

       const string StorageAccountKey = "XXXXXXXXXX"; 

       const string StorageContainerName = "outputblob"; 
       string storageConnectionString = string.Format("DefaultEndpointsProtocol=https;AccountName={0};AccountKey={1}", StorageAccountName, StorageAccountKey); 

       // Retrieve storage account from connection string. 
       CloudStorageAccount storageAccount = CloudStorageAccount.Parse(storageConnectionString); 
       // Create the blob client. 
       CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient(); 
       // select container in which to look for old blobs. 
       CloudBlobContainer container = blobClient.GetContainerReference(StorageContainerName); 

       // set up Blob access condition option which will filter all the blobs which are not modified for X (this.m_CleanupExpirationNumOfDays) amount of days 
       IEnumerable<IListBlobItem> blobs = container.ListBlobs("", true); 

       foreach (IListBlobItem blob in blobs) 
       { 
       CloudBlockBlob cloudBlob = blob as CloudBlockBlob; 
       Console.WriteLine(cloudBlob.Properties); 
       cloudBlob.DeleteIfExists(DeleteSnapshotsOption.None, AccessCondition.GenerateIfNotModifiedSinceCondition(DateTime.Now.AddDays(-1 * 0.04)), null, null); 
       } 

       LogMessageToFile("Remove old blobs from storage account"); 
      } 

,你可以看到,爲了實現該方法具有接收StorageAccountName和StorageAccountKey參數。

一種方法是將這些參數配置到配置文件中供應用程序使用,但這意味着用戶必須手動將這兩個參數插入到配置文件中。

我的問題是: 有沒有辦法以編程方式檢索我的代碼中的這些參數中的至少一個,這樣至少用戶將不得不只插入一個參數而不是兩個?我的目標是讓用戶的生活更輕鬆。

回答

1

我的問題是:有沒有辦法以編程方式檢索我的代碼中的這些參數中的至少一個,以便至少用戶將不得不只插入一個參數而不是兩個?我的目標是讓用戶的生活更輕鬆。

根據您的描述,我建議您可以使用azure rest api通過使用帳戶名稱獲取存儲帳戶密鑰。

此外,我們還可以使用rest api列出所有rescourse組的存儲帳戶名稱,但仍需要將rescourse組名稱作爲參數發送到azure管理url。

您可以發送請求到Azure管理如下網址:

POST: https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{resrouceGroupName}/providers/Microsoft.Storage/storageAccounts/{storageAccountName}/listKeys?api-version=2016-01-01 
Authorization: Bearer {token} 

更多細節,你可以參考下面的代碼:

注意:使用這種方法,你需要首先創建一個天青Active Directory應用程序和服務主體。在生成服務主體後,您可以獲取applicationid,訪問密鑰和傳說。更多細節,你可以參考這個article

代碼:

string tenantId = " "; 
    string clientId = " "; 
    string clientSecret = " "; 
    string subscription = " "; 
    string resourcegroup = "BrandoSecondTest"; 
    string accountname = "brandofirststorage"; 
    string authContextURL = "https://login.windows.net/" + tenantId; 
    var authenticationContext = new AuthenticationContext(authContextURL); 
    var credential = new ClientCredential(clientId, clientSecret); 
    var result = authenticationContext.AcquireTokenAsync(resource: "https://management.azure.com/", clientCredential: credential).Result; 
    if (result == null) 
    { 
     throw new InvalidOperationException("Failed to obtain the JWT token"); 
    } 
    string token = result.AccessToken; 
    HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(string.Format("https://management.azure.com/subscriptions/{0}/resourceGroups/{1}/providers/Microsoft.Storage/storageAccounts/{2}/listKeys?api-version=2016-01-01", subscription, resourcegroup, accountname)); 
    request.Method = "POST"; 
    request.Headers["Authorization"] = "Bearer " + token; 
    request.ContentType = "application/json"; 
    request.ContentLength = 0; 


    //Get the response 
    var httpResponse = (HttpWebResponse)request.GetResponse(); 

    using (System.IO.StreamReader r = new System.IO.StreamReader(httpResponse.GetResponseStream())) 
    { 
     string jsonResponse = r.ReadToEnd(); 

     Console.WriteLine(jsonResponse); 
    } 

結果:enter image description here

+0

非常感謝您白蘭度,這是真正有用的! –

+0

如果您覺得我的回答有用/有幫助,請將其標記爲答案,以便其他人可以從中受益。 –

相關問題