【发布时间】:2018-12-10 23:12:50
【问题描述】:
我是 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 的注意。
【问题讨论】:
-
你有 blob 存储容器的访问策略吗?
-
如果颁发者包含连接存储帐户订阅的 AAD 的 ID,那么这听起来像是存储端的错误。记住这是一个预览;)
-
@JoyWang,不,测试容器没有设置访问策略。
-
@juunas 有一个很好的问题:您确定存储帐户位于与 MSI 所在的同一 Azure AD 租户关联的 Azure 订阅中吗?
-
@PhilippeSignoret 是的,它们位于同一个 Azure 目录中。并且存储帐户门户 GUI 可以毫无问题地检测到用于 RBAC 角色分配的 MSI 帐户。
标签: azure azure-active-directory azure-functions azure-blob-storage azure-managed-identity