Не удается создать субъект-службу с помощью Azure Java SDK - PullRequest
0 голосов
/ 09 октября 2018

Я пытаюсь создать субъект-службу с помощью Azure SDK.Однако я получаю сообщение об ошибке

{"odata.error":{"code":"Authorization_RequestDenied","message":{"lang":"en","value":"Insufficient privileges to complete the operation."}}}

Что я делаю не так?Я делаю следующее:

  1. Создание субъекта службы с ролью владельца

    az ad sp create-for-rbac -n "OrbitTest5" --role Owner --sdk-auth
    
  2. Передача учетных данных для созданного субъекта службы впоставщик учетных данных через переменные среды

    public class AzureAppEnvCredentialProvider implements AzureCredentialProvider {
      public static final String ENV_CLIENT_ID = "CLIENT_ID";
      public static final String ENV_TENANT_ID = "TENANT_ID";
      public static final String ENV_SUBSCRIPTION_ID = "SUBSCRIPTION_ID";
      public static final String ENV_CLIENT_SECRET = "CLIENT_SECRET";
    
      private final String subscriptionId;
    
      public AzureAppEnvCredentialProvider() {
        this.subscriptionId = Preconditions.checkNotNull(System.getenv(ENV_SUBSCRIPTION_ID));
      }
    
      @Override
      public AzureTokenCredentials getCredentials() {
        final String clientId = Preconditions.checkNotNull(System.getenv(ENV_CLIENT_ID));
        final String tenantId = Preconditions.checkNotNull(System.getenv(ENV_TENANT_ID));
        final String clientSecret = Preconditions.checkNotNull(System.getenv(ENV_CLIENT_SECRET));
        return new ApplicationTokenCredentials(clientId, tenantId, clientSecret, AzureEnvironment.AZURE);
      }
    
      @Override
      public String getSubscriptionId() {
        return this.subscriptionId;
      }
    }
    
  3. Использование учетных данных для создания субъекта службы с использованием Java SDK

        azureAuthClient = Azure.configure().authenticate(credentialProvider.getCredentials());
    
        final ServicePrincipal servicePrincipal = 
            azureAuthClient.servicePrincipals()
            .define(clusterId)
            .withNewApplication("http://easycreate.azure.com/" + clusterId)
              .definePasswordCredential("sppass")
              .withPasswordValue("StrongPass!12")
              .attach()
            .create();
    
  4. Затемполучить исключение.Я знаю, что мои учетные данные действительны, потому что я могу создать группу ресурсов с помощью sdk и просмотреть ее с помощью веб-консоли Azure.

    com.microsoft.azure.management.graphrbac.GraphErrorException: код состояния 403, {"odata.error": {"code": "Authorization_RequestDenied", "message": {"lang": "en", "value": "Недостаточно прав для завершения операции."}}} в sun.reflect.NativeConstructorAccessorImpl.newInstance0 (собственный метод) в sun.reflect.NativeConstructorAccessorImpl.newInstance (NativeConstructorAccessorImpl.java:62) в sun.reflect.DelegatingConstructorAccessorImpl.newInstance (DelegatingConstructorAccessorImpl.java.ctor.Conf. jav.: 423) в com.microsoft.rest.ServiceResponseBuilder.build (ServiceResponseBuilder.java:122) в com.microsoft.azure.AzureResponseBuilder.build (AzureResponseBuilder.java:56) в com.microsoft.azure.implement.graphagement.ApplicationsInner.createDelegate (ApplicationsInner.java:194) на com.microsoft.azure.management.graphrbac.implementation.ApplicationsInner.access $ 000 (ApplicationsInner.java:45) по адресу com.microsoft.azure.management.graphrbac.implementation.ApplicationsInner $ 2.call (ApplicationsInner.java:181) по адресу com.microsoft.azure.management.graphrbac.implementation.ApplicationsInner $ 2.call (ApplicationsInner.java:177) в rx.internal.operators.OnSubscribeMap $ MapSubscriber.onNext (OnSubscribeMap.java:69) в retrofit2.adapter.rxjava.seliRerponer:CallExecuteOnSubscribe.java:24) в rx.Observable.unsafeSubscribe (Observable.java:10327) в rx.internal.operators.OnSubscribeMap.call (OnSubscribeMap.java:48) в rx.internal.operators.OnSubapMub.Map.: 33) в rx.internal.operators.OnSubscribeLift.call (OnSubscribeLift.java:48) в rx.internal.operators.OnSubscribeLift.call (OnSubscribeLift.java:30) в rx.Observable.unsafeSubscribe (Observable.java:10327) в rx.internal.operators.OnSubscribeMap.call (OnSubscribeMap.java:48)rx.internal.operators.OnSubscribeMap.call (OnSubscribeMap.java:33) в rx.Observable.unsafeSubscribe (Observable.java:10327) в rx.internal.operators.OnSubscribeMap.call (OnSubscribeMap.java:48) в rx..operators.OnSubscribeMap.call (OnSubscribeMap.java:33) в rx.Observable.unsafeSubscribe (Observable.java:10327) в rx.internal.operators.OnSubscribeMap.call (OnSubscribeMap.java:48) в rx.internal.oOnSubscribeMap.call (OnSubscribeMap.java:33) в rx.internal.operators.OnSubscribeLift.call (OnSubscribeLift.java:48) в rx.internal.operators.OnSubscribeLift.call (OnSubscribeLift.java:30) в rx.Observable(Observable.java:10327) в rx.internal.operators.OperatorSubscribeOn $ SubscribeOnSubscriber.call (OperatorSubscribeOn.java:100) в rx.internal.schedulers.CachedThreadScheduler $ EventLoopWorker $ 1.call (CachedThreadScheduler.java:230) на rx.internal.schedulers.ScheduledAction.run (ScheduledAction.java:55) на java.util.concurrent.Executors $ RunnableAdapter.call (Executors.java:511)java.util.concurrent.FutureTask.run (FutureTask.java:266) в java.util.concurrent.ScheduledThreadPoolExecutor $ ScheduledFutureTask.access $ 201 (ScheduledThreadPoolExecutor.java:180)в java.util.concurrent..java: 624) at java.lang.Thread.run (Thread.java:748)

1 Ответ

0 голосов
/ 10 октября 2018

Как я уже говорил, если мы хотим создать servicePrincipal, ресурс должен быть http://graph.windows.net или https://graph.microsoft.com.

. Поэтому нам нужно добавить разрешение для работы с API-интерфейсом Azure AD Graph или API Microsoft Graph..

И не забудьте Grant permission.

Я тестирую его с помощью Azure Active Directory API.Я правильно работаю на своей стороне.

Демонстрационный код:

ApplicationTokenCredentials credentials = new ApplicationTokenCredentials(client,
               tenant,
                key,
                AzureEnvironment.AZURE);

Azure.Authenticated azureAuthClient = Azure.configure().authenticate(credentials);
String clusterId = "xxxxxxx";
ServicePrincipal servicePrincipal =
                azureAuthClient.servicePrincipals()
                        .define(clusterId)
                        .withNewApplication("http://easycreate.azure.com/" + clusterId)
                        .definePasswordCredential("sppass")
                        .withPasswordValue("StrongPass!12")
                        .attach()
                        .create();

enter image description here

...