2013-01-11 3 views
0

FormsAuthenticationTicket을 사용하여 웹 사이트에서 C#을 사용하여 세션을 만듭니다.키 누르기 또는 마우스 이벤트시 티켓 갱신

은 FormsAuthenticationTicket에 대한 티켓 코드는

FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1, 
                   model.UserName, 
                   DateTime.Now, 
                   DateTime.Now.AddMinutes(30), 
                   false, 
                   admin.Role); 
string encTicket = FormsAuthentication.Encrypt(ticket); 
Response.Cookies.Add(new HttpCookie(FormsAuthentication.FormsCookieName, encTicket) { Expires = ticket.Expiration }); 
웹 사이트의 모든 부분은 Site.Master을 상속

다음과 같습니다, 그래서 Site.Master

$(document).ready(function() { 
    $(window).bind('mousemove mouseclick keydown mousewheel', idle); 
}); 

function idle(e) { 
    if (window.idleTimeout) { 
     clearTimeout(window.idleTimeout); 
    } 
    <%= FormsIdentity identity = (FormsIdentity)HttpContext.Current.User.Identity; %> 
    <%= FormsAuthentication.RenewTicketIfOld(identity.Ticket); %> 
    window.idleTimeout = setTimeout(userIdle, 900000); 
} 
function userIdle() { 
    //either do stuff here or trigger the "idle" event 
    $(window).trigger('idle'); 
} 
에이 라인 사이에 무언가를 추가하고 싶어

이것은 작동하지 않습니다. FormsIdentity는 "System.Web.Security를 ​​사용하여"수행 할 수 없기 때문에 사용할 수 없습니다. 이리.

키 누르기 및 마우스 이벤트와 같은 이벤트에서 티켓을 새로 고치는 데 사용할 수있는 비슷한 논리가 있습니까?

FYI : 웹 사이트의 다른 부분으로 이동해도 티켓이 만료되지 않으므로 문제가되지 않습니다. 사람들이 양식 완성에 40 분을 사용하고 나서 제출하고 모든 진전을 잃어 버릴 때만. 물론 시간 제한을 늘릴 수는 있지만 이것이 내가하고 싶은 것이 아닙니다.

답변

0

당신은 쿠키를 갱신하기 위해 서버에 AJAX 요청을 보낼 수 있습니다 :

function idle(e) { 
    if (window.idleTimeout) { 
     clearTimeout(window.idleTimeout); 
    } 
    $.ajax({ 
     url: '<%= Url.Action("RenewCookie") %>', 
     type: 'POST' 
    }); 
    window.idleTimeout = setTimeout(userIdle, 900000); 
} 

다음 서버에 당신이 필요한 단계를 수행하는 컨트롤러 액션이있을 것이다. 그러나 모든 단일 키 스트로크 또는 마우스 휠에 대한 AJAX 요청으로 서버를 공격하면 엄청난 피해를 입을 수 있습니다.

+0

서버에 부담을 줄 수있는 다른 제안 사항이 있습니까? 클라이언트 쪽에서 할 수 있습니까? – Totty

+0

아니요, 폼 인증 쿠키를 갱신하는 유일한 방법은 서버에 요청을 보내는 것입니다. 따라서 적은 수의 요청을 수행하려는 경우 클라이언트의 이벤트 목록을 유지 관리하고 정기적 인 간격으로이 목록에 이벤트가 있는지 확인하고 단일 AJAX 요청 만 보냅니다. –

관련 문제