【问题标题】:How to get Azure list storage by c#?如何通过 c# 获取 Azure 列表存储?
【发布时间】:2017-05-12 12:34:22
【问题描述】:

我需要来自我的订阅 ID 和身份验证令牌的 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 和身份验证令牌获取存储帐户列表的解决方案。如果您有其他更好的解决方案来获取存储列表,那么也请提出建议。

【问题讨论】:

  • 请尝试将以下代码行 var result = context.AcquireTokenAsync("https://management.azure.com/", cc); 更改为 var result = context.AcquireTokenAsync("https://management.core.windows.net/", cc);
  • @GauravMantri 我已按照您的建议绑定,但在该身份验证中出现错误 - mscorlib.dll 中出现“System.AggregateException”类型的异常,但未在用户代码中处理

标签: c# asp.net azure azure-storage azure-blob-storage


【解决方案1】:

我使用下面的函数来创建类似的请求:

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 服务主体的配置选项卡中完成。

【讨论】:

【解决方案2】:

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;
}

fiddler 中的响应如下所示。

另外,请确认assign the application to a role,如果不给应用分配角色,会出现403错误。

【讨论】:

    猜你喜欢
    • 2015-05-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-20
    • 1970-01-01
    • 2019-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多