Аутентификация службы хранилища Azure с использованием идентификатора, назначенного системой из Функций Azure

Я хочу использовать удостоверение, назначенное системой из Функций Azure, для проверки подлинности и чтения из учетной записи хранения. У меня есть следующий код для .NET. Я искал эквивалентный код на Java. Заранее спасибо.

public static class Function1
{
    [FunctionName("WebHook-Func")]
    public static async Task<IActionResult> Run(
        [HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req,
        ILogger log)
    {
        log.LogInformation("C# HTTP trigger function processed a request.");

        var azureServiceTokenProvider = new AzureServiceTokenProvider();
        string accessToken = await azureServiceTokenProvider.GetAccessTokenAsync("https://storage.azure.com/");
        TokenCredential creds = new TokenCredential(accessToken);

        log.LogInformation($"Token: {accessToken}");

        StorageCredentials storageCreds = new StorageCredentials(creds);

        try
        {
            CloudBlobClient client = new CloudBlobClient(new StorageUri(new Uri("https://<storageAccount>.blob.core.windows.net")), storageCreds);
            CloudBlobContainer container = client.GetContainerReference("fltd");
            CloudBlockBlob blob = container.GetBlockBlobReference("shopping.txt");

            string content = await blob.DownloadTextAsync();

            return (ActionResult)new OkObjectResult($"File contents: {content}");
        }catch(Exception ex)
        {
            return new BadRequestObjectResult($"Exception when calling web hook: {ex.StackTrace} {ex.Message}");
        }
    }
}

person sai n    schedule 31.07.2020    source источник
comment
код кажется правильным. С какой проблемой вы столкнулись?   -  person Thiago Custodio    schedule 31.07.2020
comment
@ThiagoCustodia, я ищу эквивалентную реализацию Java для этого.   -  person sai n    schedule 31.07.2020
comment
Есть ли у вас другие проблемы? Если у вас нет других проблем, пожалуйста, примите это как ответ?   -  person Jim Xu    schedule 04.08.2020


Ответы (1)


Если вы хотите получить доступ к BLOB-объекту Azure в функции Azure с идентификацией, назначенной системой, выполните следующие действия.

  1. Создать функцию Azure

  2. Включить функцию, назначенную системой Identity  введите описание изображения здесь

  3. Назначьте роль (участник данных большого двоичного объекта хранилища) для MSI на уровне учетной записи хранения  введите описание изображения здесь введите описание изображения здесь

  4. SDK

 <dependency>
            <groupId>com.microsoft.azure</groupId>
            <artifactId>azure-client-authentication</artifactId>
            <version>1.7.5</version>
        </dependency>

        <dependency>
            <groupId>com.microsoft.azure</groupId>
            <artifactId>azure-storage</artifactId>
            <version>8.6.5</version>
        </dependency>
  1. Код
 public HttpResponseMessage run(@HttpTrigger(name = "req",methods = {HttpMethod.GET, HttpMethod.POST},authLevel = AuthorizationLevel.ANONYMOUS) HttpRequestMessage<Optional<String>> request, ExecutionContext context) throws URISyntaxException, StorageException, IOException {
        context.getLogger().info("Java HTTP trigger processed a request.");
        AppServiceMSICredentials msiCredentials = new AppServiceMSICredentials(AzureEnvironment.AZURE);
        String token = msiCredentials.getToken("https://storage.azure.com/");
        context.getLogger().info("000000000000" + token);
       
        String accountName = "jimtestdiag924";
        StorageCredentialsToken credentials = new StorageCredentialsToken(accountName, token);
        CloudStorageAccount account = new CloudStorageAccount(credentials, true);
        CloudBlobClient client = account.createCloudBlobClient();
        CloudBlobContainer container = client.getContainerReference("testupload");
        CloudBlockBlob blob = container.getBlockBlobReference("hello.txt");
        String content = blob.downloadText();
        return request.createResponseBuilder(HttpStatus.OK).body("The file content :" + content).build();
    }

введите описание изображения здесь

person Jim Xu    schedule 03.08.2020