2016-09-21 6 views
6

У меня есть приложение ASP.Net MVC 5, использующее Identity 2 для аутентификации (с использованием стандартного промежуточного программного обеспечения для cookie, настроенного с использованием ExpireTimeSpan = 30 минут и SlidingExpiration = true).Проверьте, не был ли пользователь по-прежнему регистрироваться без сброса тайм-аута авторизации

У меня установленная аутентификация истекает через 30 минут, и мне нужно проверить с клиентской стороны, если пользователь все еще выполнил вход. Я мог бы сделать для этого простой вызов AJAX, но он обновит мой сеанс и сбросит тайм-аут, чего я хочу избежать. Использование 30-минутного тайм-аута в Javascript будет работать только в том случае, если у клиента есть только одна вкладка, открытая в моем приложении, что я не могу гарантировать.

Я думал о добавлении настраиваемого атрибута к действию, которое могло бы проверить, действительно ли проверка подлинности действительна, но без сброса таймаута. Есть ли способ сделать это?

В качестве альтернативы, это, вероятно, также может быть выполнено с помощью промежуточного программного обеспечения OWIN, но опять же, я не знаю, как проверить аутентификацию без сброса таймаута.

+0

На самом деле то, что вы собираетесь делать после обнаружения пользователь вошел в систему или нет? –

+0

Идея заключалась в том, чтобы перенаправить пользователя на другую страницу. – Riokmij

+0

Итак, если пользователь не зашел в систему, вы перейдете на какую-либо страницу. Я прав? –

ответ

1

Вот функция, которую я использую, чтобы выполнить подвиг, хотя я использую только MVC 4. Я просто назову его через timed ajax post. Я использую его, чтобы определить, как долго мне нужно настроить мой приуроченный вызов ajax, поэтому я возвращаю оставшееся количество секунд.

<OutputCache(NoStore:=True, Duration:=0)> _ 
    Function GetExpirySeconds() As ActionResult 
     Dim tkt As FormsAuthenticationTicket = Nothing 
     Dim retVal As ActionResult = Json("expired") 
     Response.Cookies.Remove(FormsAuthentication.FormsCookieName) 
     If Request.Cookies(FormsAuthentication.FormsCookieName) IsNot Nothing AndAlso Request.Cookies(FormsAuthentication.FormsCookieName).Value <> "" Then 
      tkt = FormsAuthentication.Decrypt(Request.Cookies(FormsAuthentication.FormsCookieName).Value) 
      retVal = Json(Math.Floor((tkt.Expiration - Now).TotalSeconds)) 
      If Math.Floor((tkt.Expiration - Now).TotalSeconds) <= 0 Then retVal = Json("expired") 
     End If 
     Return retVal 
    End Function 

Blog Post for Reference: Kobi's Blog

+0

Уточнение: Прошло довольно много времени с момента написания, но если память служит мне, удаление файла cookie из ответа поражает меня как ключ. – Steve

+0

Я не использую проверку подлинности форм, но Asp.Net Identity, поэтому это решение не применимо в моем случае. – Riokmij

+0

Извините, я пропустил часть вашего вопроса, которая упомянула Identity. Я не знаком с технологией. Похоже, что сервер все еще обновляет файл cookie и возвращает его клиенту в ответ. Нет ли способа предотвратить это? – Steve