【问题标题】:Creating an Azure CloudStorageAccount from a TokenCredential using a token obtained via Azure MSI使用通过 Azure MSI 获得的令牌从 TokenCredential 创建 Azure CloudStorageAccount
【发布时间】:2020-05-01 22:45:49
【问题描述】:

我正在尝试使用通过 Azure 上的 MSI 生成的访问令牌创建一个CloudStorageAccount,以便在 Serilog Azure Blob 存储接收器中使用。我正在获取令牌并使用以下内容创建帐户

var tokenProvider = new AzureTokenProvider();
var token = await tokenProvider.GetAccessTokenAsync("https://storage.azure.com");
var tokenCredential = new TokenCredential(token);
var storageCredential = new StorageCredential(tokenCredential);
var account = new CloudStorageAccount(storageCredential, "accountnamehere", "core.windows.net", true);

然后我将这个帐户传递给 Serilog `LoggerConfiguration'

Log.Logger = new LoggerConfiguration()
    //other stuff
    .WriteTo.AzureBlobStorage(new JsonFormatter(), account, //other settings)
    .CreateLogger()

但是,这永远不会写入 blob。我的 Azure 帐户直接拥有 Contributor,并从组中继承 Storage Blob Data Contributor。我正在处理的 Azure VM 也有此存储帐户的存储 Blob 数据贡献者。但是,在 dev 中,它使用的凭据是我的。

当我使用 blob 写入的帐户密钥时没有问题,因此我生成 CloudStorageAccount 的方式不正确,或者 Azure 中的权限设置不正确,我只是不确定是哪个。

【问题讨论】:

  • 似乎接收器需要升级到新的 Blob SDK :) 即使您的方法确实有效,令牌也会在一小时后过期,因此不再有效。
  • 如果在您的开发环境中使用您自己的凭据发生此问题,该凭据没有您正在使用的存储帐户的存储 Blob 数据参与者角色,请将此角色添加到您的 Azure 帐户,然后重试。根据我的测试,继承的角色似乎在这里不起作用。
  • @juunas 您可以在创建TokenCredential 时添加令牌刷新回调。也就是说,我已经放弃了这条路线,因为即使设置了权限,我也无法让它工作。
  • 所以因为放不下,所以把上面的代码复制到一个新的asp.net core项目中试了一下。工作得很好。因此,它必须是我的项目中配置奇怪的东西。但是,由于这是第一个运行的代码,我不知道可能是什么错误配置。

标签: c# azure asp.net-core .net-core serilog


【解决方案1】:

如果此问题发生在您的开发环境中使用您自己的凭据,而该凭据没有您正在使用的存储帐户的存储 Blob 数据参与者角色,请将此角色添加到您的 Azure 帐户,然后重试。根据我的测试,继承的角色似乎在这里不起作用。

我已经测试过了,这是我的代码:

using Microsoft.Azure.Storage;
using Microsoft.Azure.Storage.Auth;
using Serilog;
using Serilog.Formatting.Json;
using System;

namespace AzureStorageTest
{
    class Program
    {
        static void Main(string[] args)
        {

            var tokenCredential = new TokenCredential("<access token get from my account 
 whcih has the data contributor role of the stroage account that I am using now>");
            var storageCredential = new StorageCredentials(tokenCredential);

            var account = new CloudStorageAccount(storageCredential, "<my storage account name>", "core.windows.net", true);


            Log.Logger = new LoggerConfiguration().WriteTo.AzureBlobStorage(account).CreateLogger();
            Log.Logger.Error("aaaaa");
            Console.ReadKey();
        }
    }
}

检查我的存储帐户,有一个日志文件:

它的内容:

【讨论】:

  • 即使为我的帐户明确设置了该角色,它仍然无法正常工作,因此它必须是我们的设置阻止它工作的原因。我通过 Key Vault 找到了一个不同的解决方案,老实说,我对此更满意。
  • 这是一些我无法追踪的权限问题。此外,我用于干净测试的空项目正在提取我的 VM 的托管标识,而不是我在 Visual Studio 中设置的 Azure 帐户,这就是它工作的原因。我的 VM 的权限以某种方式正确设置,即使我的 Azure 帐户的权限完全相同。
  • 有点晚了,但是你检查过你的代码在哪里运行了吗?如果 IIS 托管您的代码,则 MSI 帐户不会从 Visual Studio 传递
猜你喜欢
  • 2021-02-04
  • 1970-01-01
  • 1970-01-01
  • 2020-02-25
  • 2020-03-18
  • 1970-01-01
  • 2019-01-22
  • 2019-06-03
  • 1970-01-01
相关资源
最近更新 更多