Как заставить свой код статуса работать? Или Как решить эту проблему, используя встроенный http код состояния? - PullRequest
0 голосов
/ 14 июля 2011

У меня есть сайт asp.net mvc 3, работающий локально, и все работает нормально. Я загружаю его на свой общий хостинг, и мой код, который должен следить за тайм-аутом сеанса, не работает.

У меня есть это в моем web.config

 <authentication mode="Forms">
      <forms loginUrl="/Account"
                      protection="All"
                      name=".MySite"
                      path="/"
                      requireSSL="false"
                      slidingExpiration="true"
                      defaultUrl="default.aspx"
                      cookieless="UseDeviceProfile"
                      enableCrossAppRedirects="false"
                       timeout="1"
                       />
    </authentication>

Так что у меня есть это в моем файле web.config, чтобы сделать время ожидания. Я установил таймаут через 1 минуту, чтобы выполнить тестирование, когда они вошли в свою учетную запись и оставляют или ничего не делают.

Так что теперь все это будет работать, если бы 90% моего сайта не было AJAX. Когда пользователь останавливается и выполняет запрос AJAX, он переходит к методу индекса моего контроллера учетной записи (что такое страница входа в систему), но, поскольку это запрос AJAX, он загружает всю страницу входа в систему и выдает его, например, во вкладку Jquery, пытаясь загрузить .

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

Так вот почему я придумал это решение.

Как только перенаправление происходит в аутентификации форм, оно переходит к методу Index

 [HttpGet]
    public ActionResult Index()
    {
        string returnUrl = HttpContext.ApplicationInstance.Request.QueryString["ReturnUrl"];

        // check to see if the user got redirected. Only 2 possibilities session timed out or they where not authenticated in the first place.
        if (!String.IsNullOrEmpty(returnUrl))
        {
            Response.StatusCode = 900;
        }

        return View();
    }

Затем в моей настройке ajax я наблюдаю за этим кодом состояния.

   statusCode:
            {
                900: function ()
                {
                    window.location = "/Account?SessionTimeOut=Yes";
                }
            }
        });

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

var sessionTimeOut = $.url().param("SessionTimeOut");

if (sessionTimeOut == "Yes") 
{
      alert("timeout");
}

Как я уже сказал, это работает на локальном хосте. Я использую пользовательский код состояния вместо 401, потому что он запрашивает диалоговое окно, запрашивающее у пользователя повторную аутентификацию. Я использую openId, поэтому у них нет пароля. Так что этот диалог запутает пользователя.

Когда я загружал на сервер, мне приходилось добавлять это

  <httpErrors>
      <error statusCode="900" subStatusCode="-1" prefixLanguageFilePath="" path="/Account" responseMode="Redirect" />
  </httpErrors>

Начиная с того, что я обнаружил, если кто-то вводил URL-адрес на страницу с проверкой подлинности, когда он не прошел проверку подлинности (например, http: /mysite.com/controller/authenticationNeededPage)

Это поместило бы этот код состояния 900 и IIS 7.5, я думаю, я не знал, что делать с этим пользовательским кодом состояния, так как он не знал, куда перенаправить.

когда пользователь останавливается, хотя на моем живом сайте код 900 игнорируется. Я наблюдаю за запросом ajax, который загружает вкладку, и он должен иметь код состояния 900, но он возвращает перенаправление 302.

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

Есть идеи?

1 Ответ

0 голосов
/ 14 июля 2011

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

[HttpGet]
public ActionResult Index()
{
    string returnUrl = HttpContext.ApplicationInstance.Request.QueryString["ReturnUrl"];

    // check to see if the user got redirected. Only 2 possibilities session timed out or they where not authenticated in the first place.
    if (!String.IsNullOrEmpty(returnUrl))
    {
        Response.AppendHeader("X-LOGIN-PAGE", "true");
    }
    return View();
}

и теперь на стороне вашего клиента:

$.ajaxSetup({
    complete: function(jqXHR, textStatus) {
        if (jqXHR.getResponseHeader('X-LOGIN-PAGE') === 'true') {
             // We have gone through the Login method => the session 
             // might have expired
             window.location = "/Account?SessionTimeOut=Yes";
        };
    }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...