Аутентификация с помощью rbac Основные причины службы 403 Не удалось выполнить проверку аудитории.Аудитория не совпадает - PullRequest
0 голосов
/ 05 апреля 2019

Аутентификация с помощью rbac Основные причины службы 403 Ошибка проверки аудитории. Аудитория не соответствует

Я пытаюсь предоставить приложению доступ к контейнеру хранилища BLOB-объектов, но с минимальными необходимыми разрешениями (чтение / запись)

Используя лазурное окно, я предпринял следующие шаги, чтобы попытаться это сделать:

az group create -l ${LOCATION} -n ${RESOURCE_GROUP_NAME}

az role definition create --role-definition rw-blob-role.json

rw-blob-role.json:
{
  "assignableScopes": [
    "/subscriptions/{{SUBSCRIPTION_ID}}"
  ],
  "description": "Custom role to allow for read and write access to Azure Storage blob containers and data",
  "name": "{{APP_RW_ROLE_NAME}}",
  "permissions": [
    {
      "actions": [
        "Microsoft.Storage/storageAccounts/blobServices/containers/read",
        "Microsoft.Storage/storageAccounts/blobServices/containers/write"
      ],
      "dataActions": [
        "Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read",
        "Microsoft.Storage/storageAccounts/blobServices/containers/blobs/write"
      ],
      "notActions": [],
      "notDataActions": []
    }
  ],
  "type": "Microsoft.Authorization/roleDefinitions"
}


az ad sp create-for-rbac --name ${AZ_SERVICE_PRINCIPAL_NAME} --password ${APP_CLIENT_SECRET}

az role assignment delete --assignee ${AZ_SERVICE_PRINCIPAL_NAME} --role Contributor

az role assignment create --assignee ${AZ_SERVICE_PRINCIPAL_NAME} --role ${APP_RW_ROLE_NAME}

az storage account create --name ${STORAGE_ACCOUNT_NAME} --resource-group ${RESOURCE_GROUP_NAME} --location ${LOCATION} --kind BlobStorage --sku ${STORAGE_ACCOUNT_SKU} --access-tier ${STORAGE_ACCOUNT_ACCESS_TIER}

az storage container create --name ${BLOB_STORAGE_CONTAINER} --account-name ${STORAGE_ACCOUNT_NAME} --public-access off

Из этого я сохраняю следующие свойства для использования моим приложением:
- TENANT_ID = "$ (показ аккаунта az --output tsv --query tenantId)"
- CLIENT_ID = "$ (список объявлений - spn $ {AZ_SERVICE_PRINCIPAL_NAME} --output tsv --query [0] .appId)"
- Секрет клиента: $ {APP_CLIENT_SECRET}
- Ресурс: $ {AZ_SERVICE_PRINCIPAL_NAME}
- Имя учетной записи хранения: $ {STORAGE_ACCOUNT_NAME}
- Имя контейнера: $ {BLOB_STORAGE_CONTAINER}

Используя com.microsoft.azure:adal4j, я получаю токен:

public AuthenticationResult getToken() {
    ExecutorService service = Executors.newFixedThreadPool(1);
    ClientCredential credential = new ClientCredential(CLIENT_ID, APP_CLIENT_SECRET);
    String authorityTenantUrl = String.format(https://login.microsoftonline.com/%s/oauth2/token, TENANT_ID);

    AuthenticationContext context;
    AuthenticationResult result;
    try {
      context = new AuthenticationContext(authorityTenantUrl, true, service);
      Future<AuthenticationResult> future = context.acquireToken(AZ_SERVICE_PRINCIPAL_NAME, credential, null);
      result = future.get();
    } catch (Exception e) {
      throw new RuntimeException(e);
    } finally {
      service.shutdown();
    }

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

    return result;
}

Используя accessToken из AuthenticationResult и com.microsoft.azure:azure-storage-blob, я пытаюсь получить большой двоичный объект:

TokenCredentials credential = new TokenCredentials(accessToken);
HttpPipeline pipeline = StorageURL.createPipeline(credentials, new PipelineOptions());
ServiceURL serviceURL = new ServiceURL("https://STORAGE_ACCOUNT_NAME.blob.core.windows.net", pipeline);
ContainerURL containerURL = serviceURL.createContainerURL(BLOB_STORAGE_CONTAINER);
BlockBlobURL blobURL = containerURL.createBlockBlobURL(identifier);
ByteBuffer byteBuffer = FlowableUtil.collectBytesInBuffer(blobURL.download().blockingGet().body(new ReliableDownloadOptions())).blockingGet();

Это вызывает исключение StorageException:

<Error>
  <Code>AuthenticationFailed</Code>
  <Message>Server failed to authenticate the request. Make sure the value of Authorization header is formed correctly including the signature.</Message>
  <AuthenticationErrorDetail>Audience validation failed. Audience did not match.</AuthenticationErrorDetail>
</Error>

Я почти уверен, что проблема в том, что AZ_SERVICE_PRINCIPAL_NAME передан adal4j на acquToken (), но я понятия не имею, каково правильное значение. Я пытался использовать CLIENT_ID и другие свойства для AD арендатора и принципала обслуживания.

1 Ответ

1 голос
/ 08 апреля 2019

Вы должны использовать https://storage.azure.com/ для значения Ресурса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...