【问题标题】:Azure Billing API returning 403Azure 计费 API 返回 403
【发布时间】:2015-11-03 21:07:19
【问题描述】:

我花了几天时间试图弄清楚这一点,查看了我在 Azure 网站、Azure git hubs 以及所有相关的堆栈溢出帖子上可以找到的所有信息。我希望我错过了一些简单的东西。

我正在使用在网络上发布的示例 java 代码来获取令牌:

try {
        exec = Executors.newFixedThreadPool(1);
        context = new AuthenticationContext("https://login.microsoftonline.com/8e4f0713-5eea-4da0-99c0-xxxxxxxxxxxx",
                        true, exec);
        ClientCredential cred = new ClientCredential(webClientID, clientSecret);
        Future<AuthenticationResult> future = context.acquireToken("https://management.azure.com/", cred, null);
        result = future.get();
    } catch(Exception e) {
        logger.warn("Exception " + e);
    } finally {
        exec.shutdown();
    }

    if (result == null) {
        return null;
    }
    return result.getAccessToken();

这会生成一个令牌,我将其放入请求标头中:

Authorization: Bearer -token-

The GET https://management.azure.com/subscriptions/758ad253-cbf5-4b18-8863-xxxxxxxxxxxx/providers/Microsoft.Commerce/RateCard?api-version=2015-06-01-preview%26%24filter%3DOfferDurableId+eq+%27MS-AZR-0003p%27+and+Currency+eq+%27USD%27+and+Locale+eq+%27en-US%27+and+RegionInfo+eq+%27US%27

返回 403 代码:

Exception: java.io.IOException: Server returned HTTP response code: 403 for URL: https://management.azure.com/subscriptions/758ad253-cbf5-4b18-8863-xxxxxxxxxxxx/providers/Microsoft.Commerce/RateCard?api-version=2015-06-01-preview%26%24filter%3DOfferDurableId+eq+%27MS-AZR-0003p%27+and+Currency+eq+%27USD%27+and+Locale+eq+%27en-US%27+and+RegionInfo+eq+%27US%27

标题: [0] 空:HTTP/1.1 403 禁止

[1] 缓存控制:无缓存

[2] 编译指示:无缓存

[3] 内容类型:application/json;字符集=utf-8

[4] 过期:-1

[5] x-ms-failure-cause: 网关

[6] x-ms-request-id: e4ad9253-e034-481d-aba0-f46902b7057f

[7] x-ms-correlation-request-id:e4ad9253-e034-481d-aba0-f46902b7057f

[8] x-ms-routing-request-id: EASTUS:20151103T205103Z:e4ad9253-e034-481d-aba0-f46902b7057f

[9] 严格的传输安全性:max-age=31536000;包含子域

[10] 日期:2015 年 11 月 3 日星期二 20:51:02 GMT

[11] 连接:关闭

[12] 内容长度:303

我在 Azure 管理控制台上完成了所有设置,在 Azure AD 中创建应用程序,获取客户端 ID 和客户端密码等。SSL/HTTPS 代码是:

           azureURL = new java.net.URL(url);

        con = (HttpsURLConnection)azureURL.openConnection();
        con.disconnect();
        con.setDoOutput(true);
        con.setDoInput(true);
        con.setUseCaches(false);
        con.setSSLSocketFactory(MyUtils.getSSLSocketFactory());
        con.setRequestMethod("GET");
        con.setRequestProperty("x-ms-version", "2015-06-01-preview");
        con.setRequestProperty("Content-Type", "application/json");

        String token = getAccessTokenFromServicePrincipalCredentials();
        if (token != null) {
            con.setRequestProperty("Authorization", "Bearer " + token);
            con.connect();
            in = (InputStream)con.getContent();
            InputStreamReader inr = new InputStreamReader(in);
        } else {
            logger.warn("unable to obtain prices");
        }

关于如何调试问题的任何建议?

【问题讨论】:

    标签: java azure


    【解决方案1】:

    我看到您正在获取Service Principal(即应用程序本身)的访问令牌。请确保在您的 Azure 订阅中至少授予此服务主体用户 Reader 角色。我相信您收到此错误是因为此用户无权访问您的 Azure 订阅。

    请参阅此链接:https://azure.microsoft.com/en-in/documentation/articles/role-based-access-control-configure/Manage access using the Azure Management Portal 部分)了解如何分配角色。

    【讨论】:

    • 谢谢,我将应用程序本身添加为贡献者,然后 403 消失了。现在我得到一个 404 文件未找到。
    • 您应该在错误本身中获得更多详细信息。你介意分享这些细节吗?
    • 这是异常:java.io.FileNotFoundException:management.azure.com/subscriptions/…
    • 你能做一件事吗?获取 URL 和不记名令牌并在 Google Postman 或 Fiddler 中运行。您应该在那里看到更多详细信息。
    • 是的,是的......只是一秒钟
    【解决方案2】:

    因为我们不能通过带有 HTTPS 请求的证书调用 Usage & Rate Card API。如前所述:

    使用 Azure 资源管理器对资源执行的所有任务都必须通过 Azure Active Directory 进行身份验证

    Authenticating Azure Resource Manager requests.

    所以你遇到了 403 问题。

    请尝试使用Resource Usage (Preview) 中提到的请求标头 Content-Type 和 Authorization 为 REST API 构建通用 HTTP 请求。

    您还可以在 HTTP 请求构建工具中进行测试以获取所需的信息,例如:

    这里有一个类似的帖子How to use Management certificate based authentication for making REST API calls to Azure? 供您参考。

    【讨论】:

      【解决方案3】:

      对于找不到的文件,回复是:

      java.io.FileNotFoundException:

      https://management.azure.com/subscriptions/758ad253-cbf5-4b18-8863-3eed082xxxxx/providers/Microsoft.Commerce/RateCard?api-version=2015-06-01-preview%26%24filter%3DOfferDurableId+eq+%27MS-AZR-0003p%27+and+Currency+eq+%27USD%27+and+Locale+eq+%27en-US%27+and+RegionInfo+eq+%27US%27

      HTTP/1.1 404 未找到

      [1] 缓存控制:无缓存

      [2] 编译指示:无缓存

      [3] 内容类型:application/json;字符集=utf-8

      [4] 过期:-1

      [5] x-ms-failure-cause: 网关

      [6] x-ms-request-id: 8bd5ea3a-5a5f-4eb5-86b5-bd6581f94e00

      [7] x-ms-correlation-request-id: 8bd5ea3a-5a5f-4eb5-86b5-bd6581f94e00

      [8] x-ms-routing-request-id: EASTUS:20151119T181954Z:8bd5ea3a-5a5f-4eb5-86b5-bd6581f94e00

      [9] 严格的传输安全性:max-age=31536000;包含子域

      [10] 日期:格林威治标准时间 2015 年 11 月 19 日星期四 18:19:53

      [11] 内容长度:348

      让我看看我还能得到什么......

      【讨论】:

        猜你喜欢
        • 2016-04-05
        • 1970-01-01
        • 1970-01-01
        • 2022-10-02
        • 1970-01-01
        • 1970-01-01
        • 2013-11-20
        • 2023-03-14
        • 2018-01-24
        相关资源
        最近更新 更多