【问题标题】:Azure BLOB storage REST API - using ADAL access token returns 403 and 404 errorsAzure BLOB 存储 REST API - 使用 ADAL 访问令牌返回 403 和 404 错误
【发布时间】:2020-03-27 19:13:14
【问题描述】:

我在 Azure Active Directory 中创建了一个应用注册,并添加了访问 Azure 存储的 API 权限。

我还创建了一个用户和应用角色分配,如下所示:

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

我在 Azure 门户中为用户提供了存储 Blob 数据参与者角色。然后我从这个方法获得了一个访问令牌:

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 是我在门户中为应用程序设置的。我尝试了两个资源 ID。我将该令​​牌作为 Authentication: Bearer 标头发送。

如果我传递给acquireToken的资源ID是“https://.blob.core.windows.net/”,它会返回错误"Audience validation failed. Audience did not match"

如果资源 ID 为“https://storage.azure.com/”,则返回错误"The specified container does not exist"

我正在使用 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);

【问题讨论】:

    标签: android azure azure-active-directory azure-blob-storage adal


    【解决方案1】:

    如果我传递给acquireToken的资源ID是https://&lt;&gt;.blob.core.windows.net/,则返回错误“受众验证失败。受众不匹配”

    https://&lt;&gt;.blob.core.windows.net/ 中删除尾部斜杠,它现在应该符合 Azure AD 对受众的期望。

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

    Azure 存储资源 ID

    Azure AD 资源 ID 指示为其颁发的令牌可用于提供对 Azure 资源的访问权限的受众。对于 Azure 存储,资源 ID 可能特定于单个存储帐户,也可能适用于任何存储帐户。下表描述了您可以为资源 ID 提供的值:

    https://&lt;account&gt;.blob.core.windows.net

    【讨论】:

    • 谢谢,但我现在收到“找不到容器”。容器确实存在。这是完整的 URL mystorageaccount.blob.core.windows.net/mycontainer/blob1
    • 在将 URL 传递给 putBlob() 之前是否检查过 URL?对吗?
    • 是的。我直接从 Azure 门户中容器的“属性”页面复制了它。
    • 您显示的代码没有引用任何容器,只是 @PUT("/blob1")。你如何形成完整的 URL?
    • 这实际上是我的错误。我的网址放错地方了。它现在正在工作。我现在会接受你的回答。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2023-02-02
    • 1970-01-01
    • 2019-11-08
    • 2017-12-15
    • 1970-01-01
    • 2017-02-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多