javascript - 301 重定向到 Azure 存储 Blob 无意中传递了应用凭据
问题描述
在过去的几个月里,我一直在通过来自 azure Web API 的 301 重定向来提供 azure blob。授权客户端可以通过不记名令牌访问 Web API。
- 客户端访问 myapp.azurewebsites.net/api/file/2
- webapp 为 blob 存储中的文件生成一个 SASS url
- webapp 将 SASS url 作为 301 重定向返回
- 客户端的浏览器遵循这一点并透明地下载文件。
然而,最近重定向后,Azure Blob Api 出现了一个错误:
InvalidAuthenticationInfo - Authentication information is not given in the correct format. Check the value of Authorization header.
这表明我的 Web API 的 Bearer 令牌被无意中传递到 blob 存储,检查 chrome 中的网络选项卡,它确实将凭据传递到 azure blob 存储。
有没有办法让存储 API 忽略不记名令牌,而只在 url 中使用 SASS 密钥?或者有没有办法防止 301 重定向将凭据泄漏到另一个域?
ASP.Net 核心:
[HttpGet]
public async Task<ActionResult> GetContent(string id)
{
//var sassUri = https://myblob.blob.core.windows.net/TEST?sv=2020-04-08&se=2021-04-07T13%3A16%3A15Z&sr=b&sp=r&sig=4WBAkWx
var sassURI = await _fileService.GetSASSForFileIdAsync(id);
return new RedirectResult(sassURI, true);
}
Javascript:
const myHeaders = new Headers();
myHeaders.append('Content-Type', 'application/json');
myHeaders.append('Authorization', 'bearer 607cd0a9-6048'); //token for myapp
let resp = await fetch('https://myapp.azurewebsites.net/file/2',{ method: 'GET', headers: myHeaders});
//Network tab shows credentials are being leaked to myblob.blob.core.windows.net
console.log(resp);
解决方案
当然,您可以使用 SAS URL 请求存储 API,请参见此处。
Azure 存储支持三种类型的共享访问签名:
用户委托 SAS
服务 SAS
账户 SAS
例如,使用以下方法为 blob 容器创建服务GenerateSasUri
SAS :
private static Uri GetServiceSasUriForContainer(BlobContainerClient containerClient,
string storedPolicyName = null)
{
// Check whether this BlobContainerClient object has been authorized with Shared Key.
if (containerClient.CanGenerateSasUri)
{
// Create a SAS token that's valid for one hour.
BlobSasBuilder sasBuilder = new BlobSasBuilder()
{
BlobContainerName = containerClient.Name,
Resource = "c"
};
if (storedPolicyName == null)
{
sasBuilder.ExpiresOn = DateTimeOffset.UtcNow.AddHours(1);
sasBuilder.SetPermissions(BlobContainerSasPermissions.Read);
}
else
{
sasBuilder.Identifier = storedPolicyName;
}
Uri sasUri = containerClient.GenerateSasUri(sasBuilder);
Console.WriteLine("SAS URI for blob container is: {0}", sasUri);
Console.WriteLine();
return sasUri;
}
else
{
Console.WriteLine(@"BlobContainerClient must be authorized with Shared Key
credentials to create a service SAS.");
return null;
}
}
推荐阅读
- r - 如果索引值接近另一个 df 中的索引,有没有办法从 df 中提取数据?
- kubernetes - 无法访问在 RPI 上运行的 K8 集群中的 NGINX nodePort 服务
- c# - 如何获取网址?
- javascript - 在 Nodejs 中使用 Lua 脚本的 Redis mget
- awk - 如何使用 AWK 从文件中读取并输出到 html 表
- react-native - Expo Eject 可在 iOS 上运行,但不能在 Android 上运行
- angular - 如何在 ag-grid cellRendererParams 动作中显示鼠标悬停的文本
- python-3.x - 对分隔值应用查找并重新加入熊猫
- oracle - 使用循环比较 PL/SQL 表中单列的值
- java - 简化 java 流以查找重复属性