具有身份验证的Blazor服务器端下载文件

时间:2020-06-30 14:10:32

标签: asp.net-core blazor-server-side

我有一个使用默认授权和身份验证的Blazor服务器端Web应用程序。

app.UseAuthentication()
app.UseAuthorization()

我可以使用以下方式保护自己的页面

@attribute [Authorize]

我有一个具有匿名访问权限的登录页面以进行身份​​验证。效果很好。

现在,我需要一种让用户从此授权页面下载文件的方法。令人惊讶的是,我还没有找到任何简单的方法来完成此操作。

一种解决方法是使用文件名作为路径参数来构建API控制器,并为用户提供指向它的链接。

[Route("api/[controller]")]
public class FileController{

  [HttpGet("download/{filename}")]
  public async Task<IActionResult> Download([FromRoute] string filename){
  
    //Do some checks and get file from Filesystem

    return file;
  }
}

在.razor文件中

<a href="@CalculateDownloadLink("file.txt")" target="_blank"></a>

private string CalculateDownloadLink(string filename){
  return $"{NavigationManager.BaseUri}/api/file/download/{filename}"
}

这是一个愚蠢的版本。实际上,文件名是通用的。这也可以。

现在,我想向API控制器添加身份验证,因为我不希望任何人猜测文件名。但是我不知道如何。

当然,[Authorize]属性不起作用,因为代码不在电路范围内。 我不知道如何使用任何内置的授权来完成这项工作。

是否有更好的方式从Blazor应用程序下载文件?

2 个答案:

答案 0 :(得分:0)

回答您的问题有点晚,但控制器上的 [Authorize] 应该可以工作。你试过吗?控制器方法获取与 Blazor 页面相同的 cookie。

但是有一种更好的方法可以从 Blazor 下载文件而无需导航。请参阅此blog post

答案 1 :(得分:0)

您的控制器不是控制器。它没有实现 Controller...

[Authorize]
public class FileController : Controller
{
    ...
}

仅供参考:如果您将下载属性添加到锚点,则文件只会在点击时下载。

<a download href="@CalculateDownloadLink("file.txt")">Download file.txt</a>

如果你需要我发布它,我制作了一个垃圾仓库。