【发布时间】: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