2017-06-13 107 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

如果您觉得我的回答有用/有帮助,请将其标记为答案,以便其他人可以从中受益。 –

相关问题