【发布时间】:2019-11-05 16:38:54
【问题描述】:
我有一个 azure 资源组,其中包含带有 BLOB 容器的 Web 应用服务和存储。我的 Web 应用程序 (.NET Core) 尝试从容器中检索和显示图像。容器对内容没有公共访问权限(访问级别为私有)。我为我的应用程序创建了系统分配的身份,并在存储访问控制 (IAM) 中为其赋予了读者角色。
这是我在应用程序代码中访问 blob 的方式:
const string blobName = "https://storagename.blob.core.windows.net/img/Coast.jpg";
string storageAccessToken = await GetStorageAccessTokenAsync();
var tokenCredential = new TokenCredential(storageAccessToken);
var storageCredentials = new StorageCredentials(tokenCredential);
var blob = new CloudBlockBlob(new Uri(blobName), storageCredentials);
ImageBlob = blob.Uri;
GetStorageAccessTokenAsync() 这样做:
var tokenProvider = new AzureServiceTokenProvider();
return await tokenProvider.GetAccessTokenAsync("https://storage.azure.com/");
然后图片由
显示<img src="@Model.ImageBlob" />
我的代码中没有任何异常,但是来自 BLOB 容器的图像未在浏览器控制台中显示 404 错误(指定的资源不存在)。 当我将容器的访问级别更改为“blob”(公共访问)时,应用程序工作正常并显示图像。 显然,获取凭据部分有问题,但我找不到任何工作示例,也找不到它实际应该如何工作的详细解释。 非常感谢任何帮助。
UDPATE: 感谢所有回复的人。所以,我这里似乎有两个问题。
1) 我没有正确获取凭据。 我可以看到我创建的“AzureServiceTokenProvider”对象(Microsoft.Azure.Services.AppAuthentication)在运行时具有空属性 PrincipalUsed。
我的应用程序部署到 Azure App Service,它具有系统托管标识,并且该标识(服务主体)在 Azure 存储中被授予权限(我按照建议将权限从帐户读取器更改为存储 Blob 数据读取器)。
它不应该从当前上下文中获取所有需要的数据吗?如果没有,我可以在这里做什么?
2) 我使用了错误的方法来显示图像,但是由于该应用程序无论如何都无法访问存储空间,因此我还无法修复它。
但是 - 在我的情况下,常见的方法是什么?我的意思是没有对存储的公共访问,我使用“CloudBlockBlob”来访问图像。
【问题讨论】:
-
在您的 GetAccessTokenAsync() 方法中,请尝试添加第二个参数:TenantId
-
这不起作用,因为您将 url 返回到浏览器。然后从浏览器完成对 blob 的请求,并且您的客户端未经过身份验证。您可以以其他方式流式传输图像或在 url 中返回 sas 令牌,但您需要连接字符串来生成 sas 令牌
-
你有进步吗?
-
谢谢@Thomas,但我的印象是,如果我正在处理本机 azure 应用程序和系统标识,我不需要 SAS 和其他密钥来访问 Azure 资源中的数据。 Azure AD 和 RBAC 应该可以解决问题。如果不是,这是怎么回事?
-
@IvanYang,我从文档中得到 AzureServiceTokenProvider 只能作为输入连接字符串获取,例如“RunAs=App;AppId=AppId;TenantId=TenantId;AppKey=Secret”,我没有 AppKey因为它是系统管理的身份。如果我错了,请纠正我。再说一次,因为我尝试使用 AAD 和 RBAC,所以不需要所有这些。
标签: azure-web-app-service azure-blob-storage azure-managed-identity