ASP.NET: как определить время ожидания аутентификации - PullRequest
8 голосов
/ 09 декабря 2010

Я видел несколько статей вроде этой , в которых объясняется, как определить, что время сеанса пользователя истекло. И для ясности, эти статьи ссылаются на значение тайм-аута, определенное этой строкой web.config:

<sessionState mode="InProc" cookieless="UseDeviceProfile" timeout="120" />

Не слишком вдаваться в этот метод, но это включает проверку того, что Session.IsNewSession истинно и что сессионный cookie уже существует. Но я не видел ни одной статьи о том, как обнаружить аутентификацию тайм-аут - ту, которая определена в этой строке web.config:

<authentication mode="Forms">
    <forms loginUrl="~/Home/Customer" timeout="60" name=".ASPXAUTH" requireSSL="false" slidingExpiration="true" defaultUrl="~/Home/Index" cookieless="UseDeviceProfile" enableCrossAppRedirects="false"/>
</authentication>

В нескольких статьях в Интернете, включая в этом сообщении SO , говорилось, что значение времени ожидания сеанса обычно должно быть в два раза больше значения времени ожидания аутентификации. Итак, прямо сейчас, как указано выше, мой сеанс равен 120, а моя аутентификация - 60. Это означает, что я никогда не попаду в ситуацию, когда время сеанса истекло, но пользователь все еще проходит проверку подлинности; если время ожидания пользователя истекло, это будет связано с аутентификацией, а не сессией.

Так что, как и всем, меня интересует, как сообщить пользователю, что время его сеанса истекло (но на самом деле это будет связано с таймаутом Аутентификации). Кто-нибудь знает способ достижения этого или какие-либо ресурсы в Интернете, которые могут указать мне на решение?

Ответы [ 3 ]

1 голос
/ 09 декабря 2010

Я бы использовал http-конвейер в начале запроса и отправил соответствующий ответ.
Мой источник ответов на такие вопросы:

Профессиональная безопасность ASP.NET 2.0, членство и рольУправление

Модуль HTTP может помочь:

Web.config:

<configuration>
  <system.web>
    <httpModules>
      <add name="MyAuthModule" type="MyAssembly.Security.MyAuthModule, MyAssembly"/>

...

Действительный модуль HTTP:

/// <summary>
/// A module for detecting invalid authentication 
/// </summary>
/// <remarks>See "How To Implement IPrincipal" in MSDN</remarks>
public class MyAuthModule : IHttpModule
{
    #region IHttpModule Members
    void IHttpModule.Dispose() { }
    void IHttpModule.Init(HttpApplication context)
    {
        context.AuthenticateRequest += new EventHandler(context_AuthenticateRequest);
    }
    #endregion


    /// <summary>
    /// Inspect the auth request...
    /// </summary>
    /// <remarks>See "How To Implement IPrincipal" in MSDN</remarks>
    private void context_AuthenticateRequest(object sender, EventArgs e)
    {
        HttpApplication a = (HttpApplication)sender;
        HttpContext context = a.Context;

        // Extract the forms authentication cookie
        string cookieName = FormsAuthentication.FormsCookieName;
        HttpCookie authCookie = context.Request.Cookies[cookieName];

        if (authCookie != null)
        {
            FormsAuthenticationTicket authTicket = FormsAuthentication.Decrypt(authCookie.Value);
            // check if previously authenticated session is now dead
            if (authTicket != null && authTicket.expired)
            {
               // send them a Response indicating that they've expired.
            }
        }
    }
}

Удачи!

1 голос
/ 09 декабря 2010

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

1 голос
/ 09 декабря 2010

Это, вероятно, не оптимальный подход, но вот кое-что, о чем я подумал.

При входе в систему записывайте метку времени в отметке сеанса при входе пользователя в систему. При каждом последующем запросе (возможно, в глобальном.asax BeginRequest?), сравните эту временную метку с текущим временем и сопоставьте ее с таймаутом аутентификации (Скотт Хансельман объясняет, как читать его здесь ).

Это моя "верхняя частьмоя голова "все равно думала ...

...