2010-12-09 8 views
8

this one과 같이 사용자 세션이 시간 초과되었음을 감지하는 방법을 설명하는 여러 기사를 보았습니다. 그리고 명확성을 위하여,이 기사는이 Web.config의 라인에 의해 정의 된 시간 제한 값을 참조하고 있습니다 :ASP.NET : 인증 시간 초과를 감지하는 방법

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

너무 많은 그 방법으로 얻을 수 있지만,이 Session.IsNewSession 사실하고 있다는 것을 확인하는 것을 포함 할 수 없음 세션 쿠키가 이미 있습니다. 하지만 인증 타임 아웃을 감지하는 방법에 대한 기사를 보지 못했다 -이 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> 

여러 기사 온라인, this SO post을 포함하여 세션 시간 초과 값이해야 일반적으로 인증 시간 초과 값의 두 배가됩니다. 그래서 지금과 같이 위와 같이 내 세션은 120이고 인증은 60입니다. 즉, 세션 시간이 초과되었지만 사용자는 여전히 인증 된 상태가되지 않습니다. 사용자가 시간 초과하면 세션이 아닌 인증으로 인한 것입니다.

다른 모든 사람들처럼, 세션 시간이 초과되었다는 사실을 사용자에게보고하는 방법에 관심이 있습니다. (실제로는 인증 제한 시간 때문일 것입니다.) 누구든지이 작업을 수행 할 수있는 방법을 알고 있거나 솔루션 리소스를 제공 할 수있는 온라인 리소스를 알고 있습니까?

+0

죄송합니다. 조금 혼란 스럽습니다. 시간 초과를 감지하는 방법이나 시간 초과를 감지 한 사용자에게보고하는 방법에 문제가 있습니까? – Ender

+1

시간 초과를 감지하는 방법을 알게되면 사용자에게보고하는 것이 간단해야합니다. 나는 그것을보고하는 방법보다 타임 아웃을 감지하는 방법에 훨씬 더 관심이있다. –

+0

사용자가 로그인 페이지로 리디렉션 될 때 인증 실패 또는 권한 부여 실패 사이의 차이점을 말할 수 없기 때문에 이것으로도 어려움을 겪었습니다. - http://stackoverflow.com/questions/1352501/detecting-forms-authentication-timeout-in-login-page – RyanW

답변

1

이것은 아마도 최적의 방법은 아니지만 여기에 제가 생각한 것입니다.

로그인시 사용자가 로그인 할 때마다 세션 표시에 타임 스탬프를 기록하십시오. 이후의 각 요청 (예 : global.asax BeginRequest?)에서이 시간 소인과 현재 시간을 비교하고이를 인증과 대조하십시오 타임 아웃 (Scott Hanselman explains how to read it here). 어쨌든 생각 내 "내 머리의 오프 최고"의

...

1

은 일찍 요청의 HTTP 파이프 라인을 활용하고 apporpriate 응답을 보낼 것입니다. 이러한 질문에 대답하기위한
내 소스는 다음과 같습니다

의 Web.config :

Professional ASP.NET 2.0 Security, Membership, and Role Management

HTTP 모듈 트릭 할 수

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

을 ...

실제 HTTP Modu 제작 :

/// <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. 
      } 
     } 
    } 
} 

행운을 빕니다!

+0

이것은 매우 유망 해 보이고, 나는 그것을 시도했다. 하지만 내 인증 기간이 만료되면 "authCookie"가 제공 한 코드에서 null 인 것 같습니다. 그래서 "Expired"속성이 어떻게 될지 궁금합니다. authCookie가 null이 아니고 만료 될 수있는 방법이 있습니까? 감사. –

+0

@ mega-matt : 사실 일 가능성이 큽니다. 그러나 그것은 당신의 목적에 중요합니까? 파이프 라인 초기에 인증 쿠키가 없으면 만료 된 인증 "세션"도 식별됩니다. 브라우저는 만료 된 쿠키를 반환하지 않습니다. 나는 다른 목적을 위해 코드를 사용하고 있었지만 HTTP Pipleline을 활용하는 것이 매우 강력한 기술이라는 것을 알게되었습니다. – Brett

+0

맞습니다. 인증 쿠키가 없다는 것은 일반적으로 인증 기간이 만료되었음을 의미합니다. 쿠키가 만들어지기 전에는 어떨까요? 제공 한 코드는 쿠키가 설정되기 전에 실행됩니다. 따라서 사용자가 로그인 할 때 (auth cookie가 생성되지 않음)이 코드는 실행되고 로그인 페이지로 리디렉션을 계속합니다 (만료 된 인증 상황에서 계획 한 내용 임). 따라서 인증 쿠키가 없다는 것은 인증 세션이 만료되었음을 의미 할 수도 있지만 쿠키가 아직 생성되지 않았 음을 의미 할 수도 있습니다. 생각? –

1

사용자를 기록 할 때 세션이 있음을 나타내는 쿠키를 사용자 컴퓨터에 드롭 할 수 있습니다. 세션이 만료되어 로그인해야하기 때문에 사용자가 로그인 페이지에 도달하면 사용자에게 해당 쿠키가 있는지 확인하고 예상 한 세션 키가 있는지 확인합니다 (어려울 경우, 로그인 할 때 세션 변수를 설정하십시오). 쿠키가 있지만 세션 키가 없으면 세션이 만료됩니다.

+0

나는 과거에도이 방법을 사용 해왔다. – RyanW

관련 문제