0

由于答案是找不到页面,我试图使用以下代码检索公共 IP 的大小

Configuration config = ManagementConfiguration.configure(
          new URI(uri), 
          subscriptionId,
          keyStoreLocation, // the file path to the JKS
          keyStorePassword, // the password for the JKS
          KeyStoreType.jks // flags that I'm using a JKS keystore
        );

NetworkResourceProviderClient  networkResourceProviderClient = NetworkResourceProviderService.create(config);
           PublicIpAddressListResponse PublicIpAddressListResponse =networkResourceProviderClient.getPublicIpAddressesOperations().listAll();
           ArrayList<PublicIpAddress> PublicIpAddressList =PublicIpAddressListResponse.getPublicIpAddresses();
           System.out.println(PublicIpAddressList.size());

使用 Azure AD ServicePrincipal 身份验证,它返回 - 0

使用带有https://management.azure.com/ API 的证书身份验证,它返回 - AuthenticationFailed:

Exception in thread "main" com.microsoft.windowsazure.exception.ServiceException: AuthenticationFailed: Authentication failed. The 'Authorization' header is not present or provided in an invalid format.
    at com.microsoft.windowsazure.exception.ServiceException.createFromJson(ServiceException.java:290)
    at com.microsoft.azure.management.network.PublicIpAddressOperationsImpl.listAll(PublicIpAddressOperationsImpl.java:1443)
    at com.microsoft.azure.auth.Program.main(Program.java:50)

任何想法如何检索所有虚拟机的公共 IP 地址?或者如何对其进行身份验证以获取 IP 值?

4

1 回答 1

1

该问题是由使用不正确的身份验证引起的。

下面的身份验证代码仅适用于 Azure 服务管理。

Configuration config = ManagementConfiguration.configure(
          new URI("https://management.core.windows.net), 
          subscriptionId,
          keyStoreLocation, // the file path to the JKS
          keyStorePassword, // the password for the JKS
          KeyStoreType.jks // flags that I'm using a JKS keystore
        );

对 Azure 资源管理进行身份验证,文档“验证 Azure 资源管理请求”( https://msdn.microsoft.com/en-us/library/azure/dn790557.aspx ) 说“您对资源执行的所有任务使用Azure 资源管理器必须通过 Azure Active Directory 进行身份验证。"。

因此,您需要使用您的订阅 ID、租户 ID、客户端 ID 和客户端秘密修改身份验证配置代码,如下所示:

private static AuthenticationResult getAccessTokenFromServicePrincipalCredentials() throws
            ServiceUnavailableException, MalformedURLException, ExecutionException, InterruptedException {
        AuthenticationContext context;
        AuthenticationResult result = null;
        ExecutorService service = null;
        try {
            service = Executors.newFixedThreadPool(1);
            // TODO: add your tenant id
            context = new AuthenticationContext("https://login.windows.net/" + "<your tenant id>",
                    false, service);
            // TODO: add your client id and client secret
            ClientCredential cred = new ClientCredential("<your client id>",
                    "<your client secret>");
            Future<AuthenticationResult> future = context.acquireToken(
                    "https://management.azure.com/", cred, null);
            result = future.get();
        } finally {
            service.shutdown();
        }

        if (result == null) {
            throw new ServiceUnavailableException(
                    "authentication result was null");
        }
        return result;
    }


Configuration config = ManagementConfiguration.configure(
          null,
          new URI("https://management.core.windows.net), 
          "<your-subscription-id>",
          getAccessTokenFromServicePrincipalCredentials()
.getAccessToken()
        );

ServicePrincipal for Java的完整认证代码,请参考https://github.com/Azure/azure-sdk-for-java/blob/master/azure-mgmt-samples/src/main/java/com/microsoft/ azure/samples/authentication/ServicePrincipalExample.java

对于线程(使用 azure java sdk 在 windows azure 中检索订阅的网络列表)答案的 url,它移动https://github.com/Azure/azure-sdk-for-java/blob/master/service-management/ azure-svc-mgmt-network/src/main/java/com/microsoft/windowsazure/management/network/NetworkOperations.java

于 2015-10-19T08:15:35.130 回答