2010-12-16 2 views
1

In meiner Anwendung verwende ich Formularauthentifizierung. Mein Authentifizierungscode ist unten:Ein Problem über die gemeinsame Form Authentifizierung Cookie auf mehreren Seiten

public static void Authenticate(bool redirectToPage, ISecurityUser user, params string[] roles) 
    { 
     FormsAuthentication.Initialize(); 
     GenericIdentity id = new GenericIdentity(user.UserName); 
     ExtendedPrincipal principal = new ExtendedPrincipal(id, user, roles); 
     //ExtendedPrincipal principal = new ExtendedPrincipal(id, user, new string[] { "1" }); 

     string compressedPrincipal = ConvertPrincipalToCompressedString(principal); 

     FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1, user.UserName, DateTime.Now, DateTime.Now.AddMinutes(30), true, compressedPrincipal, FormsAuthentication.FormsCookiePath); 

     string hash = FormsAuthentication.Encrypt(ticket); 
     HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, hash); 

     //cookie.HttpOnly = false; 
     //cookie.Expires = DateTime.Now.AddMinutes(30); 

     HttpContext.Current.Response.Cookies.Add(cookie); 

     if (redirectToPage) 
     { 
      HttpContext.Current.Response.Redirect(FormsAuthentication.GetRedirectUrl(user.UserName, true)); 
     } 
    } 

Das Benutzerobjekt enthält FirmID- und DealerID-Eigenschaften. Nachdem ich mich in der Anwendung angemeldet habe, kann ich FirmID und DealerID von der App ersetzen. Nach dem Wechsel Prozess wird dieser Code runned:

public static void RefreshIdentitiy(ISecurityUser user) 
    { 
     HttpCookie cookie = HttpContext.Current.Request.Cookies[FormsAuthentication.FormsCookieName]; 
     FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(cookie.Value); 
     HttpContext.Current.Response.Cookies.Remove(FormsAuthentication.FormsCookieName); 

     ExtendedPrincipal principal = ConvertCompressedStringToPrincipal(ticket.UserData); 
     principal.BindProperties(user); 

     FormsAuthenticationTicket newticket = new FormsAuthenticationTicket(
     ticket.Version, ticket.Name, ticket.IssueDate, ticket.Expiration, 
     ticket.IsPersistent, ConvertPrincipalToCompressedString(principal), ticket.CookiePath); 

     cookie = new HttpCookie(FormsAuthentication.FormsCookieName, FormsAuthentication.Encrypt(newticket)); 

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

Mein Problem ist, dass: Wenn ich die App von der zweiten Seite zu öffnen, Cookie von zweiten Seite zermalmt die erste Seite. So wird auch FirmID und DealerID der ersten Seite geändert.

Wenn ich App von der zweiten Seite öffne, will ich nicht, dass Cookie einen anderen zerquetscht. Was kann ich gegen dieses Problem tun?

Antwort

0

sollten Sie so etwas wie dieses auf allen Seiten tun:

if(Request.Cookies[FormsAuthentication.FormsCookieName]!=null) 
{ 
     HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, hash); 

     cookie.HttpOnly = false; 
     cookie.Expires = DateTime.Now.AddMinutes(30); 

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

bearbeiten Mein Ziel sicher zu machen ist, dass Sie Ihre Cookies jedes Mal, wenn

+0

auf eine neue Seite gehen nicht überschreiben Was ist das Ziel von Code, den Sie geschrieben haben? Kannst du mir erklären, was ich genau mache? – mavera