首页 > 解决方案 > 301 重定向到 Azure 存储 Blob 无意中传递了应用凭据

问题描述

在过去的几个月里,我一直在通过来自 azure Web API 的 301 重定向来提供 azure blob。授权客户端可以通过不记名令牌访问 Web API。

  1. 客户端访问 myapp.azurewebsites.net/api/file/2
  2. webapp 为 blob 存储中的文件生成一个 SASS url
  3. webapp 将 SASS url 作为 301 重定向返回
  4. 客户端的浏览器遵循这一点并透明地下载文件。

然而,最近重定向后,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);

标签: javascriptazureasp.net-corestorage

解决方案


当然,您可以使用 SAS URL 请求存储 API,请参见此处

在此处输入图像描述

Azure 存储支持三种类型的共享访问签名:

  1. 用户委托 SAS

  2. 服务 SAS

  3. 账户 SAS

例如,使用以下方法为 blob 容器创建服务GenerateSasUriSAS :

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;
    }
}

推荐阅读