.NET C #: как обрабатывать истечение срока проверки подлинности с помощью форм во время вызова AJAX

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

Обычный случай:

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

Время ожидания истекло.

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

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

Спасибо.


person MegaMatt    schedule 21.01.2011    source источник


Ответы (2)


поэтому действие 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();
}
person Omu    schedule 22.01.2011
comment
Спасибо за ответ. К сожалению, к моменту перенаправления .NET на страницу входа Request.IsAjaxRequest () возвращает false. Возможно, новый запрос создается, когда .NET понимает, что время аутентификации истекло, и решает нажать loginURL. - person MegaMatt; 23.01.2011
comment
@Mega Matt, это, вероятно, потому, что вы используете mvc1. Все вызовы AJAX, выполняемые jQuery, будут иметь заголовок, указывающий, что это AJAX. Заголовок для проверки - X-Requested-With, и значение будет XMLHttpRequest, когда это вызов AJAX. Попробуйте отладить и найдите Request.Headers [X-Requested-With] - person Omu; 23.01.2011
comment
У меня нет X-Requested-With в Request.Headers. У меня есть Connection, Keep-Alive, Accept, Accept-Charset, Accept-Encoding, Accept-Language, Cookie, Host, Referrer и User-Agent. Честно говоря, я не ожидал увидеть заголовок, связанный с запросами AJAX, если Request.IsAjaxRequest () возвращает false. Я предполагаю, что это все еще может быть связано со мной, используя MVC 1? - person MegaMatt; 24.01.2011
comment
@Mega Matt atm Я думаю либо mvc 1, либо версия jQuery - person Omu; 24.01.2011
comment
Ому, определенно особенность MVC 1. У меня был коллега, который попробовал то же самое при использовании MVC 2, и true возвращается из IsAjaxRequest. Придется обновиться. Спасибо. - person MegaMatt; 04.02.2011

 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
}

});

person Dhruv Patel    schedule 25.08.2016