我有一组 Excel 电子表格,我想在我的 ASP.NET 5 网络应用程序中仅向授权用户提供这些电子表格。
- 我应该在哪里存储文件?我假设在wwwroot(例如,wwwroot/files)。
- 如果在 wwwroot 中,如何仅允许授权用户访问?(我想将它们作为控制器的 [授权] FileResult 提供,但这仍然使文件开放,我相信可以通过 URL 直接访问。
- 如何通过控制器中的文件结果操作引用 wwwroot 中的位置?
多谢!
是的,他们应该进入wwwroot
. 目前没有内置方法来保护wwwroot
目录。 但是创建一个中间件模块来完成它非常简单。 这里有一个易于遵循的教程。
如果你不熟悉开发中间件,我发布了一个GitHub项目,展示了如何通过三个简单的步骤创建中间件。 您可以在此处下载该项目。
您不需要控制器即可访问静态文件。
文件时的身份验证检查:
app.UseStaticFiles(new StaticFileOptions()
{
OnPrepareResponse = (context) =>
{
if (!context.Context.User.Identity.IsAuthenticated && context.Context.Request.Path.StartsWithSegments("/excelfiles"))
{
throw new Exception("Not authenticated");
}
}
});
在 .NET Core 中创建与 wwwroot 相同级别的专用目录 www,并使用以下代码:
public HomeController(IHostingEnvironment hostingEnvironment)
{
_hostingEnvironment = hostingEnvironment;
}
[Authorize(Roles = "SomeRole")]
public IActionResult Performance()
{
return PhysicalFile(Path.Combine(_hostingEnvironment.ContentRootPath,
"www", "MyStaticFile.pdf"), "application/pdf");
}
基于以下答案(对于 .netCore):静态文件授权
登录表单 (Login.html),一个简单的解决方案是在用户未通过身份验证并且他请求受保护的资源(/protected 文件夹下的文件)时将用户重定向到登录页面。在"启动.cs"的"配置方法"中,插入以下代码:
app.Use(async (context, next) =>
{
if (!context.User.Identity.IsAuthenticated && context.Request.Path.StartsWithSegments("/protected"))
{
context.Response.Redirect("/Login.html");
return;
}
await next.Invoke();
});
这是一个非常简单的示例,但可以更改它以检查特定角色,并且可以将代码移出 Startup.cs以获得更大的灵活性。
app.Use(async (context, next) =>
{
if (!context.User.Identity.IsAuthenticated
&& context.Request.Path.StartsWithSegments("/excelfiles"))
{
throw new Exception("Not authenticated");
}
await next.Invoke();
});
要保护您的文件并将其提供给经过身份验证的用户,请在"wwwroot"文件夹之外轻松创建一个名为"静态文件"的文件夹。 然后假设你想要恢复用户对某些书籍的访问,所以在"静态文件"下创建一个"书籍"文件夹,然后更新你的"程序.cs"或中间件管道,如下所示:
app.UseAuthentication();
app.UseStaticFiles(new StaticFileOptions
{
OnPrepareResponse = (ctx) =>
{
var context = ctx.Context;
context.Response.Headers.Add("Cache-Control", "no-store");
if (context.Request.Path.Value.StartsWith("/staticfiles/Books"))
{
if (!context.User.Identity.IsAuthenticated)
{
context.Response.Redirect($"{context.Request.Scheme}://{context.Request.Host}{context.Request.PathBase}" + "/Identity/Account/Login");
}
}
},
FileProvider = new PhysicalFileProvider(
Path.Combine(builder.Environment.ContentRootPath, "staticfiles")),
RequestPath = "/StaticFiles",
});
app.UseAuthorization();