C# Azure托管标识本地调试身份验证失败

C# Azure托管标识本地调试身份验证失败,c#,azure,azure-storage,azure-managed-identity,C#,Azure,Azure Storage,Azure Managed Identity,我有一个非常基本的例子,我似乎无法工作。我使用的用户是订阅所有者,因此应该可以访问所有内容。如果我在它尝试实际获取blob文本时运行以下命令,即当它失败时: StorageException:服务器无法验证请求。确保 授权标头的值已正确形成,包括 签名 使用Microsoft.Azure.Services.AppAuthentication; 使用Microsoft.WindowsAzure.Storage.Auth; 使用Microsoft.WindowsAzure.Storage.Blob;

我有一个非常基本的例子,我似乎无法工作。我使用的用户是订阅所有者,因此应该可以访问所有内容。如果我在它尝试实际获取blob文本时运行以下命令,即当它失败时:

StorageException:服务器无法验证请求。确保 授权标头的值已正确形成,包括 签名

使用Microsoft.Azure.Services.AppAuthentication;
使用Microsoft.WindowsAzure.Storage.Auth;
使用Microsoft.WindowsAzure.Storage.Blob;
使用制度;
使用系统线程;
使用System.Threading.Tasks;
命名空间TestMsisStorageAccess
{
班级计划
{
公共静态void Main()
{
AzureServiceTokenProvider AzureServiceTokenProvider=新的AzureServiceTokenProvider();
var tokenAndFrequency=TokenRenewalerAsync(azureServiceTokenProvider,
CancellationToken.None).GetAwaiter().GetResult();
TokenCredential TokenCredential=新的TokenCredential(tokenAndFrequency.Token,
令牌同步,
azureServiceTokenProvider,
tokenAndFrequency.Frequency.Value);
StorageCredentials StorageCredentials=新的StorageCredentials(令牌凭证);
var storageUri=新Uri(“https://mystorageaccount.blob.core.windows.net");
var client=新的CloudBlobClient(storageUri、storageCredentials);
var container=client.GetContainerReference(“bob”);
字符串内容=container.GetBlockBlobReference(“bob.xml”).DownloadTextAsync().Result;
WriteLine($“Got{content}”);
}
专用静态异步任务令牌更新同步(对象状态,CancellationToken CancellationToken)
{
常量字符串StorageResource=”https://storage.azure.com/";
var authResult=await((AzureServiceTokenProvider)状态);
var next=(authResult.ExpiresOn-DateTimeOffset.UtcNow)-TimeSpan.FromMinutes(5);
如果(next.Ticks<0)
{
next=默认值(TimeSpan);
}
返回新的NewTokenAndFrequency(authResult.AccessToken,下一步);
}
}
}
不确定我在这里做错了什么,我已经检查了它试图使用的用户,该用户看起来是正确的,并且具有正确的AD租户ID:

我看到有人提到用UTCNow在我的本地机器上检查时间,并用GMT时间确认它是正确的,只是我没有发现关于如何调试它的任何其他信息


感谢订阅所有者的任何帮助数据访问。
您需要向用户添加存储blob参与者或存储blob读取器角色

谢谢,我有点懊恼我错过了那个细微差别!同样值得注意的是,注册更改可能需要一到两分钟,如果您更改了它,那么立即尝试它,它不一定会工作,所以请给它一分钟时间。
using Microsoft.Azure.Services.AppAuthentication;
using Microsoft.WindowsAzure.Storage.Auth;
using Microsoft.WindowsAzure.Storage.Blob;
using System;
using System.Threading;
using System.Threading.Tasks;

namespace testmsistorageaccess
{
    class Program
    {
        public static void Main()
        {
            AzureServiceTokenProvider azureServiceTokenProvider = new AzureServiceTokenProvider();
            var tokenAndFrequency = TokenRenewerAsync(azureServiceTokenProvider,
                                                        CancellationToken.None).GetAwaiter().GetResult();

            TokenCredential tokenCredential = new TokenCredential(tokenAndFrequency.Token,
                                                                    TokenRenewerAsync,
                                                                    azureServiceTokenProvider,
                                                                    tokenAndFrequency.Frequency.Value);

            StorageCredentials storageCredentials = new StorageCredentials(tokenCredential);

            var storageUri = new Uri("https://mystorageaccount.blob.core.windows.net");
            var client = new CloudBlobClient(storageUri, storageCredentials);
            var container = client.GetContainerReference("bob");
            string content = container.GetBlockBlobReference("bob.xml").DownloadTextAsync().Result;
            Console.WriteLine($"Got {content}");
        }

        private static async Task<NewTokenAndFrequency> TokenRenewerAsync(Object state, CancellationToken cancellationToken)
        {
            const string StorageResource = "https://storage.azure.com/";
            var authResult = await ((AzureServiceTokenProvider)state).GetAuthenticationResultAsync(StorageResource);
            var next = (authResult.ExpiresOn - DateTimeOffset.UtcNow) - TimeSpan.FromMinutes(5);
            if (next.Ticks < 0)
            {
                next = default(TimeSpan);
            }
            return new NewTokenAndFrequency(authResult.AccessToken, next);
        }
    }
}