דלג לתוכן הראשי
היכנס דרך Microsoft
היכנס או צור חשבון.
שלום,
בחר חשבון אחר.
יש לך חשבונות מרובים
בחר את החשבון שברצונך להיכנס באמצעותו.

עמודת קול של תמיכה ב- ASP .NET

פתרון בעיות באימות טפסים

ברוך הבא לעמודה ASP.NET Support Voice! שמי הוא ג'רי אורמן. הייתי עם Microsoft למעלה מ- 5 שנים, והשקעתי את רוב זמני בטכנולוגיות הקשורות לאינטרנט, כגון Microsoft FrontPage והטכנולוגיות החדשות של Microsoft SharePoint. ביליתי את השנה האחרונה בעבודה עם Microsoft ASP.NET כמהנדס תמיכה. החודש בעמודה קול תמיכה, אני הולך להסביר כיצד לפתור בעיות באימות טפסים ב- Microsoft ASP.NET.

פתרון בעיות באימות טפסים

בעת שימוש באימות טפסים ביישום ASP.NET, ייתכן שתצטרך לפתור בעיה שמתרחשת כאשר המשתמש מנותב מחדש באופן אקראי לדף הכניסה. בעולם אידיאלי, בעיה זו תתרחש באופן אשר מאפשר לך לצרף בקלות מאתר באגים וללכוד את הבעיה. בסביבות ייצור, עם זאת, זה רק לעתים נדירות המקרה. כדי לפתור בעיה אקראית כגון זו, עליך לרשום מידע הקשור לבעיה כדי שתוכל לצמצם את סיבת הבסיס.

בעמודה זו, מכסה בקצרה את הרעיון של אימות טפסים. לאחר מכן נבחן אילו תרחישים מובילים למשתמש שנותב מחדש לדף הכניסה וכיצד ללכוד נתונים רלוונטיים לפתרון הבעיה. כמו כן, נסביר כיצד ליישם ממשק IHttpModule כדי לרשום את פרטי אימות הטפסים.

מבט כולל על אימות טפסים

כאשר משתמש מאומת מול אתר אינטרנט באמצעות אימות טפסים, השרת יוצר קובץ Cookie. הערך של קובץ ה- Cookie הוא כרטיס אימות מוצפן של טפסים. קובץ ה- Cookie מועבר לשרת בכל בקשה ליישום, והמחלקה FormsAuthenticationModule מפענוח ערך קובץ ה- Cookie וקובעת אם המשתמש חוקי או לא.

כברירת מחדל, המחלקה FormsAuthenticationModule מתווספת Machine.config הקובץ. המחלקה FormsAuthenticationModule מנהלת את תהליך FormsAuthentication.

להלן ערך מהקובץ Machine.config הבא:

<httpModule>
     …other modules…
     <add name="FormsAuthentication"
         type="System.Web.Security.FormsAuthenticationModule" />
     …other modules…
</httpModule>

תעבורת HTTP הכללית לאימות באמצעות אימות טפסים נראית דומה לזו:

  1. הלקוח שולח HTTP GET ל- Default.aspx. לא נשלח קובץ Cookie של אימות טפסים.

  2. השרת שולח תגובה 302 (ניתוב מחדש) אל Login.aspx.

  3. הלקוח שולח HTTP POST ל- Login.aspx. הוא כולל את פרטי הכניסה.

  4. השרת שולח תגובה 302 (ניתוב מחדש) ל- Default.aspx. קובץ ה- Cookie של אימות הטפסים כלול.

  5. הלקוח שולח HTTP GET ל- Default.aspx. זה כולל את קובץ ה- Cookie של אימות הטפסים.

לקבלת מידע נוסף אודות יישום אימות טפסים והשימוש בו, בקר באתרי האינטרנט הבאים של MSDN:

http://msdn2.microsoft.com/en-us/library/7t6b43z4.aspx

http://msdn2.microsoft.com/en-us/library/system.web.security.formsauthentication(vs.71).aspx

http://msdn2.microsoft.com/en-us/library/system.web.security.formsauthenticationticket(vs.71).aspxלקבלת מידע נוסף אודות שיתוף קבצי Cookie של אימות טפסים, בקר באתר האינטרנט ASP.NET הבא:

http://quickstarts.asp.net/QuickStartv20/aspnet/doc/security/formsauth.aspx

סיבות לכך שמשתמש עשוי להיות מנותב מחדש לדף הכניסה

קובץ ה- Cookie של אימות הטפסים אבד

תרחיש 1


בתרחיש זה, משתמש נכנס לאתר האינטרנט. בשלב מסוים, הלקוח שולח בקשה לשרת,
ואת המחלקה FormsAuthenticationModule אינה מקבלת את קובץ ה- Cookie. באפשרותך לקבוע אם בקשת משתמש אינה מכילה את קובץ ה- Cookie על-ידי הפעלת רישום קבצי Cookie ב- Microsoft Internet Information Services (IIS). לשם כך, בצע את הפעולות הבאות:

  1. פתח את IIS Microsoft Management Console (MMC).

  2. לחץ באמצעות לחצן העכבר הימני על אתר האינטרנט ולאחר מכן לחץ
    על מאפיינים.

  3. לחץ על הכרטיסיה אתר אינטרנט ולאחר מכן לחץ על הפוך רישום לזמין.

  4. ודא שתבנית יומן הרישום היא תבנית קובץ יומן רישום מורחב W3C.

  5. לחץ על מאפיינים.

  6. לחץ על הכרטיסיה מתקדם ולאחר מכן לחץ על
    מאפיינים מורחבים.

  7. תחת מאפיינים מורחבים, לחץ כדי לבחור בתיבת הסימון Cookie(cs(Cookie)) ובתיבת הסימון Referer (cs(Referer)) .

לאחר שבעיה זו מתרחשת, קבע איזה לקוח נתקל בבעיה ובכתובת ה- IP של לקוח זה. סנן את יומן הרישום של IIS בכתובת ה- IP של לקוח זה והצג את <cookie> זו.

הערה באפשרותך להשתמש במנתח יומן כדי לנתח את יומני הרישום של IIS. כדי להוריד את מנתח יומן הרישום, בקר באתר האינטרנט הבא של Microsoft:

http://www.microsoft.com/download/details.aspx?FamilyID=890cd06b-abf8-4c25-91b2-f8d975cf8c07 לאחר שתכלול את רשימת הבקשות של משתמש ספציפי זה, חפש את הבקשות לדף הכניסה. אתה יודע שהם נותבו מחדש לדף זה, וברצונך לראות את הבקשות לפני התרחשות הניתוב מחדש. אם אתה רואה משהו דומה לפריט הבא, הלקוח לא שלח את קובץ ה- Cookie או שקובץ ה- Cookie הוסר ברשת בין הלקוח לשרת.

זוהי הכניסה הראשונית.

שיטת

דף

תגובה

עוגיות

קבל את

/Default.aspx

302 (ניתוב מחדש)

אין קבצי Cookie

קבל את

/Login.aspx

200 (הצלחה)

אין קבצי Cookie

פוסט

/Login.aspx

302 (ניתוב מחדש)

אין קבצי Cookie

קבל את

/Default.aspx

200 (הצלחה)

. ASPXAUTH

קבל את

/SomePage.aspx

302 (ניתוב מחדש)

לא. ASPXAUTH Cookie

אלה הן בקשות אחרות, ואחריו בקשה לדף באתר ללא . קובץ Cookie של ASPXAUTH.

שיטת

דף

תגובה

עוגיות

קבל את

/SomePage.aspx

302 (ניתוב מחדש)

לא. ASPXAUTH Cookie

קבל את

/Login.aspx

200 (הצלחה)

לא. ASPXAUTH Cookie

פוסט

/Login.aspx

302 (ניתוב מחדש)

לא. ASPXAUTH Cookie

קבל את

/SomePage.aspx

200 (הצלחה)

. ASPXAUTH


הערה ייתכן שהבקשה הראשונה של משתמש זה לא תכלול קובץ Cookie לאימות טפסים, אלא אם אתה יוצר קובץ Cookie מתמיד. יומן הרישום של IIS יציג לך רק את קבצי ה- Cookie שהתקבלו בבקשה. הבקשה הראשונה לקבל את קובץ ה- Cookie של אימות הטפסים תופיע בבקשה לאחר ניסיון כניסה מוצלח.

תרחיש 2


ניתן גם לבטל את קובץ ה- Cookie של אימות הטפסים כאשר חריגה ממגבלת קבצי ה- Cookie של הלקוח. ב- Microsoft Internet Explorer, קיימת מגבלה של 20 קבצי Cookie. לאחר יצירת קובץ ה- Cookie ה- 20 בלקוח, קבצי Cookie קודמים מוסרים מהאוסף של הלקוח. אם . קובץ Cookie של ASPXAUTH מוסר, המשתמש ינותב מחדש לדף הכניסה בעת עיבוד הבקשה הבאה.

באפשרותך לפתור בעיות בשני תרחישים אלה באותו אופן. עיין בבקשה ממש לפני הניתוב מחדש לדף הכניסה. אם הבקשה לדף זה יוצרת קבצי Cookie, יהיה עליך לחקור זאת.

באפשרותך להשתמש ב- Fiddler כדי להציג את כותרות ה- HTTP הנשלחות ללקוח. לאחר לכידת התעבורה, לחץ פעמיים על בקשה ולאחר מכן לחץ על כותרות עליונות כדי לראות את Set-Cookie העליונה. אם תעקוב אחר כניסה מוצלחת, תראה את Set-Cookie בתגובה לכניסה מוצלחת.

כדי להוריד את Fiddler, בקר באתר האינטרנט הבא של Fiddler:

http://www.fiddlertool.com/fiddler/

תרחיש 3


לאחר שהבקשה יוצאת מהלקוח, קיימות שכבות שונות שעשויות להשפיע על המנות הנשלחות. כדי לקבוע אם התקן רשת מסיר את קובץ ה- Cookie, עליך ללכוד מעקב רשת בלקוח ובשרת ולאחר מכן לחפש בגוף הבקשה את קובץ ה- Cookie. ברצונך לעיין בבקשה של הלקוח כדי לוודא שקובץ ה- Cookie נשלח, ובדוק את המעקב אחר השרת כדי לוודא שהשרת קיבל את קובץ ה- Cookie.

בקשת לקוח

זוהי בקשת GET לאחר אימות המשתמש. פרטי כרטיס האימות של הטפסים מסומנים בכחול. פעולה זו מאשרת שמידע קובץ ה- Cookie השאיר את הלקוח. בעת שימוש בכלי ללכידת רשת, כגון Netmon, אתה רואה את התעבורה שאינה גורמת בפועל למתאם.

47 45 54 20 68 74 74 70-3a 2f 2f 6c 6f 63 61 6c   GET http://local
68 6f 73 74 2f 46 6f 72-6d 73 41 75 74 68 4c 6f   host/FormsAuthLo
67 54 65 73 74 2f 57 65-62 46 6f 72 6d 31 2e 61   gTest/WebForm1.a
73 70 78 20 48 54 54 50-2f 31 2e 31 0d 0a 41 63   spx HTTP/1.1..Ac
63 65 70 74 3a 20 69 6d-61 67 65 2f 67 69 66 2c   cept: image/gif,
…Other headers of the GET request…
63 68 65 0d 0a 43 6f 6f-6b 69 65 3a 20 2e 41 53   che..Cookie: .AS
50 58 41 55 54 48 3d 33-43 45 46 39 42 39 41 30   PXAUTH=3CEF9B9A0
43 33 37 41 44 46 36 33-45 36 42 44 33 37 42 36   C37ADF63E6BD37B6
39 43 44 41 32 35 30 30-30 46 38 30 37 32 38 46   9CDA25000F80728F
35 31 43 39 35 36 36 44-31 34 43 35 34 31 34 35   51C9566D14C54145
38 31 43 39 33 45 32 41-30 31 44 44 43 44 45 46   81C93E2A01DDCDEF
32 34 41 31 37 34 32 39-34 31 30 43 30 39 37 34   24A17429410C0974
42 33 45 43 42 30 36 34-32 32 38 45 33 35 33 39   B3ECB064228E3539
39 41 38 32 32 42 33 42-39 33 36 44 46 30 38 46   9A822B3B936DF08F
42 41 42 44 33 45 31 30-32 44 30 30 32 31 30 43   BABD3E102D00210C
32 45 31 33 39 38 30 37-39 42 32 33 35 32 39 46   2E1398079B23529F
34 46 35 44 37 34 41 3b-20 50 72 6f 66 69 6c 65   4F5D74A; Profile
3d 56 69 73 69 74 6f 72-49 64 3d 62 32 34 65 62   =VisitorId=b24eb

בקשה בצד השרת

כאשר אתה מסתכל על הבקשה שהגעת לשרת, עליך לוודא שהשרת קיבל את אותו מידע שהלקוח שלח. אם השרת לא קיבל את אותו מידע, עליך לבדוק מכשירים אחרים ברשת כדי לקבוע היכן הוסר קובץ ה- Cookie.

הערה היו גם מופעים של מסנני ISAPI המסירים קבצי Cookie. אם אתה מאשר כי שרת האינטרנט קיבל את קובץ ה- Cookie, אך קובץ ה- Cookie אינו מופיע ביומני IIS, בדוק את מסנני ISAPI. ייתכן שתצטרך להסיר את המסננים כדי לראות אם הבעיה נפתרה.

הזמן של כרטיס האימות של הטפסים הסתיים

הסיבה הנפוצה האחרת לניתוב מחדש של משתמש היא אם פג תוקפו של כרטיס אימות הטפסים. הזמן קצוב לכרטיס אימות הטפסים יכול להסתיים בשתי דרכים. התרחיש הראשון מתרחש אם אתה משתמש בתפוגת תוקף מוחלטת. עם תפוגה מוחלטת, תוקף כרטיס האימות יפוג כאשר מועד התפוגה יפוג. לדוגמה, תגדיר תפוגת תוקף של 20 דקות, והמשתמש יבקר באתר בשעה 14:00. המשתמש ינותב מחדש לדף הכניסה אם המשתמש יבקר באתר לאחר 14:20.

אם אתה משתמש בתפוגת תפוגת הזזה, התרחיש קצת יותר מורכב. קובץ ה- Cookie והכרטיס המתוכם מתעדכנים אם המשתמש מבקר באתר לאחר שפג תוקפו של זמן התפוגה. לדוגמה, תגדיר תפוגת תוקף של 20 דקות באמצעות תפוגת הזזה. משתמש מבקר באתר בשעה 14:00, והמשתמש מקבל קובץ Cookie המוגדר לפוג בשעה 14:20. התפוגה מתעדכנת רק אם המשתמש מבקר באתר לאחר 14:10. אם המשתמש מבקר באתר בשעה 14:09, הכרטיס אינו מתעדכן מכיוון שחצי מתפוגת הזמן לא חלפה. אם המשתמש ממתין לאחר מכן 12 דקות, מבקר באתר בשעה 14:21, תוקפו של הכרטיס יפוג. המשתמש מנותב מחדש לדף הכניסה.

דרך אחת לגשת לבעיה מסוג זה היא לרשום את קובץ ה- Cookie של אימות הטפסים ואת פרטי הכרטיס. כך תוכל לראות אם קובץ ה- Cookie התקבל על-ידי IIS ומהם הערכים. ניתן לעשות זאת על-ידי כתיבת HttpModule ולאחר מכן חיבור מודול זה לצינור הבקשה. לא תצטרך לשנות את קוד היישום כדי לקבל את המידע הדרוש לך.

הדוגמה המצורפת פועלת ב- Microsoft .NET Framework 1.1 ובגירסה .NET Framework 2.0 ומכוללת הערות לאורך כל הדרך. הדוגמה כוללת את הקבצים הבאים:

  • FormsAuthEvents.cs: הכיתה המיישמת את IHttpModule ואת הקשרים Application_BeginRequest האירוע.

  • FormsAuthInfo.cs: המחלקה מאחזרת את קובץ ה- Cookie ומפענוח כרטיס האימות של הטפסים. בנוסף, הוא בודק את קובץ ה- Web.config של היישום כדי לוודא אימות טפסים זמין.

  • FormsAuthConfig.cs: המחלקה שגורמת לקריאת מידע FormsAuthLogger.config שלך.

  • Log.cs: הקובץ שמקבל בונה מחרוזות וכותבים את הערכים לקובץ יומן רישום.

  • FormsAuthLogger.config: קובץ ה- XML שנקרא על-ידי הקובץ Log.cs. קובץ זה חייב להיות בתיקיה /bin עם ה- DLL המוכלל. הקובץ מאפשר לך לקבוע את התצורה של הפריטים הבאים:

    • סינון לפי IP: באפשרותך לסנן את לכידת הנתונים לפי IP של לקוח. בדרך זו, באפשרותך לרשום רק בקשות מלקוח הידוע כשכפול הבעיה. פעולה זו מקטינה את גודל יומן הרישום.

    • סוג לכידה: אפשרות זו מציינת היכן לשמור את הקובץ. ברירת המחדל היא התיקיה ASP.NET קבצים זמניים, אך באפשרותך לשמור אותה בכל מקום כל עוד לחשבון התהליך של העובד יש את היכולת לכתוב בתיקיה.

הערה אספק קישור להורדה עבור הקוד שסופק בקובץ FormsAuthLogger.zip שלך.

אני אצביע על האזורים העיקריים כאן:

  1. צור מחלקה המיישמת את ממשק IHttpModule.

    public class FormsAuthEvents : IHttpModule 
    {
    …code…
    }
  2. תיל את האירוע שברצונך להסתכל בו. בדוגמה זו, אנחנו משתמשים באירוע Application_BeginRequest זה. כך נוכל לחקור כל בקשה ולברר אם הוא כולל את קובץ ה- Cookie של אימות הטפסים ולרשום את FormsAuthenticationTicket אם קובץ ה- Cookie נמצא שם.

    public void Init(HttpApplication application) 
    {
    //Wire up the BeginRequest event
    application.BeginRequest += (new EventHandler(this.Application_BeginRequest));
    }
  3. יישם את Application_BeginRequest האירוע.

    private void Application_BeginRequest(Object source, EventArgs e)
    {
       …code to log the ticket…
    }
    
  4. אחזר את קובץ ה- Cookie של אימות הטפסים ולאחר מכן פענוחו.

  5. רשום את הערכים. אני ממליץ לת רישום של הפריטים הבאים בנוסף למידע הטפסים. פעולה זו תסייע לך לפתור את פרטי האימות של הטפסים ביומני IIS, במידת הצורך:

    • תאריך: מאפשר לך לראות מתי הגיעה הבקשה.

    • RequestType: מראה אם הבקשה היא קבל או רשומה.

    • כתובת URL: מציג את תבנית הבקשות המובילות לבעיה.

    • מפנה (Referrer)

    • ClientIP: קשרים בבקשות ללקוח ספציפי.

זקוק לעזרה נוספת?

מעוניין באפשרויות נוספות?

גלה את יתרונות המנוי, עיין בקורסי הדרכה, למד כיצד לאבטח את המכשיר שלך ועוד.

קהילות עוזרות לך לשאול שאלות ולהשיב עליהן, לתת משוב ולשמוע ממומחים בעלי ידע עשיר.

האם מידע זה היה שימושי?

עד כמה אתם מרוצים מאיכות השפה?
מה השפיע על החוויה שלך?
בלחיצה על 'שלח', אתה מאפשר למשוב שלך לשפר מוצרים ושירותים של Microsoft. מנהל ה-IT שלך יוכל לאסוף נתונים אלה. הצהרת הפרטיות.

תודה על המשוב!

×