Предотвращение прямого доступа, но разрешение загрузки файлов с одной страницы

91
6

Я разрабатываю сайт, на котором есть несколько файлов, которые я хочу загрузить только в том случае, если пользователи имеют достаточный доступ к моим условиям.


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


Проблема, с которой я сталкиваюсь, заключается в том, что я не хочу, чтобы пользователи могли напрямую обращаться к файлу, например, если они перешли на сайт www.mysite.com/downloads/myfile.pdf - я не хочу, чтобы они быть в состоянии получить файл, хотя я хочу, чтобы иметь возможность разрешить им загружать его, как только они вошли в систему, и я проверил, что они выполняют мои собственные правила и правила.


Я собирался сделать это так, но я верю, что с деактивированными разрешениями я не смогу это сделать.


System.IO.FileInfo file = new System.IO.FileInfo(path);
Response.Clear();
Response.AddHeader("Content-Disposition", "attachment; filename=" + file.Name);
Response.AddHeader("Content-Length", file.Length.ToString());
Response.ContentType = "application/octet-stream";
Response.WriteFile(file.FullName);
Response.End();

Можно ли достичь моих целей? Надеюсь, я достаточно объяснил.


Спасибо

спросил(а) 2021-01-19T15:02:03+03:00 9 месяцев, 1 неделя назад
1
Решение
80

Я уверен, что вы на правильном пути.


Вот простой пример:


Response.ContentType = "text/txt";
Response.AppendHeader("Content-Disposition", "attachment; filename=" + "file.txt");
Response.Write(file.ToString());
Response.End();

---- ИЗМЕНИТЬ ----
Есть и другие хорошие образцы:


http://www.dotnetscraps.com/dotnetscraps/post/4-ways-to-send-a-PDF-file-to-the-IE-Client-in-ASPNET-20.aspx


<%@ Page Language="C#" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
protected void Button1_Click(object sender, EventArgs e)
{
Response.ContentType = "application/pdf";
Response.Clear();
Response.TransmitFile("UML.pdf");
Response.End();
}
</script>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head id="Head1" runat="server">
<title>Way 1</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Send PDF" /><br />
<br />
This page will refresh itself with a PDF file opened in the same instance of IE itself.
Users will not get prompted to Save/Open/Cancel the PDF file.</div>
</form>
</body>
</html>

ответил(а) 2021-01-19T15:02:03+03:00 9 месяцев, 1 неделя назад
80

Да. Я сделал то же самое в большом приложении, используя HTTP-модуль. См


Он работает, помещая файлы загрузки в отдельный каталог (в вашем примере - каталог "downloads" ), который может быть выполнен для запуска в виде приложения со своим собственным web.config. Регистрация HTTP-модуля для работы в этом каталоге приведет к тому, что все входящие запросы пройдут через некоторый модуль кода, где вы сможете проверить соответствующие разрешения и предотвратить несанкционированный доступ. Модуль служит механизмом гейткипера, который обеспечивает безопасность, даже если они обходят ваше веб-приложение.

Из статьи Microsoft:


"Типичное использование для HTTP-модулей: Security. Поскольку вы можете проверять входящие запросы, ваш HTTP-модуль может выполнять пользовательскую проверку подлинности или другие проверки безопасности перед запрошенной страницей вызывается веб-служба XML или обработчик."



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

ответил(а) 2021-01-19T15:02:03+03:00 9 месяцев, 1 неделя назад
47

Если вы разрешаете анонимность, пользователь является гостевой, а ASP.NET работает под своими собственными разрешениями. На этой странице указаны минимальные разрешения. Таким образом, ASP.NET может получить доступ к файлу и серверу. У меня есть страница, которая передает идентификатор файла и возвращает файл. Но я использую


Response.TransmitFile(filePath);  

ASPmermations

ответил(а) 2021-01-19T15:02:03+03:00 9 месяцев, 1 неделя назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема