как остановить пользователя не получать файлы, если не войти - PullRequest
3 голосов
/ 15 марта 2011

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

Ответы [ 6 ]

3 голосов
/ 15 марта 2011

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

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

string _fileName;

string _path = /*some user specific path*/ + "FileDir/" + name;

System.IO.FileInfo _file = new System.IO.FileInfo(_path);

if (_file.Exists)

{
    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();
}
3 голосов
/ 15 марта 2011

Если у вас есть все ваши файлы в одной папке, вам нужно всего лишь поместить файл web.config в эту папку со следующим содержимым:

<configuration>
    <system.web>
        <authorization>
            //disallow anonymous users
            <deny users="?"/>
        </authorization>
    </system.web>
</configuration>

Вы можете найти больше деталей здесь .

2 голосов
/ 15 марта 2011

Одно решение: делайте , а не , размещайте ссылку непосредственно на этот файл на вашем сайте и не размещайте эти файлы там, где посетитель может угадать местоположение.

Вместо этого используйте такую ​​ссылку, как"download.aspx? файл = имя файла".Затем в этом файле download.aspx вы можете проверить пользователя и Response.WriteFile этого файла.

(также будет работать Download.ashx)

2 голосов
/ 15 марта 2011

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

http://localhost/filesHandler.ashx?file=pathToFile
2 голосов
/ 15 марта 2011

Если вы используете роли и аутентификацию asp.net, вы можете сделать что-то подобное в своей веб-конфигурации ...

<location path="Admin">
  <system.web>
    <authorization>
      <allow roles="Administrator" />
      <deny users="?" />
    </authorization>
  </system.web>
</location>
0 голосов
/ 15 марта 2011

Просто, вам нужно проверить, авторизован ли пользователь, аутентифицирует пользователя на странице загрузки файла Page_Loadесли он аутентифицирован, то разрешите пользователю скачивать файл, иначе нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...