我有一个 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”来访问图像。