Как обслуживать статические файлы только для авторизованных пользователей?

У меня есть коллекция электронных таблиц Excel, которые я хотел бы обслуживать в своем веб-приложении ASP.NET 5 только авторизованным пользователям.

  1. Где я должен хранить файлы? Я предполагаю, что в wwwroot (например, wwwroot/files).
  2. Если в wwwroot, как разрешить доступ только авторизованным пользователям? (Я хотел бы обслуживать их как [Authorize] FileResult от контроллера, но это все еще оставляет файлы открытыми для прямого доступа через URL-адрес, который, как я полагаю.)
  3. Как я могу ссылаться на местоположение в 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");
        }
    }
});