لا يحافظ FormaStuentication على حقل UserData بعد Postback في .NET 3.5

StackOverflow https://stackoverflow.com/questions/3669204

سؤال

لقد أنشأت أ FormsAuthenticationTicket من الصفر ، ولكن وجدت أنه عند استرداده في وقت لاحق ، UserData لا تعود. هنا الكود المستخدم:

FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(
                        1,
                        user.UserId,
                        DateTime.Now,
                        DateTime.MaxValue,
                        false,
                        user.UserType);

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

Response.Cookies.Add(cookie);

ومع ذلك ، عند قراءة هذا مرة أخرى على التالي Request, ، وجدت أن UserData الحقل الآن فارغ:

string encryptedCookie = Request.Cookies[ FormsAuthentication.FormsCookieName ].Value;
FormsAuthenticationticket ticket = FormsAuthentication.Decrypt(encryptedCookie);
Assert.IsTrue( ticket.UserData.Length == 0 ); //TRUE!

أيه أفكار؟

هل كانت مفيدة؟

المحلول

أعتقد أنني وجدت المشكلة. إذا قمت بتكوين اسم ملفات تعريف الارتباط الخاصة بك ، فيبدو أنه على ما يرام! لذا التغيير من:

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

إلى

HttpCookie cookie = new HttpCookie(
     "SiteCookie", 
     FormsAuthentication.Encrypt(ticket));

ثم استرجعه وفقًا للسؤال:

string encryptedCookie = Request.Cookies[ "SiteCookie" ].Value;
FormsAuthenticationticket ticket = FormsAuthentication.Decrypt(encryptedCookie);
Assert.IsFalse( ticket.UserData.Length == 0 ); //Hooray! It works

من الممكن .NET بعض الأشياء الصعبة معها ، لذلك من خلال وضعها في واحدة جديدة تعمل بشكل جيد.

تحديث:

أيضًا ، يجب تحديث التذكرة ، وإلا فإن التذكرة ستنتهي أثناء استخدام المستخدم الموقع:

FormsAuthentication.RenewTicketIfOld(ticket); // Do before saving cookie

نصائح أخرى

هذا يعمل بالنسبة لي:

//Create Form Authentication ticket
FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1, currentUser.userid.ToString(), DateTime.Now, DateTime.Now.AddMinutes(60), false, currentUser.ToString(), FormsAuthentication.FormsCookiePath);

string hashCookies = FormsAuthentication.Encrypt(ticket);
HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, hashCookies);
cookie.HttpOnly = true;
HttpContext.Current.Response.Cookies.Add(cookie);

لقد واجهت هذه المشكلة أيضًا. لكنني أعتقد أن السبب الحقيقي هو أن الخادم يعين نفس ملف تعريف الارتباط مرتين والثاني تجاوز الأول الذي يحتوي على حقل UserData الخاص بك.

يمكنك التقاط عملية كتابة ملفات تعريف الارتباط بواسطة Fiddler ، وهنا لقطة شاشة تظهر هذه المشكلة:enter image description here

لذا ، كيف حدث هذا؟ في وضعي ، أستخدم التحكم في تسجيل الدخول للمصادقة. في حدث مصادقة التحكم في تسجيل الدخول ، قمت بتعيين ملف تعريف الارتباط باستخدام userData بعد التحقق من اسم المستخدم وكلمة المرور manaully. ثم قمت بتعيين AuthenticateEventArgs.Authenticated=true, ، في هذا الوقت ، في نافذة التصحيح ، أرى أن ملف تعريف الارتباط الجديد يتم وضعه في قائمة الانتظار للاستجابة التي يساوي الاسم أيضًا formsauthentication.formsCoOkiename! يتم إعادة توجيه الحل الخاص بي إلى الصفحة الافتراضية بدلاً من تعيين AuthenticateEventArgs.Authenticated = true.

لذلك ، يمكنك تصحيح الكود الخاص بك لمعرفة ما إذا كان ملف تعريف الارتباط المصادقة في قائمة الانتظار إلى الاستجابة مرتين.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top