У меня есть сайт 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, как это происходит на локальном хосте.
Есть идеи?