Azure API REST хранилища BLOB - при использовании токена доступа ADAL выдает ошибки 403 и 404 - PullRequest
1 голос
/ 27 марта 2020

Я создал регистрацию приложения в Azure Active Directory и добавил разрешение API для доступа к Azure хранилищу.

Я также создал назначение роли пользователя и приложения следующим образом:

New-AzureADUserAppRoleAssignment -ObjectId $user.ObjectId -PrincipalId $user.ObjectId -ResourceId $servicePrincipal.ObjectId -Id ([Guid]::Empty)

Я предоставил пользователю роль «Участник хранилища BLOB-данных» на портале Azure. Затем я получил токен доступа от этого метода:

public void acquireToken(android.app.Activity activity,
                     String resource,
                     String clientId,
                     @Nullable String redirectUri,
                     @Nullable String loginHint,
                     @NonNull com.microsoft.aad.adal.AuthenticationCallback<com.microsoft.aad.adal.AuthenticationResult> callback)

clientId - это приложение с правами доступа к хранилищу. URI перенаправления - это тот, который я установил для приложения на портале. Я попробовал два идентификатора ресурса. Я отправляю этот токен как заголовок Authentication: Bearer.

Возвращает ошибку "Audience validation failed. Audience did not match", если идентификатор ресурса, который я передаю в acquToken, равен «https: // <> .blob.core. windows. net / "

Возвращает ошибку "The specified container does not exist", если идентификатор ресурса равен" https://storage.azure.com/ ".

Я использую Retrofit для выполнения операции PUT.

public static final String CONTENT_TYPE_TEXT_PLAIN_HEADER = "Content-Type: text/plain; charset=UTF-8";
public static final String X_MS_VERSION = "x-ms-version: 2017-11-09";
public static final String X_MS_DATE = "x-ms-date";
public static final String X_MS_BLOB_CONTENT = "x-ms-blob-content-disposition: attachment; filename=\"fname.ext\"";
public static final String X_MS_BLOB_TYPE = "x-ms-blob-type: BlockBlob";
public static final String X_MS_META_M1 = "x-ms-meta-m1: v1";
public static final String X_MS_META_M2 = "x-ms-meta-m2: v2";

@Headers({CONTENT_TYPE_TEXT_PLAIN_HEADER,
        X_MS_VERSION,
        X_MS_BLOB_CONTENT,
        X_MS_BLOB_TYPE,
        X_MS_META_M1, X_MS_META_M2})
@PUT("/blob1")
Call<Void> putBlob(@Header(AUTHORIZATION) String bearerToken,
                     @Header(X_MS_DATE) String date,
                     @Body String putBody);

1 Ответ

2 голосов
/ 27 марта 2020

Возвращает ошибку «Ошибка проверки аудитории. Аудитория не совпадает», если идентификатор ресурса, который я передаю в acquToken, равен https://<>.blob.core.windows.net/

Удалите этот конечный элемент sh из https://<>.blob.core.windows.net/, теперь оно должно соответствовать тому, что Azure AD ожидает от аудитории.

С https://docs.microsoft.com/en-us/azure/storage/common/storage-auth-aad-app#azure -storage-resource-id -

Azure Идентификатор ресурса хранилища

Идентификатор ресурса AD Azure указывает аудиторию, для которой выданный токен может использоваться для предоставления доступа к ресурсу Azure. В случае Azure Storage идентификатор ресурса может указываться c для одной учетной записи хранения или может применяться к любой учетной записи хранения. В следующей таблице описаны значения, которые вы можете указать для идентификатора ресурса:

https://<account>.blob.core.windows.net

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