У меня есть приложение MVC 5, которое позволяет пользователям загружать файлы, которые хранятся в базе данных. Для этого я использую метод действия FileContentResult.MVC 5 FileContentResult Действие Результат Разрешение и перенаправление
Я могу ограничить доступ к этому методу во всем приложении, но умный пользователь может определить URL-адрес действия и вставить что-то вроде этого (localhost: 50000/Home/FileDownload? Id = 13) в свой браузер и иметь доступ к загрузите любой файл, просто изменив параметр.
Я хочу ограничить пользователей от этого. Разрешайте только роль администратора и пользователей, у которых есть определенное разрешение, которое может быть определено только вызовом базы данных для загрузки файлов.
Что я ищу, так это то, что если пользователь использует URL-адрес для загрузки файла и не имеет соответствующих разрешений, я хочу перенаправить пользователя с сообщением.
Я хотел бы сделать что-то вроде кода ниже или подобное, но я получаю следующее сообщение об ошибке: Не удается неявно преобразовать тип «System.Web.Mvc.RedirectToRouteResult» до «System.Web.Mvc.FileContentResult»
Я понимаю, что я не могу использовать return RedirectToAction («Index») здесь, просто ищу некоторые идеи о том, как справиться с этой проблемой.
public FileContentResult FileDownload(int id)
{
//Check user has file download permission
bool UserHasPermission = Convert.ToInt32(context.CheckUserHasFileDownloadPermission(id)) == 0 ? false : true;
if (User.IsInRole("Administrator") || UserHasPermission)
{
//declare byte array to get file content from database and string to store file name
byte[] fileData;
string fileName;
//create object of LINQ to SQL class
//using LINQ expression to get record from database for given id value
var record = from p in context.UploadedFiles
where p.Id == id
select p;
//only one record will be returned from database as expression uses condtion on primary field
//so get first record from returned values and retrive file content (binary) and filename
fileData = (byte[])record.First().FileData.ToArray();
fileName = record.First().FileName;
//return file and provide byte file content and file name
return File(fileData, "text", fileName);
}
else
{
TempData["Message"] = "Record not found";
return RedirectToAction("Index");
}
}
Спасибо Сэм! Это отличный ответ, и я буду работать над внедрением атрибута authorize для проверки разрешений. – Cesar