2010-11-05 13 views
13

ठीक है, प्रमाणीकरण कुकी बनाने के लिए मेरा कोड यहां है:लगातार प्रमाणीकरण कुकी बनाने में समस्या: एएसपी.नेट एमवीसी

  // get user's role 
     List<UserType> roles = rc.rolesRepository.GetUserRoles(rc.userLoginRepository.GetUserID(userName)); 
     List<string> rolesList = (from r in roles 
           select r.ToString()).ToList(); 
     string[] rolesArr = rolesList.ToArray(); 

     // create encryption cookie 
     FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket(
       1, 
       userName, 
       DateTime.Now, 
       DateTime.Now.AddDays(90), 
       createPersistentCookie, 
       String.Join(";",rolesArr) //user's roles 
       ); 

     // add cookie to response stream 
     string encryptedTicket = FormsAuthentication.Encrypt(authTicket); 

     System.Web.HttpCookie authCookie = new System.Web.HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket); 
     System.Web.HttpContext.Current.Response.Cookies.Add(authCookie); 
     //FormsAuthentication.SetAuthCookie(userName, createPersistentCookie); 

और उपयोगकर्ता कोड में उपयोगकर्ता भूमिकाओं को सेट करने के लिए Global.asax में मेरा कोड है:

 protected void Application_AuthenticateRequest(Object sender, EventArgs e) 
    { 
     HttpCookie authCookie = Context.Request.Cookies[FormsAuthentication.FormsCookieName]; 
     if (authCookie == null || authCookie.Value == "") 
     { 
      return; 
     } 
     FormsAuthenticationTicket authTicket = null; 
     try 
     { 
      authTicket = FormsAuthentication.Decrypt(authCookie.Value); 
      string[] roles = authTicket.UserData.Split(new char[] { ';' }); 
      if (Context.User != null) 
      { 
       Context.User = new System.Security.Principal.GenericPrincipal(Context.User.Identity, roles); 
      } 
     } 
     catch 
     { 
      return; 
     } 
    } 

हालांकि, अगर "createPersistentCookie" शीर्ष उदाहरण में सत्य है, कोई लगातार कुकी नहीं बनाई गई है। अगर मैं इस तरह की आखिरी पंक्ति को अनदेखा करता हूं:

  //System.Web.HttpContext.Current.Response.Cookies.Add(authCookie); 
     FormsAuthentication.SetAuthCookie(userName, createPersistentCookie); 

तब लगातार हार्ड मेरी हार्ड ड्राइव पर बनाई गई है। लेकिन फिर Global.asax कोड में, "authTicket" में UserData फ़ील्ड खाली है, इसलिए मैं भूमिकाओं को ठीक से सेट नहीं कर सकता!

इसलिए मुझे लगातार कुकी बनाने के लिए SetAuthCookie का उपयोग करना है, लेकिन फिर किसी कारण से उपयोगकर्ता डेटा फ़ील्ड लगातार कुकी से गायब हो जाता है।

इसका उत्तर क्या है ??

उत्तर

17

एक लगातार कुकी बनाने के लिए आप Expires संपत्ति निर्धारित करने की आवश्यकता:

if (authTicket.IsPersistent) 
{ 
    authCookie.Expires = authTicket.Expiration; 
} 
+0

हाँ, यह है कि यह किया! बहुत बहुत धन्यवाद। मैं अपने बालों को फाड़ रहा हूं। अब मैं Response.Cookies का उपयोग कर सकता हूं। SetAuthCookie के बजाय जोड़ें, और एक सतत कुकी बनाई गई है, और UserData को खाली नहीं किया गया है (अजीब!) – Cynthia

संबंधित मुद्दे