ASP.NET Core защищает изображения - PullRequest
0 голосов
/ 02 октября 2018

У меня очень простое приложение asp.net core 2.0, и оно выглядит как очень простая проблема, но я не могу найти решение.

В моем приложении хранятся разные частные изображения для таких пользователей, как фотография,копия их идентификатора ... эти изображения, конечно, должны быть конфиденциальными, и только веб-приложение может показать их на определенных страницах.Например, администратор может видеть их при просмотре пользователей в панели администратора, или пользователь может видеть его изображения ...

Файлы находятся в папке "users / 1 / photo.jpg" или "users/243/id.jpg».Конечно, эти папки должны быть приватными, и вы не можете просматривать их.

Как это сделать, когда я использую тег изображения, чтобы увидеть изображение:

<img src="???">

Без показареальный путь, а также предотвращение доступа к этому файлу никому, кроме нужных мне страниц.

Спасибо.

ОБНОВЛЕНИЕ
Прежде всего, благодаря Марку Редману и TS, вы очень помогли.

Наконец, я делаю, чтобы разумные изображения находились за пределами общей папки StaticFiles, а неразумные - в папке wwwroot.

ЧАСТЬ 1. ЧУВСТВИТЕЛЬНЫЕ ИЗОБРАЖЕНИЯ
Дляразумные изображения я использую IActionResult, чтобы вернуть файл, но после того, как я зашифровал имя файла.Это только пример ...

public IActionResult ViewUser(int id)
{
    var model = new Model();
    ....
    model.EncryptedId = _protector.Protect(id.ToString("D6"));

    return View(model);
}

Таким образом, я могу вернуть зашифрованный идентификатор для получения нужного изображения без публикации реального идентификатора.

В моем представлении:

<img src="/home/GetImage?id=@Model.EncryptedId" />

И GetImage будет выглядеть так:

public IActionResult GetImage(string encryptedId)
{
    var decryptedId = _protector.Unprotect(encryptedId);

    var file = Path.Combine(_hostingEnvironment.ContentRootPath, "MyPrivateFiles", decryptedId + ".jpg");

    return PhysicalFile(file, "image/jpeg");
} 

Таким образом, насколько я понимаю:
- я защищаю свои личные файлы, не сохраняя их в общей папкенапример, wwwroot, поэтому никто не может загрузить их напрямую.
- Также никто не может получить идентификатор существующего пользователя и попытаться вызвать мой Action GetImage? id = 232, потому что я зашифровал этот идентификатор.

Другой уровень защиты, который я могу иметь, - это разрешить только определенным пользователям доступ к действию GetImage, например, разрешить пользователям только получать свои изображения или разрешить администраторам загружать любые.

ЧАСТЬ 2. НЕОБРАЗУЕМЫЕ ИЗОБРАЖЕНИЯ
Дляненормальные изображения (такие как общедоступные фотографии пользователей) Я храню их в wwwroot, потому что они нужны мне для публичного использования.

Используя asp-append-version = "true", я могу кэшировать изображения, что является очень хорошим улучшением этого ядра Asp.Net.

Единственное, что мне осталось бы, этозапутайте имена этих изображений, чтобы я не показывал «domain.com/users/1234.jpg» и показывал, например, «domain.com/users/sdfjknkjSD2.jpg".

я не знаюКак это сделать, не теряя преимущества кэширования.Есть ли способ сделать это?

Заранее спасибо.

1 Ответ

0 голосов
/ 03 октября 2018

Лучше не хранить ваши изображения в веб-папках.

это очень простое действие, как-то так ...

[HttpGet]
public FileResult GetImage(string userId, string id)
{
    return File($"{YourRootPath}users/{userId}/{id}.jpg"), "image/jpeg");
}

<img src="/YourController/GetImage/?userId=243&id=123"/>

для ядра .net youможет захотеть сделать это;

public async Task<IActionResult> GetImage(string userId, string id)
 {
        Stream stream = await [get stream here__]

        if(stream == null)
            return NotFound();

        return File(fileStream, "image/jpeg", $"{id}.jpg");
    }   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...