2016-12-28 7 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あなたが示唆したとおりに結びついていますが、その認証でエラーが発生しています - タイプ 'System.AggregateException'の例外はmscorlib.dllで発生しましたが、ユーザーコードでは処理されませんでした – 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サービスプリンシパルの[構成]タブで実行できます。 list all the storage accounts available under the subscription

enter image description here

+0

この行にはまっています - AuthenticationResult authResult = authContext.AcquireTokenAsync( "https://management.core.windows.net/"、creds)を待ちます。あなたはなぜこの行にこだわっているのか、何か考えていますか? – Shirish

+0

あなたは何らかのエラーが発生していますか? –

+0

エラーを投げることはありません。要求を処理し続け、その処理を続けるだけです。 – Shirish

0

、あなたが使用することを試みることができる:

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エラーが表示され、確認してください。

関連する問題