2016-09-02 3 views
0

Интро

Я строю WebAPP для клиента с помощью ASP.NET MVC в C#.POSTING Ajax форма, используя [Авторизовать] атрибут после того, как пользователь выходит из системы ASP.NET

У меня есть форма Ajax в модальном окне, которое отправляется, когда пользователь нажимает кнопку.

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

Скажем, действие контроллера форма вывешивает взоры как этот (псевдо-код, просто пример):

[Authorize] 
public ActionResult DoAjaxThings(string field, string anotherfield) 
{ 
    // ... do things 
    if (success) 
    { 
     return Json(new { success = true }); 
    } 
    else 
    { 
     return Json(new { success = false, error = "Something went wrong" }); 
    } 
} 

Как вы можете видеть, что я вернуть объект JSON обратно с success собственности и error, если необходимо.

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

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

Если ошибка не удалась и исправлена ​​ошибка, ошибка div заполняется сообщением об ошибке, которое я отправляю обратно. Звучит довольно просто ..


Сценарий

Допустим сеанс пользователя маркер только длится 15 минут - и раздвижными (каждый новый запрос сбрасывает его (не обязательно жизненно важное значение для вопроса)). Они не используют опцию «запомнить меня».

Если они простаивают/сидят на странице более, чем на выделенное время, то токен заканчивается.

Очевидно, что к этому моменту их токен сеанса истек, и им нужно будет снова войти в систему.

Обычное поведение будет происходить при навигации по действиям контроллера [Authorize]: возврат пользователя на страницу входа в систему с помощью строки запроса ReturnUrl=xyz.


Представьте Это

Итак, вернемся к Ajax формы модального в.

Пользователь был на странице в течение 15 минут, и их токен истек.

Они нажимают на кнопку, чтобы выполнить [Authorize] d действие ...

метод действий не выполняется, а WebApp возвращает редирект на страницу входа в систему.

Но то, что возвращается через этот вызов Ajax, является страницей ENTIRE Login.И, видя, что нет success, функция обратного вызова получает переадресацию, которая выкалывает страницу входа - все в это маленькое крошечноеdiv.

Вам не нужно, чтобы я говорил вам, что это выглядит грязным отвратительным.


Вопрос

ясно видеть, что WebApp реализует атрибут [Authorize] и что пользователь выходит из системы.

Я не могу ударить по любым точкам останова внутри Action, потому что [Authorize] берет и перенаправляет автоматически.

Итак, что я прошу это:

Как я могу обойти/преодолеть/решить этот вопрос с [Authorize], которые инициированы первым и блок кода Действие не выполняется?

Ваши добрые предложения, ответы и общее руководство оценены, как всегда.

+0

проверить этот ответ [перенаправляет для входа, если несанкционированного вызова AJAX] (http://stackoverflow.com/questions/5258721/authorize-attribute-and-jquery-ajax-in -asp-net-mvc) – CyberNinja

ответ

2

Вы можете удалить атрибут [Авторизовать], проверить авторизацию в методе контроллера (if (User.Identity.IsAuthenticated)) и вернуть клиенту подходящую ошибку, если пользователь не авторизовался.

+0

Спасибо @ Joe! - В какой-то момент я об этом подумал. Есть ли какие-либо последствия для использования этого способа? Или дело в том, что '[Authorize]' использует ту же проверку, только выше; следовательно, не ударяя по методу? Я попробую, когда вернусь в свой офис :) –

+0

Работал! Большое вам спасибо @ Джо. Не могли бы вы мне сказать; это в основном такая же проверка, что '[Authorize]' использует в отражении выше? Я не думаю, что есть какие-то последствия, не так ли? –

+1

@ GeoffJames - да, это та же проверка, и никаких реальных последствий нет. – Joe

0

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

public class ApiAuthAttribute : AuthorizeAttribute 
    { 
    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
    { 

     if (!filterContext.HttpContext.User.Identity.IsAuthenticated) 
     { 
      if (filterContext.HttpContext.Request.IsAjaxRequest()) 
      { 
       var urlHelper = new UrlHelper(filterContext.RequestContext); 
       filterContext.HttpContext.Response.StatusCode = 403; 
       filterContext.Result = new JsonResult 
       { 
        Data = new 
        { 
         Error = "NotAuthorized", 
         LogOnUrl = urlHelper.Action("AccessDenied", "Login") 
        }, 
        JsonRequestBehavior = JsonRequestBehavior.AllowGet 
       }; 
      } 
      else 
      { 
       base.HandleUnauthorizedRequest(filterContext); 
      } 
     } 



    } 

} 

проверить этот ответ redirects to login if unauthorized ajax call

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