Azure 存储帐户拒绝托管服务标识的颁发者

Azure storage account rejects the issuer of a managed service identity

using the Microsoft.Azure.Services.AppAuthentication library (v1.0.3) for .NET 使用托管服务标识从 Azure Function 应用程序连接到 blob 存储。授权码:

var tokenProvider = new AzureServiceTokenProvider();
string accessToken = await tokenProvider.GetAccessTokenAsync("https://storage.azure.com/");
var tokenCredential = new TokenCredential(accessToken);
var credentials = new StorageCredentials(tokenCredential);
var storageUri = new Uri($"https://{accountName}.blob.core.windows.net");
var client = new CloudBlobClient(storageUri, credentials);

无论给定的 RBAC 角色如何,一个现有存储帐户都拒绝接受 MSI:

Microsoft.WindowsAzure.Storage.StorageException: Server failed to authenticate the request.
Make sure the value of Authorization header is formed correctly including the signature.
   at Microsoft.WindowsAzure.Storage.Core.Executor.Executor.ExecuteAsyncInternal[T](RESTCommand`1 cmd, IRetryPolicy policy, OperationContext operationContext, CancellationToken token)
   at Microsoft.WindowsAzure.Storage.Blob.CloudBlobContainer.CreateIfNotExistsAsync(BlobContainerPublicAccessType accessType, BlobRequestOptions options, OperationContext operationContext, CancellationToken cancellationToken)

storageException.RequestInformation.ExtendedErrorInformation.AdditionalDetails 的其他异常详细信息抱怨 AuthenticationErrorDetail: Issuer validation failed. Issuer did not match.

解码失败的 jwt 令牌时,发行者似乎没问题:

{
  "aud": "https://storage.azure.com/",
  "iss": "https://sts.windows.net/<my directory guid>/",
  ...
}

当我创建新的相同设置的存储帐户时,相同的功能应用程序 MSI 和授权代码起作用,甚至令牌中的发行者也完全相同。所以客户端功能应用程序及其 MSI 身份不是这里的罪魁祸首。

为什么这个存储账户授权失败,如何让它接受MSI?

更新: Cross posted to MS forum 以引起 MS 的注意以验证这是否是 azure 错误。

我使用您的授权码进行测试,现有和新创建的存储帐户都接受 MSI。所以我同意 juunas 所说的,这可能是 Azure 存储上的一个错误。

您可以前往 here 提供反馈,让开发人员修复它。

即使在与 MS 核对后,也不清楚是什么原因,但将受影响的订阅移动到另一个 Azure AD 目录似乎已经解决了问题。