在 PCF 中使用容器 运行 的托管标识访问 Azure Blob 存储

Using Managed Identities for containers running in PCF to access Azure Blob Storage

我想知道是否可以通过容器 运行 在 Azure 的 Pivotal Cloud Foundry 中使用托管身份访问 blob 存储,比如系统分配的托管身份,或者我需要使用服务主体对象。任何帮助表示赞赏。 早些时候我们通过在代码中编写 URL 来使用 SAS,但想使用 Azure AD 在容器内对我们的 API 应用程序 运行 进行身份验证。那么实现这一目标的最佳方法是什么

在 Pivotal Cloud Foundry 中,您无法使用托管身份 (MSI) 进行身份验证,当使用 MSI 进行身份验证时,它实际上会对 azure 实例元数据端点进行 API 调用以获取访问令牌,然后使用令牌进行身份验证,它仅在 Azure environment support MSI.

中可用

在这种情况下,最好的做法是使用您提到的服务主体进行身份验证,请按照以下步骤操作。

1.Register an application with Azure AD and create a service principal.

2.Get values for signing in and create a new application secret.

3.Navigate 到门户中的存储帐户 -> Access Control (IAM) -> 将 Storage Blob Data Contributor/Storage Blob Data Owner 角色分配给服务主体,如下所示。

4.The 使用下面的 java 代码,做一个快速测试,在我的示例中,我列出了容器中的所有 blob,只是根据您的要求做其他事情,替换你的值来自第 2 步。

pom.xml:

<dependency>
    <groupId>com.azure</groupId>
    <artifactId>azure-identity</artifactId>
    <version>1.2.0</version>
</dependency>
<dependency>
    <groupId>com.azure</groupId>
    <artifactId>azure-storage-blob</artifactId>
    <version>12.11.0-beta.1</version>
</dependency>

代码:

import com.azure.identity.ClientSecretCredential;
import com.azure.identity.ClientSecretCredentialBuilder;
import com.azure.storage.blob.BlobContainerClient;
import com.azure.storage.blob.BlobServiceClient;
import com.azure.storage.blob.BlobServiceClientBuilder;
import com.azure.storage.blob.models.BlobItem;

public  class vacate {
    public static void main(String[] args) {
        String clientId="xxxxxx";
        String clientSecret="xxxxxx";
        String tenantId="xxxxxx";

        ClientSecretCredential credential1 = new ClientSecretCredentialBuilder()
                .tenantId(tenantId)
                .clientId(clientId)
                .clientSecret(clientSecret)
                .build();

        BlobServiceClient storageClient = new BlobServiceClientBuilder()
                .endpoint("https://joystoragev2.blob.core.windows.net")
                .credential(credential1)
                .buildClient();

        BlobContainerClient containerClient = storageClient.getBlobContainerClient("tescon1");
        System.out.println("\nListing blobs...");

        for (BlobItem blobItem : containerClient.listBlobs()) {
            System.out.println("\t" + blobItem.getName());
        }
    }
}

有关详细信息,请参阅 Quickstart: Manage blobs with Java v12 SDK

更新:

如果您想要一种用户交互的方式来进行身份验证,只需使用这些方式 - Authenticating Users 而不是 ClientSecretCredential

实际上,SDK 中不同的身份验证方式在 Azure AD 中使用不同的身份验证流程,例如ClientSecretCredential使用client credential flow, it is a non-interactive way, DeviceCodeCredential uses device code flow,是用户交互方式。

要在您的案例中使用这些用户交互方式,您需要导航到门户中的 AD 应用程序 -> 添加 Azure storage 的委派权限 user_impersonation

suppose a particular user should have only read access to the Blob Endpoint and another user might have full CRUD access to the Blob Endpoint, how this will be determined when the user calls this API from a front end application?

是的,这可以通过上面添加的delegated permission来实现。当用户使用auth方式登录AD App时,App会让用户同意user_impersonation权限,同意后(用户的AAD租户需要允许用户自行同意),广告应用程序将获得用户的许可,然后代表用户进行操作。总之,app的权限来源于用户,不同的用户有不同的权限,那么app就会有不同的权限。

所以在你的情况下,只需像上面的第 3 步一样在存储帐户中添加具有不同角色的用户。对于读取访问,只需添加 Storage Blob Data Reader,对于 CURD 访问,添加 Storage Blob Data Contributor/Storage Blob Data Owner,然后使用上面的用户交互方式,它将起作用。