2013-07-24 5 views
2

사용자 이름을 변경하려면 저장 프로 시저를 호출합니다. 이 작동하고 사용자 이름이 변경됩니다.SQLNET을 통해 ASPNETDB 사용자 이름을 변경 한 후 User.Identity가 업데이트되지 않습니다.

사용자 이름을 변경 한 후에 Membership.GetUser()은 null을 반환합니다. 나는 User.Identity을 체크하고 여전히 이전 사용자 이름을 가지고 있고 인증을 받았습니다.

먼저 나는

public void Authorize(string username) 
{ 
     FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket(1, username, DateTime.Now, DateTime.Now.AddDays(5), true, string.Empty); 
     string encryptedTicket = FormsAuthentication.Encrypt(authTicket); 

     HttpCookie authCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket); 
     authCookie.Expires = authTicket.Expiration; 

     HttpContext.Current.Response.Cookies.Add(authCookie); 
} 

그런 다음 나는 그것을 테스트 계정이기 때문에 (권한 부여 함수를 호출하기 전에 Membership.ValidateUser(username,password)을 추가하는 시도 (사용자가 처음 로그인 할 때라고도 함)와 난을 알고이 함수를 호출 시도 암호)하지만 아무런 차이가 없었습니다.

은 그 때 나는 노력이 :

FormsAuthentication.SignOut(); 
FormsAuthentication.SetAuthCookie(txtUserName.Text, false); 

내가 FormsAuthentication.SignOut() 전화 후 User.Identity.IsAuthenticated 여전히 사실이라고 혼란 스러워요. 페이지가 다시로드 될 때까지 업데이트되지 않아야합니까?

나는 내 문제가 User.Identity.Name 업데이트되지 않는다고 생각하는이 http://forums.asp.net/t/939408.aspx/1을 읽었습니다. 어떻게해야합니까?

  1. Membership.GetUser()는 인증 된 사용자 만 작동한다. 그렇지 않으면 null을 반환합니다. 인증 된 요청을 처리하고 있는지 확인하려면 페이지에서 "User.Identity.IsAuthenticated"를 호출하십시오. 인증 요청을 받았지만 Membership.GetUser()가 여전히 null을 반환하면 인증 된 사용자와 관련된 사용자 이름이 Membership 데이터 소스에서 찾을 수 없음을 의미합니다. "User.Identity.Name"을 사용하여 인증 된 사용자의 사용자 이름을 확인하십시오.

  2. 사용자 이름을 사용하고 null을 반환하는 Membership.GetUser() 오버로드 중 하나를 호출하는 경우 해당 사용자는 멤버십 데이터 소스에 존재하지 않거나 버그가 있습니다. 이를 쉽게 확인하는 한 가지 방법은 Membership.CreateUser()를 동일한 사용자 이름으로 시도하는 것입니다. 중복 된 사용자로 인해 오류가 발생하지 않으면 사용자가 처음에는 존재하지 않았 음을 알 수 있습니다.

  3. 익명 사용자의 경우 Membership.GetUser()가 절대로 작동하지 않아야합니다. 이 사건을 다루기위한 회원 자격은지지를받지 못했습니다.

답변

0

FormsCookie, 사용자 계정에 대한 변경 사항은 다음 요청까지 User.Identity 속성에 반영되지 않습니다. 이 속성은 쿠키의 유효성을 검사 할 때 요청을 시작할 때 멤버 자격 공급자가 설정합니다. 변경 사항은 후속 요청에서 볼 수 있습니다.

수동으로 User.Identity를 자신의 보안 주체로 바꿀 수 있지만 자신의 멤버 자격 공급자를 구현해야합니다.