Как обслуживать статические файлы только для авторизованных пользователей?
У меня есть коллекция электронных таблиц Excel, которые я хотел бы обслуживать в своем веб-приложении ASP.NET 5 только авторизованным пользователям.
- Где я должен хранить файлы? Я предполагаю, что в wwwroot (например, wwwroot/files).
- Если в wwwroot, как разрешить доступ только авторизованным пользователям? (Я хотел бы обслуживать их как [Authorize] FileResult от контроллера, но это все еще оставляет файлы открытыми для прямого доступа через URL-адрес, который, как я полагаю.)
- Как я могу ссылаться на местоположение в wwwroot через действие FileResult в контроллере?
Большое спасибо!
Ответы
Ответ 1
Да, они должны пойти в wwwroot
. В настоящее время нет встроенного способа защиты wwwroot
. Но создание промежуточного модуля для его выполнения довольно просто. Существует легко следовать учебник здесь.
Если вы не знакомы с разработкой промежуточного программного обеспечения, я опубликовал проект GitHub, который показывает, как создать промежуточное программное обеспечение в три простых шага. Вы можете скачать проект здесь.
Вам не нужен контроллер для доступа к статическим файлам.
Ответ 2
.net core создайте выделенный каталог www на том же уровне, что и wwwroot, и используйте следующий код:
public HomeController(IHostingEnvironment hostingEnvironment)
{
_hostingEnvironment = hostingEnvironment;
}
[Authorize(Roles = "SomeRole")]
public IActionResult Performance()
{
return PhysicalFile(Path.Combine(_hostingEnvironment.ContentRootPath,
"www", "MyStaticFile.pdf"), "application/pdf");
}
На основе следующего ответа (для.netCore): авторизация статического файла
Ответ 3
Это очень простой пример, но его можно изменить для проверки определенных ролей, а код можно вывести из 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();
});
Ответ 4
Если у вас есть форма входа в систему (Login.html), простым решением является перенаправление пользователя на страницу входа в систему, если пользователь не аутентифицирован, и он запрашивает защищенный ресурс (файл в папке с защитой). В Startup.cs в методе Configure введите этот код:
app.Use(async (context, next) =>
{
if (!context.User.Identity.IsAuthenticated && context.Request.Path.StartsWithSegments("/protected"))
{
context.Response.Redirect("/Login.html");
return;
}
await next.Invoke();
});
Ответ 5
Для проверки подлинности при получении файла:
app.UseStaticFiles(new StaticFileOptions()
{
OnPrepareResponse = (context) =>
{
context.Context.User.Identity.IsAuthenticated
&& context.Context.Request.Path.StartsWithSegments("/excelfiles"))
{
throw new Exception("Not authenticated");
}
}
});