שימושיות ואבטחה בLogout

השאלה המתבקשת היא: זה Logout, מה כבר יכול להשתבש?! - אז מסתבר שלא מעט. מדובר בדברים פשוטים וברורים מאליהם עד כדי כך, שפשוט לא חושבים עליהם.

את לינק היציאה (או logout) תמצאו ברוב האתרים על הMasterPage. הלינק מוצג רק למשתמשים שמזוהים באתר ע"י ביצוע כניסה (או login), שכן רק עבורם שייכת פעולה זו. השאלה המעניינת היא, מה מתרחש כשלוחצים על הלינק?

ניתן לממש logout בכמה דרכים:

  • כמטפל לאירוע הClick בCode Behind של הMasterPage עצמו.
  • ע"י הפנייה לדף מיוחד (נקרא לו Logout.aspx) שכל מטרתו היא לבצע logout.

בשני המקרים מתחילים מקריאה למתודה FormsAuthentication.SignOut() שמבצעת עבורנו את השמדת העוגיות וכדו'. עד כאן הכל פשוט. הבעיה מתעוררת בדף שיוחזר למשתמש.

במקרה של מימוש ע"י מטפל אירוע Click בMasterPage יש שתי בעיות פוטנציאליות:

  1. מטפלי האירועים מבוצעים בשלב מאוחר במחזור חיי הדף. ולכן, תכנים רבים שאמורים להיות מוצגים רק למשתמשים מזוהים, עדיין יוצגו בדף בפעם הראשונה שהדף ייטען לאחר הlogout.
  2. היות ומדובר בMasterPage, ייתכן שהדף שממנו בוצע הlogout נגיש למשתמשים מזוהים בלבד. כתוצאה, לאחר הlogout המשתמש יוקפץ מיידית לדף הכניסה (או login)!!

על אף שלכל אחת מהבעיות הנ"ל קיימים פתרונות פשוטים, אני בחרתי בדרך השנייה: הפנייה לדף נפרד שכל מטרתו היא ביצוע logout. 

מימוש Logout באמצעות דף נפרד

כרגיל, מתחילים מקריאה לFormsAuthentication.SignOut(). עכשיו מתעורר השאלה לאיפה מעבירים את המשתמש (redirect) לאחר ביצוע ההתנתקות מהמערכת.

אם נחזיר את המשתמש לדף הקודם (הדך ממנו הוא ביצע login) ייתכן ועכשיו, לאחר ההתנתקות, אין לו הרשאות לגשת לדף ההוא והוא יוקפץ לדף הlogin כמו בMasterPage. כמו"כ זה יפתח פתח לתקיפות התחזות ע"י זיוף שדה הreferer. אם נחזיר אותו לדף הבית, הקפצה שרירותית מעומק הניווט באתר לדף הבית תפגע בחוויית השימוש.

הגישה שבחרתי היא:

  • אם יש ערך לreferer, והוא נמצא בדומיין של האתר עצמו, ויש למשתמש לא מזוהה גישה אליו –> עבור לreferer.
  • אחרת, עבור לדף הבית.

הקוד:

 protected void Page_Load(object sender, EventArgs e)
 {
     FormsAuthentication.SignOut(); //צא
 
     // אם הופנתי מדף אחר
     // ואם הדף ממנו הופנתי באותו הדומיין
     if (Request.UrlReferrer != null && string.Compare(Request.UrlReferrer.Host, Request.Url.Host, true) == 0)
     {
         string virtualPath = VirtualPathUtility.ToAppRelative(Request.UrlReferrer.AbsolutePath);
         var genUser = new GenericPrincipal(new GenericIdentity(string.Empty), new string[] { });
 
         // אם למשתמש בלתי מזוהה יש גישה לדף ממנו הופנתי 
         if (UrlAuthorizationModule.CheckUrlAccessForPrincipal(virtualPath, genUser, "GET"))
         {
             // חזור לדף ממנו הופנתי 
             Response.Redirect(virtualPath);
         }
     }
 
     // חזור לדף המוגדר כראשי
     Response.Redirect(FormsAuthentication.DefaultUrl);
 }
 
קטגוריות: .NET
תגיות: ,

תגובות (1) -

שמואל
28/03/2011 13:19:11 #

see in tapuz co il
here have pop up page to logout

הוסף תגובה




biuquote
  • תגובה
  • תצוגה מקדימה
Loading