Javascript 301重定向到azure存储blob时无意中传递了应用程序凭据

Javascript 301重定向到azure存储blob时无意中传递了应用程序凭据,javascript,azure,asp.net-core,storage,Javascript,Azure,Asp.net Core,Storage,以前在过去的几个月里,我一直通过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-身份

以前在过去的几个月里,我一直通过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-身份验证信息的格式不正确。检查授权标头的值。

    这表明我的Web API承载令牌被无意中传递到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);
    }
    

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

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

  • 用户委派SAS

  • 服务SAS

  • SAS帐户

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


    我相信如果你只是通过SAS并移除持票人代币应该会起作用
    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);
    
    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;
        }
    }