2014-06-13 5 views
3

FormsAuthentication을 사용하여 ASP.net MVC 5 응용 프로그램을 작성하고 있습니다. FormsAuthentication.SetAuthCookie(user.Email, model.RememberMe)을 사용하여 모든 작업을 올바르게 처리했습니다.ASP.net MVC FormsAuthentication 쿠키가 누락되었습니다.

그러나 사용자 지정 티켓을 만들어서 티켓의 UserData 필드에 몇 가지 추가 정보를 저장할 수있었습니다. 이렇게하면 티켓을 만들어 쿠키에 저장하는 방법입니다.

var ticket = new FormsAuthenticationTicket(1, user.Email, DateTime.Now, DateTime.Now.AddMinutes(FormsAuthentication.Timeout.Minutes), model.RememberMe, user.AuthToken); 
var encryptedTicket = FormsAuthentication.Encrypt(ticket); 
var cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket) { Domain = FormsAuthentication.CookieDomain, Path = FormsAuthentication.FormsCookiePath, HttpOnly = true, Secure = FormsAuthentication.RequireSSL }; 
HttpContext.Response.Cookies.Add(cookie); 

이렇게하면 암호화 된 티켓이 만들어져 브라우저로 전송됩니다. 필자는 개발자 도구와 Fiddler와 함께 브라우저에 티켓이 있고 이후 요청에서 서버로 다시 전송되었음을 확인했습니다.

하지만 이제 인증이 끊어졌습니다. 또한 Application_AuthenticateRequest 또는 Application_PostAuthenticateRequest 이벤트에는 쿠키를 사용할 수 없습니다. 디버거를 사용하여 Context.Request.Cookies을 탐색 할 때 목록에 없습니다.

void Application_BeginRequest(object sender, EventArgs e) 
{ 
    // Auth cookie exists in the collection here! Ticket decrypts successfully 
    HttpCookie authCookie = HttpContext.Current.Request.Cookies[FormsAuthentication.FormsCookieName]; 
    if (authCookie == null) 
     return; 
    var encTicket = authCookie.Value; 
    var ticket = FormsAuthentication.Decrypt(encTicket); 
} 

void Application_AuthenticateRequest(object sender, EventArgs e) 
{ 
    // Auth cookie missing from the cookies collection here! 
    HttpCookie authCookie = HttpContext.Current.Request.Cookies[FormsAuthentication.FormsCookieName]; 
    if (authCookie == null) 
     return; 

    var encTicket = authCookie.Value; 
    var ticket = FormsAuthentication.Decrypt(encTicket); 
    using (var db = new BadgerContext()) 
    { 
     var user = db.Users.OfType<RegisteredUser>().FirstOrDefault(x => x.UserName == ticket.Name); 
     if (ticket.UserData != user.AuthToken) 
     { 
      FormsAuthentication.SignOut(); 
      Response.Redirect(FormsAuthentication.DefaultUrl); 
     } 
    } 
} 

는 그래서 뭔가 BeginRequest 후하지만 AuthenticateRequest 전에 쿠키에서 내 사용자 지정은 FormsAuthenticationTicket를 제거 것 같습니다 : 쿠키 내가 다시 파이프 라인의 단계를 경우 존재하고 Application_BeginRequest에 그것을 확인 않습니다

이상하게도. 안타깝게도이 작업은 사이트의 인증을 완전히 중단시킵니다.

사용자 지정 티켓을 만들 때 어떤 문제가 발생합니까? 내 쿠키 생성에 문제가 있습니까?

+0

이 아마도 당신이 쿠키를 만드는 곳'cookie.Expires'을 설정해야 할 주요 웹 사이트와 동일. 나는 이것이 우리가 하나의 브라우저 세션을 말하는 것으로 가정 할 때 필요하다고 생각하지 않을 것이다. 그러나 그것은 나에게 뛰어 오는 유일한 것이다. – jandersen

+3

'FormsAuthentication.Timeout.Minutes'의 값은 무엇입니까? 확인되지 않는 한 쿠키는'AuthenticateRequest'에 존재하지 않을 것입니다. 쿠키가 일찍 만료되지 않도록하십시오. –

+0

또한, 만족스럽지는 않지만'BeginRequest'에서 쿠키를 얻을 수 있다면 잠재적으로'Context.Items'를 사용하여 나중에 파이프 라인에서 사용할 정보를 저장할 수 있습니다. – jandersen

답변

0

로완 (Rowan)은 FormsAuthentication.Timeout.Minutes의 값을 살펴 보라고 제안했습니다. 조사한 후에이 값은 항상 0으로 되돌아 왔습니다. 이로 인해 티켓이 즉시 만료되었습니다. FormsAuthentication.Timeout.TotalMinutes 대신에 모든 것이 제대로 작동해야했습니다.

6

system.web 노드 인 .config 파일 인 httpRuntime 태그를 확인하십시오.

<httpRuntime targetFramework="4.5" />

+0

이것은 사실 나를 위해 문제를 해결했습니다. 티켓은 만료되지 않았지만 여전히 수집되지 않았습니다. 두 프로젝트 모두 web.config에서이 작업을 수행했는지 확인한 후 작동했습니다. 고마워요! –

관련 문제