asp.net-core - 使用身份验证在 Blazor 服务器端下载文件
问题描述
我有一个使用默认授权和身份验证的 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 应用下载文件?
解决方案
您的控制器不是控制器。它没有实现Controller
...
[Authorize]
public class FileController : Controller
{
...
}
仅供参考:如果您将下载属性添加到锚点,则文件只会在单击时下载。
<a download href="@CalculateDownloadLink("file.txt")">Download file.txt</a>
如果您需要我发布它,我制作了一个垃圾回购。
推荐阅读
- jquery - 找不到模块:错误:无法解析 webpack 中的“jquery”
- google-bigquery - 关于 google BIGQUERY 计费的字节数的问题
- java - 如何在一个 Spring Boot 应用程序中的不同端口上运行 api-gateway(Netflix Zuul) 和 Eureka Server
- java - 如何以编程方式打开我在 Android 应用程序中创建的文件夹?
- sharepoint-designer - 使用 REST API 过滤共享点列表中的日期
- c# - 可以在 foreach 循环中引发外部事件吗?
- java - 将相同类型的多个列加载为列表
通过 JPA/Hibernate 中的列名模式的字段 - flutter - 如何在 Flutter 应用中设置固定的屏幕尺寸
- javascript - 带有道具的“if/else”语句
- android - 如果没有互联网连接,如何停止将图像上传到云存储