لا يحافظ FormaStuentication على حقل UserData بعد Postback في .NET 3.5
-
01-10-2019 - |
سؤال
لقد أنشأت أ 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 ، وهنا لقطة شاشة تظهر هذه المشكلة:
لذا ، كيف حدث هذا؟ في وضعي ، أستخدم التحكم في تسجيل الدخول للمصادقة. في حدث مصادقة التحكم في تسجيل الدخول ، قمت بتعيين ملف تعريف الارتباط باستخدام userData بعد التحقق من اسم المستخدم وكلمة المرور manaully. ثم قمت بتعيين AuthenticateEventArgs.Authenticated=true
, ، في هذا الوقت ، في نافذة التصحيح ، أرى أن ملف تعريف الارتباط الجديد يتم وضعه في قائمة الانتظار للاستجابة التي يساوي الاسم أيضًا formsauthentication.formsCoOkiename! يتم إعادة توجيه الحل الخاص بي إلى الصفحة الافتراضية بدلاً من تعيين AuthenticateEventArgs.Authenticated = true.
لذلك ، يمكنك تصحيح الكود الخاص بك لمعرفة ما إذا كان ملف تعريف الارتباط المصادقة في قائمة الانتظار إلى الاستجابة مرتين.