C# 使用通过Azure MSI获得的令牌从令牌凭据创建Azure CloudStorageAccount

C# 使用通过Azure MSI获得的令牌从令牌凭据创建Azure CloudStorageAccount,c#,azure,asp.net-core,.net-core,serilog,C#,Azure,Asp.net Core,.net Core,Serilog,我正在尝试使用通过Azure上的MSI生成的访问令牌创建CloudStorageAccount,以在Serilog Azure Blob存储接收器中使用。我正在获取一个令牌并使用以下命令创建帐户 var tokenProvider = new AzureTokenProvider(); var token = await tokenProvider.GetAccessTokenAsync("https://storage.azure.com"); var tokenCredential = ne

我正在尝试使用通过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。My Azure帐户既有直接参与者,也从组继承存储Blob数据参与者。我正在处理的Azure VM也有此存储帐户的存储Blob数据贡献者。然而,在dev中,它使用的凭据是我的


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

如果使用您自己的凭据在您的开发环境中发生此问题,并且您使用的存储帐户没有存储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();
        }
    }
}
使用Microsoft.Azure.Storage;
使用Microsoft.Azure.Storage.Auth;
使用Serilog;
使用Serilog.Formatting.Json;
使用制度;
名称空间AzureStorageTest
{
班级计划
{
静态void Main(字符串[]参数)
{
var tokenCredential=新的tokenCredential(“

其内容:


似乎接收器需要升级到新的Blob SDK:)即使您的方法确实有效,令牌也会在一小时后过期,因此不再有效。如果此问题发生在您的开发环境中,您使用的凭据没有您正在使用的存储帐户的存储Blob数据贡献者角色,请将此角色添加到您的Azure帐户中,然后重试。根据我的测试,继承的角色似乎无效这里不起作用。@juunas您可以在创建
TokenCredential
时添加一个令牌刷新回调。也就是说,我已经放弃了这个路由,因为即使设置了权限,我也无法让它工作。因此,因为我不能让它走,我将上面的代码复制到一个新的asp.net核心项目中,并尝试了它。工作正常。因此,它已经成功了在我的项目中进行了奇怪的配置。但是,由于这是第一个运行的代码,我不知道可能存在什么错误配置。即使为我的帐户明确设置了该角色,它仍然不起作用,因此一定是我们的设置阻止了它的工作。我通过ugh Key Vault,老实说,我更喜欢它。这是一些我无法追踪的权限问题。此外,我用于清洁测试的空项目正在提取我的虚拟机的托管标识,而不是Visual Studio中的Azure帐户设置,这就是为什么它可以工作的原因。我的虚拟机的权限以某种方式设置正确,尽管我的Azure帐户的权限完全相同。有点晚了,但您是否检查了代码的运行位置?如果IIS托管您的代码,则不会从Visual Studio传递MSI帐户