2016-12-28 177 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错误。

相关问题