2014-07-27 3 views
0

У меня есть веб-приложение, основанное на MVC4, и у меня есть форма, которая отправляет (через сообщение в действие) многократные файлы на сервер, теперь я разрешаю разрешить доступ только к авторизованным пользователям.MVC 4 || идентичность || Как отключить отправку формы для неавторизованного пользователя?

Моя проблема в том, что я поставил [Authorize] перед действием «Поведение» в контроллере, поэтому файлы сначала загружаются на сервер, а неавторизованный пользователь получает сообщение для входа (перенаправление пользователя на страницу регистрации/входа) ,

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

Любая идея, как я могу это сделать? не

+0

отправьте ваш контрольный код здесь .. –

ответ

1

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

Загрузка файла, как и любое другое значение POST, в котором оно отправляется как часть запроса. Теперь у вас может быть асинхронный (ajax) элемент управления загрузкой файлов, но даже в этом случае загрузка файла - это еще один простой запрос.

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

Несомненно, вы должны иметь [Authorize] перед своим действием POST. Но чтобы пользователи не тратили время на загрузку файла, только чтобы отклонить его на POST, вы также должны сделать что-то в пользовательском интерфейсе, чтобы препятствовать или не позволять пользователям легко делать такой запрос, когда они не аутентифицируются.

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

Один простых, что вы можете сделать, это проверка на User.Identity.IsAuthenticated и отображение формы, когда истинная:

@if (User.Identity.IsAuthenticated) 
{ 
    // display form razor 
} 
else 
{ 
    // display login razor 
} 

Вы также мог бы перехватывать представление с JavaScript, который является более глубоким внедрением, но в основном будет идти что-то вроде это:

  1. на представить, проверьте, если проверка подлинности пользователя (может включать серверный вызов на лету или вы можете рассчитывать на клиента, чтобы определить это, если это уместно)
  2. Если не проверяется подлинностью, не допускается подача и вместо этого показывать модем мода

Надеюсь, что это поможет.

0

Нет вы делаете что-то не так в другом месте, просто использовать Authorize атрибут как:

[Authorize] 
[HttpPost] 
public ActionResult YourController() 
{ 
    return View(); 
} 

Для неавторизованного пользователя он будет показывать сообщение войти в систему и перенаправлять пользователя в регистр/страницы входа

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