2012-01-19 6 views
4

Предположим, у меня действительно простой сайт, где я разрешаю зарегистрированным пользователям загружать файлы. У меня есть пользователь «andrew» с идентификатором 1 и пользователем «матовый» с и ID 2.ASP.NET MVC 3 Простая авторизация сценария для статических файлов

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

/Content/DocRepo/[[ID]]/files_live_here 

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

он не может просто изменить URL, чтобы /Content/DocRepo/2/

+1

Первым шагом может быть использование идентификатора GUID вместо идентификатора. Затем вам нужно будет защитить каждый запрос, кроме того, если вам нужно mroe –

ответ

7

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

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

+0

Подумав об этом, я согласен, что это правильное решение. –

+0

Эй, спасибо, что имеет смысл ... Хотелось бы попробовать и предотвратить запросы в папку/Content/DocRepo /, используя какой-то пользовательский маршрут? – aherrick

+0

Проблема с настройкой веб-конфигурации заключается в том, что она использует проверку подлинности форм и пытается перенаправить их на страницу/login. Я не хочу этого делать. Я бы хотел, чтобы – aherrick

2

Это можно сделать в Global.asax под Application_AuthenticateRequest или Application_BeginRequest. Вы также можете зарегистрировать IHTTPHandeler и выполнить ту же логику, что и Global.asax, которая должна была бы прослушивать запросы для папки DocRepo и выполнять аудиты разрешений пользователей.

Если вы используете ASP.NET MVC, вы можете легко создать действие «Загрузить» на своем контроллере, которое принимает какой-либо идентификатор файла и выполняет вашу проверку. Если вы используете классический ASP.NET, вы создадите страницу, download.aspx, которая принимает уникальный идентификатор (как по предложению Эндрю).

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

return File(...); 
+0

Те будут работать. Я предложил контроллер, так как он уже использует mvc. +1 для других вариантов, во всяком случае! –

+0

Он не указал, что использовал MVC, я обновил свой ответ, включив MVC в качестве опции. Думаю, мы могли бы предположить MVC из структуры URL как маршрут. –

+1

Он сказал, что это был mvc3 в названии. –

Смежные вопросы