Azure存储帐户拒绝发行方提供托管服务身份

时间:2018-12-10 23:12:50

标签: azure azure-active-directory azure-functions azure-storage-blobs azure-msi

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和auth代码可以工作,甚至令牌中的发行者也完全相同。因此,客户端功能应用及其MSI身份并不是此处的罪魁祸首。

为什么这个存储帐户无法授权以及如何使其接受MSI?

更新Cross posted to MS forum引起MS的注意,以验证这是否是天蓝色的错误。

2 个答案:

答案 0 :(得分:0)

我将使用您的身份验证代码进行测试,并且现有和新创建的存储帐户均接受MSI 。因此,我赞成juunas所说的话,这可能是Azure存储上的错误。

您可以转到here提出反馈,以使开发人员对其进行修复。

答案 1 :(得分:0)

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