2016-12-28 174 views
0

我需要來自我的訂閱ID和身份驗證令牌的Azure存儲列表。 我做的代碼按基準-`如何通過c#獲取Azure列表存儲?

https://msdn.microsoft.com/en-us/library/azure/ee460787.aspx?f=255&MSPPError=-2147217396

但我不能夠得到的數據和響應,我只得到代碼401 Unauthorized access

我已經試過代碼C#按如下 -

獲取授權令牌 -

private static string GetAuthorizationToken() 
     { 
      ClientCredential cc = new ClientCredential(ClientId, ServicePrincipalPassword); 
      var context = new AuthenticationContext("https://login.windows.net/" + AzureTenantId); 
      var result = context.AcquireTokenAsync("https://management.azure.com/", cc); 
      if (result == null) 
      { 
       throw new InvalidOperationException("Failed to obtain the JWT token"); 
      } 

      return result.Result.AccessToken; 
     } 

然後

AuthToken = GetAuthorizationToken(); 
       TokenCredentials = new TokenCredentials(AuthToken); 

       HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("https://management.core.windows.net/<My Subscription ID>/services/storageservices"); 
       request.Headers.Add(HttpRequestHeader.Authorization, "Bearer " + AuthToken); 
       request.ContentType = "application/json"; 
       request.Method = "GET"; 
       //request.Headers["Authorization"] = "Bearer " + AuthToken; // Also tried this 
       request.Headers["x-ms-version"] = "2016-05-31";// 

       //https://management.core.windows.net/<subscription-id>/services/storageservices 
       //header - "x-ms-version" 

       HttpWebResponse response = null; 
       try 
       { 
        response = (HttpWebResponse)request.GetResponse();      
       } 
       catch (WebException ex) 
       { 
        //ex.Message; 
       } 

請提出解決方案,從認購ID和身份驗證令牌獲得存儲帳戶列表。如果你有其他更好的解決方案,那麼這個獲取存儲列表,然後也請建議。

+0

請嘗試更改以下代碼行:var result = context.AcquireTokenAsync(「https://management.azure.com/」,cc);'to'var result = context.AcquireTokenAsync(「https:// management.core.windows.net/「,cc);'。 –

+0

@GauravMantri我按照你的建議綁定,但它在認證中給出錯誤 - 在mscorlib.dll中發生類型'System.AggregateException'的異常,但未在用戶代碼中處理 – Shirish

回答

0

我用下面的函數來創建類似的要求:

private static async Task<HttpWebRequest> createHttpRequestWithToken(Uri uri) 
{ 
    HttpWebRequest newRequest = (HttpWebRequest)HttpWebRequest.Create(uri); 
    string clientId = ConfigurationManager.AppSettings["ClientId"]); 
    string clientSecret = ConfigurationManager.AppSettings["ClientSecret"]); 
    ClientCredential creds = new ClientCredential(clientId, clientSecret); 
    AuthenticationContext authContext = new AuthenticationContext(string.Format("https://login.microsoftonline.com/{0}/", ConfigurationManager.AppSettings["OrganizationId"])); 
    AuthenticationResult authResult = await authContext.AcquireTokenAsync("https://management.core.windows.net/", creds); 
    newRequest.Headers.Add(HttpRequestHeader.Authorization, "Bearer " + authResult.AccessToken);  
    return newRequest; 
} 

,創建這樣的要求:

HttpWebRequest request = createHttpRequestWithToken(uri).Result; 

此外,Windows Azure的服務管理API需要被授權訪問的資源。這可以在AD服務主體的配置選項卡中完成。

enter image description here

+0

我在此行上卡住 - AuthenticationResult authResult = await authContext.AcquireTokenAsync(「https://management.core.windows.net/」,creds);你有什麼想法,爲什麼它卡在這一行? – Shirish

+0

卡住了,你會得到某種錯誤? –

+0

沒有錯誤拋出,它只是保持處理請求,並繼續處理。 – Shirish

0

list all the storage accounts available under the subscription,你可以嘗試使用:

GET /subscriptions/{subscriptionId}/providers/Microsoft.Storage/storageAccounts?api-version=2016-01-01

下面的示例代碼在我身邊正常工作,請參閱它。

string tenantId = "xxxx"; 
string clientId = "xxxx"; 
string clientSecret = "xxxx"; 
string subscriptionid = "xxxx"; 

string authContextURL = "https://login.windows.net/" + tenantId; 
var authenticationContext = new AuthenticationContext(authContextURL); 
var credential = new ClientCredential(clientId, clientSecret); 
var result = await authenticationContext.AcquireTokenAsync(resource: "https://management.azure.com/", clientCredential: credential); 

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}/providers/Microsoft.Storage/storageAccounts?api-version=2016-01-01", subscriptionid)); 

request.Method = "GET"; 
request.Headers["Authorization"] = "Bearer " + token; 


HttpWebResponse response = null; 
try 
{ 
    response = (HttpWebResponse)request.GetResponse(); 
} 
catch (WebException ex) 
{ 
    //ex.Message; 
} 

在小提琴手的反應看起來像這樣。

enter image description here

此外,請確保您assign the application to a role,如果不指定應用程序的作用,會出現403錯誤。

相關問題