.NET C #: как обрабатывать истечение срока проверки подлинности форм во время вызова AJAX - PullRequest
3 голосов
/ 22 января 2011

Для контекста у меня в web.config установлено значение времени ожидания для проверки подлинности с помощью форм, и я использую ASP.NET MVC 1. Я думаю, что было бы проще всего сформулировать мою проблему в виде двух вариантов использования - первое, что происходит без тайм-аута аутентификации, и второе, что происходит с тайм-аутом аутентификации:

Нормальный случай:

Пользователь входит в приложение, и таймер аутентификации начинает тикать. Пока период аутентификации остается в силе, пользователь щелкает что-то на странице, что вызывает вызов AJAX (через jQuery). Мы попадаем на сервер, обрабатываем запрос и возвращаем пользователю частичное представление (как ActionResult). Html проходит как строка в методе успеха ajax, и я беру этот html и вставляю его в div на странице. Это все ожидаемо.

Тайм-аут:

Пользователь входит в приложение, и таймер аутентификации начинает тикать. По истечении времени x срок аутентификации истекает. По истечении времени истечения пользователь нажимает на странице что-то, что вызывает вызов AJAX (с использованием jQuery). Мы попали на сервер, но срок аутентификации истек. .NET автоматически перенаправляет на значение loginURL, определенное в том же элементе web.config, который устанавливает период ожидания. Для меня эта страница является страницей входа в систему, где пользователю предлагается ввести имя пользователя / пароль для входа в систему. Таким образом, выполняется действие Home/Login Controller и, в конечном итоге, возвращается полный (не частичный) просмотр обратно в виде строки html в Метод успеха Аякса. Это заставляет страницу бомбить, потому что я пытаюсь взять html полной страницы (с тегами <html> и всем) и вставить его в div на странице.

Так в этом и заключается моя проблема. Когда срок аутентификации истек, и .NET перенаправляет меня на страницу входа в систему, я возвращаю полный HTML-код страницы в метод успеха ajax. Конечно, все работает нормально, когда попадание на сервер не является вызовом AJAX - оно прекрасно перенаправляется на страницу входа. Но как я могу справиться с этим делом? У кого-нибудь есть идеи?

Спасибо.

Ответы [ 2 ]

0 голосов
/ 25 августа 2016
 public class BasicAuthenticationAttribute : ActionFilterAttribute, IAuthenticationFilter
{
    public void OnAuthentication(AuthenticationContext filterContext)
    {
        var user = filterContext.HttpContext.User;
        if (user == null || !user.Identity.IsAuthenticated)
        {
            if (filterContext.HttpContext.Request.IsAjaxRequest())
            {
                filterContext.Result = new JsonResult
                {
                    JsonRequestBehavior = JsonRequestBehavior.AllowGet,
                    Data = new { redirectTo = FormsAuthentication.LoginUrl }
                };
            }
            else
            {
                filterContext.Result = new HttpUnauthorizedResult();
            }
        }
    }
    public void OnAuthenticationChallenge(AuthenticationChallengeContext filterContext)
    {
        //  throw new NotImplementedException();
    }
}

, а затем вы можете использовать следующим образом

$.get('/foo', function(result) {
if (result.redirectTo) {
    window.location.href = result.redirectTo;
} else {
    // standard stuff
}

});

0 голосов
/ 22 января 2011

, поэтому действие Account / Login выполняется после истечения срока действия билета

public Action Login()
{
   if(Request.IsAjaxRequest())
   return Content(@"<meta http-equiv="refresh" content="1" />");
   //if it is ajax request the div will be filled with this meta tag which will refresh the page


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