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

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

Большое спасибо!

33
Gabe 21 Апр 2016 в 19:50

5 ответов

Лучший ответ

Да, они должны войти в wwwroot. В настоящее время нет встроенного способа защиты каталогов wwwroot. Но создать модуль промежуточного программного обеспечения для этого довольно просто. Существует простой в использовании учебник здесь.

Если вы не знакомы с разработкой промежуточного программного обеспечения, я опубликовал проект на GitHub, в котором показано, как создать промежуточное программное обеспечение за три простых шага. Вы можете скачать проект здесь.

Вам не нужен контроллер для доступа к статическим файлам.

29
Bharata 2 Авг 2018 в 23:26

В ядре .net создайте специальный каталог 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): статическая авторизация файлов

10
ahsteele 10 Май 2018 в 16:49

Для проверки аутентификации при получении файла:

        app.UseStaticFiles(new StaticFileOptions()
        {
            OnPrepareResponse = (context) =>
            {
                if (!context.Context.User.Identity.IsAuthenticated && context.Context.Request.Path.StartsWithSegments("/excelfiles"))
                {
                    throw new Exception("Not authenticated");
                }
            }
        });
11
petrosmm 28 Мар 2019 в 23:52

Если у вас есть форма входа (Login.html), простое решение - перенаправить пользователя на страницу входа, если пользователь не прошел аутентификацию и запрашивает защищенный ресурс (файл в / protected папке). В 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();
});
4
Renzo Ciot 5 Сен 2018 в 07:26

Это очень простой пример, но его можно изменить для проверки наличия определенных ролей, а код можно переместить из 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();
               });
2
ahsteele 10 Май 2018 в 16:50