У меня очень простое приложение 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".
я не знаюКак это сделать, не теряя преимущества кэширования.Есть ли способ сделать это?
Заранее спасибо.