2014-02-11 1 views
1

로그인 페이지에서 FormsAuthenticationTicket은 일부 사용자 정의 사용자 데이터가있는 영구 쿠키로 설정됩니다. 이제이 사용자 지정 사용자 데이터를 변경해야하므로 매개 변수가 하나 더 있습니다. 이전에 로그인 한 사용자가 다음 번에 사이트를 방문하면이 사용자 정의 사용자 데이터를 Application_PostAuthenticateRequest에 deserialize하지만 이제는 새로 추가 된 매개 변수가 포함되지 않습니다.FormsAuthenticationTicket UserData 갱신

사용자가 다시 로그인해야하는 번거 로움없이이 매개 변수를 검색 할 수 있습니까?

그렇다면 영구 쿠키에 '업데이트'해야한다는 것을 어떻게 알 수 있습니까?

쿠키 세트. userId는 새로운 매개 변수입니다.

CustomPrincipalSerializeModel serializeModel = new CustomPrincipalSerializeModel(); 
serializeModel.FirstName = model.UserName; 
serializeModel.userId = model.userId; 

JavaScriptSerializer serializer = new JavaScriptSerializer(); 

string userData = serializer.Serialize(serializeModel); 

FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket(
     1, 
     model.UserName, 
     DateTime.Now, 
     DateTime.Now.AddYears(5), 
     model.RememberMe, 
     userData); 

string encTicket = FormsAuthentication.Encrypt(authTicket); 
HttpCookie faCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encTicket); 

faCookie.Expires = authTicket.Expiration; 
Response.Cookies.Add(faCookie); 

return RedirectToAction("Index", "Home"); 

쿠키 검색입니다. 사용자 ID는 새로운 있었던 파라미터이며, 사용자 로그인 이전에 null입니다 :

HttpCookie authCookie = Request.Cookies[FormsAuthentication.FormsCookieName]; 

if (authCookie != null) 
{ 
    FormsAuthenticationTicket authTicket = FormsAuthentication.Decrypt(authCookie.Value); 

    JavaScriptSerializer serializer = new JavaScriptSerializer(); 

    CustomPrincipalSerializeModel serializeModel = serializer.Deserialize<CustomPrincipalSerializeModel>(authTicket.UserData); 

    CustomPrincipal newUser = new CustomPrincipal(authTicket.Name); 
    newUser.FirstName = serializeModel.FirstName; 
    newUser.userId = serializeModel.userId; 

    HttpContext.Current.User = newUser; 
} 

답변

1

사용하는 웹 양식 또는 MVC?

HttpContext.Current.User를 올바르게 설정 한 것 같습니다. 문제는 기본적으로 컨트롤러/뷰가 IPrincipal을 생각하고 사용자 정의 교장을 생각하지 않을 수 있으므로 설정 한 새 데이터에 액세스 할 수 없습니다.

캐스팅하거나 아래의 기본 컨트롤러에서 설정할 수 있습니다.

// in some controller action 
var firstName = ((CustomPrincipal)User).FirstName 


[Authorize] 
public class BaseController : Controller 
{ 
    protected virtual new CustomPrincipal User 
    { 
     get { return HttpContext.User as CustomPrincipal; } 
    } 
} 
+0

MVC입니다. 올바른 맞춤 교장을 얻지 만 쿠키에 저장된 일부 데이터를 비 직렬화하기 때문에 새로 추가 된 유형이 직렬화에 설정되지 않습니다 ... 그래서 사용자가 다시 로그인해야합니다. 최신 정보. – perene

+0

암호화하기 전에 새 UserId가 설정되었고 UserData에서 적절하게 직렬화되었는지 확인했습니다. –

+0

... UserId가 설정되지 않았습니다 - 그게 전부 문제입니다. 쿠키를 설정하려면 사용자가 로그 아웃하고 다시 로그인하여 새 쿠키를 만들어야하며,이 작업을 수행하지 않는 방법을 찾고 있습니다. – perene