Form Authentication וROLES מDB

שלינקה

New member
../images/Emo5.gif Form Authentication וROLES מDB

אני עושה מערכת LOGIN לאתר. יש לי תיקיה ראשית, תיקיית Administrators ותיקיית Managers. בתוך התיקיות Administrators ו- Managers יש קבצים שרק למשתמש עם ROLE של Administrator ושל Manager (בהתאמה) יש גישה אליהם. בתיקייה הראשית יש קבצים שכולם יכולים לראות, ויש קבצים שרק משתמשים עם ROLE של User. בWEB.CONFIG בתיקיה הראשית כתבתי את ההרשאה והauthorizing וגם Location לקבצים שמותר לכולם לראות. יש בשתי התיקיות הפנימיות גם web.config עם authentication ו-authorizing הבעיה שלי היא עם הROLES. אין לי Provider ואני גם לא רוצה להתעסק עם זה. איך אני מגדירה אחרי LOGIN של משתמש מה הROLE שלו כך שהAuthentication ידע לאן מותר ולאן אסור לו להיכנס? בDB, הטבלה בנויה כך שלכל משתמש יש גם שדה ROLE שמכיל או "Administrator" או "Manager" או "User". אבל איך אני קובעת את זה בעוגיה של האימות בלי סיבוכים? לשלוף מהDB זה שטויות. אבל איך משימים את זה בעוגיה ככה שהאימות ידע מעצמו מתי לאפשר כניסה ומתי לאסור? קראתי המון בגוגל ובכלל, ולא מצאתי תשובה. אני מודה מראש על כל ניסיון לעזור!
 

שלינקה

New member
תודה! אבל זה לא מה שאני מחפשת...

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

yairov

New member
תגובה

private static void CreatePrincipal(string username, string[] roles) { GenericIdentity id = new GenericIdentity(username, "LdapAuthentication"); HttpContext.Current.User = new GenericPrincipal(id, roles); }​
 

שלינקה

New member
המון תודה! ובעיה חדשה בעקבות...

מה שקורה הוא שבאותו רגע הוא מזהה לי שאכן המשתמש נמצא InRole אבל אח"כ, במעבר לדף הבא, הוא כבר לא מזהה. הנה הקוד:
GenericIdentity id = new GenericIdentity(userTicket.Name, "LdapAuthentication"); string[] roles = new string[2]; roles[0] = "Manager"; roles[1] = "Administrator"; HttpContext.Current.User = new GenericPrincipal(id, roles); CreatePrincipal(userTicket.Name, roles); httpCookie.Expires = DateTime.Now.AddMinutes(60); HttpContext.Current.Response.Cookies.Add(httpCookie);​
(נתתי ROLES ידנית כדי שיהיה קל יותר להבין את הקוד) עכשיו, אם אני מבקשת ממנו לתת לי את הisInRoles עם "Manager" מיידית - הוא נותן TRUE וזה מעולה
IPrincipal principal = HttpContext.Current.User; Response.Write(principal.IsInRole("Manager").ToString());​
מחזיר TRUE. אבל אם בדף אחר אני מבקשת את אותה פקודה, הוא מחזיר לי FALSE, ובאמת לא נותן להיכנס לדף שיש לו הרשאת Manager. מה משתבש?
 

yairov

New member
תגובה

אתה צריכה להריץ את אותן שורות בכל request. עדיף להכניס את השורות לאירוע Application_BeginRequest ב-global.asax כך שיהיו זמינים מכל דף.
 

שלינקה

New member
את איזה שורות? כל הקוד שכתבתי פה?

זה אומר שאני צריכה לשמור את הROLES במשתנה קבוע, כמו Session, לא? איך זה שהName נשמר אבל הROLES לא?
 

yairov

New member
תגובה

לא לשמור ב-Session. ה-name מגיע מה-Cookie וזה בסדר. אבל את ה-Roles צריך לקרוא כל פעם מה-DB מחדש. משתמש שמבצע לוגין לאתר, מקבל Session שחי (כברירת מחדל) 20 דקות. בזמן הזה, מנהל המערכת יכול לשנות את ה-Roles של אותו משתמש מ-Administrator ל-User רגיל. אם ה-Roles ישמרו ב-Cookie המשתמש ימשיך להיות Administrator עד הלוגין הבא.
 
למעלה