none
מערכת כניסת משתמשים לקויה RRS feed

  • שאלה

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

    using System;
    using System.Collections;
    using System.Configuration;
    using System.Data;
    using System.Linq;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.HtmlControls;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Xml.Linq;
    using System.Data.SqlClient;
    
    namespace LibrarySite
    {
      public partial class Defult : System.Web.UI.Page
      {
        protected void Page_Load(object sender, EventArgs e)
        {
          if (!IsPostBack)
          {
            if (Session["isAdmin"] ==null)
            {
              imgAdmin.Visible = false;
              if (Session["isUser"] == null)
              {
                imgUser.Visible = false;
              }
            }
          
          }
        }
        public void UserCon()
        {
    
    
    
        }
        protected void btnDoLogin_Click(object sender, EventArgs e)
        {
             //תתחבר למסד הנתונים.
            string connectionstring = "Data Source=.\\SQLEXPRESS;AttachDbFilename=C:\\Documents and Settings\\omer\\שולחן העבודה\\ws16910michleviz\\db\\LibraryDB.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True";
            SqlConnection connection = new SqlConnection(connectionstring);
            try
            {
              connection.Open();
              txtauthorised.Text = "חיבור פתוח";
              
    
            }
            catch (System.Exception)
            {
              //אם לא הוחזרו רשומות - סימן שאין משתמש כזה, או שהסיסמה לא נכונה. במקרה כזה אתה צריך להודיע על שגיאה ולהפנות את המשתמש לדף ההרשמה.
              Response.Redirect("Reg.aspx");
           
          
            }
            //בצע שליפה
            String username = txtUserName.Text;
            String password = txtPassword.Text;
            SqlCommand command = new SqlCommand("SELECT * FROM [Korym] where UserNickName='" + username + "' AND UserPassword= '" + password + "'", connection);
            SqlDataReader reader = null;
            reader = command.ExecuteReader();
            if (reader.Read())
            {
              //אם כן הוחזרו רשומות - מזל טוב, זהו משתמש חוקי. קח את הרשומה הראשונה (אמורה להיות בכל מקרה רק אחת, כי אם כתבת את הקוד שלך נכון אז לא אמורים להיות שני משתמשים עם אותו שם וסיסמה) ותעשה מה שצריך עם הפרטים של המשתמש, כולל לקבוע את פרטי ה-session.
              lblMassage.Text = string.Format("ברוך הבא- ", username.ToString());
              btnDoLogin.Visible = false;
              imgUser.Visible = true;
              Session["IsUser"] = true;
    
    
            }
            else
            {
              SqlCommand command = new SqlCommand("SELECT * FROM [Admins] where AdminNickName='" + username + "' AND AdminPassword= '" + password + "'", connection);
              SqlDataReader reader = null;
              reader = command.ExecuteReader();
              lblMassage.Text = "נתונים שגויים";
    
            }
            
        
         
        }
        protected void txtUserName_TextChanged(object sender, EventArgs e)
        {
    
        }
    
        protected void imgUser_Click(object sender, ImageClickEventArgs e)
        {
    
        }
      }
    }
    

    יום ראשון 05 יוני 2011 14:39

תשובות

  • הי,

    אלו לא שתי שאילתות בסה"כ אתה צריך לבנות מחרוזת שמכילה את הטקסט הנ"ל.

    ואת המחרוזת הזו אתה משייך ל- command.

    התוצאה של ה- command מוחזקת ב- reader.

    במידה וה- reader ריק אזי אין התאמה.

    במידה ויש תוצאות תקרה את התןצאות ותפעל בהתאם.

     

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

    בהצלחה


    אסף שלם
    • סומן כתשובה על-ידי Meir Pinto יום רביעי 22 יוני 2011 10:58
    יום שני 06 יוני 2011 10:35
  • כמה נקודות תוספת חשובות מאוד:

     

    1. לעולם אל תעבוד כמו שכתבת כאן! לעולם אל תיצור שרשרת של השאילתה כפי שהיא!

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

    תוכל לקרוא על כך כאן וגם לראות דוגמאות מלאות
    http://www.csharp-station.com/Tutorials/AdoDotNet/Lesson06.aspx

    2. אסף כתב לך דוגמה כמו שכותבים אותה בתוכנת ה SSMS למשל. כפי שהוא אמר (אני רק מבהיר אם לא היה ברור) ניתן לרשום את כל מה שהוא כתב בלי מעבר שורה כשאילתה אחת.

    3. לגבי קבלת השגיאה: השיטה היא לעבוד עם אובייקט SqlDataReader שמגידירים אותו כ NULL בהתחלה. את פעולת הקריאה מבצעים בתוך בלוק try כך שאם בסיום הפעולה האובייקט עדיין NULL אז זה אומר שלא היו נתונים והאובייקט ריק (הקישור מעל מציג את דרך העבודה הנכונה)

     

    • סומן כתשובה על-ידי Meir Pinto יום רביעי 22 יוני 2011 10:58
    יום רביעי 08 יוני 2011 15:56
    מנחה דיון

כל התגובות

  • הי,

    ראשית מי אמר לך שהיא דפוקה?

    תפרט בבקשה את הדרישות ונוכל להמליץ על המימוש.

     


    אסף שלם
    יום ראשון 05 יוני 2011 14:46
  • קודם כל תודה!.

    אז ככה ישנן שתי טבלאות כפי שאתה רואה,Admins,Korym.

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

    אם אין משתמש אז אני מעוניין לשלוח אותו לדף הרשמה.

    שתי התתי טבלאות הן חלק מתתי הטבלאות של Library.mdf(לא חושב שזה אמור לשנות באיזשהו אופן,אבל בכל זאת)...

    ד"א הזריקת Exception לא נכונה,לא יודע איזה זריקה בדיוק ל"דחוף שם.

    שוב תודה,המוח שלי כבר התנוון מחיפוש פתרון.Reader.Read הפונקציה לא כ"כ מובנת לי בנוסף,  SqlDataReader reader = nul


    Michleviz
    יום ראשון 05 יוני 2011 15:12
  • העזרה ממש חשבוה,זה חלק קטן מפרויקט גמר ואני צריך לסדר את זה במהרה
    Michleviz
    יום ראשון 05 יוני 2011 16:55
  • הי,

    בסה"כ אתה מתאר כאן תהליך די בסיסי.

    מה שאני מציעה לך לעשות זה:

    1. להריץ את השאילתה שבודקת בשתי הטבלאות האם קיים משתמש עם הפרטים שהוזנו בתיבות הטקסט. (שאילתא מצורפת)

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

    אם חזרו נתונים תבדוק את הערך המוחזר, 0 משתמש רגיל, 1 אדמיניסטרטור.

    את הערך המוחזר אתה יכול לשמור במשתנה Session ולפנות אליו לקריאה או כתיבה בכל דף.

    בהצלחה 

     

     

    SELECT 0 FROM [Korym] where UserNickName = @username AND UserPassword = @Psw
    
    Union All
    
    SELECT 1 FROM [Admins] where AdminNickName= @username AND AdminPassword = @Psw

     

     

     


    אסף שלם
    יום שני 06 יוני 2011 08:36
  • אסף זה ברור לי..אבל בפועל בקוד אני לא מצליח להתאים את זה,זה לא מסתדר לי אני מקבל שגיאות מפה עד להודעה חדשה.

    איך להריץ 2 קיצר לא עובד לי


    Michleviz
    יום שני 06 יוני 2011 09:33
  • הי,

    מה השגיאות שאתה מקבל?

    תצרף את השגיאה ואולי אני יצליח להבין את הבעיה


    אסף שלם
    יום שני 06 יוני 2011 09:54
  • זה לא בדיוק שגיאה.פשוט זה לא ברור איך אני מכניס לתוך אובייקט קומנד שתי שאילתות 

     

        
    //SELECT 0 FROM [Korym] where UserNickName = @username AND UserPassword = @Psw
    
    //Union All
    
    //SELECT 1 FROM [Admins] where AdminNickName= @username AND AdminPassword = @Psw
     
            SqlCommand command = new SqlCommand("SELECT 0 FROM [Korym] where UserNickName = @username AND UserPassword = @Psw", connection);
    
    ואיך  אני רואה אם חזרו נתונים או לא אם הException שלי לא תקין...


    Michleviz
    יום שני 06 יוני 2011 10:23
  • הי,

    אלו לא שתי שאילתות בסה"כ אתה צריך לבנות מחרוזת שמכילה את הטקסט הנ"ל.

    ואת המחרוזת הזו אתה משייך ל- command.

    התוצאה של ה- command מוחזקת ב- reader.

    במידה וה- reader ריק אזי אין התאמה.

    במידה ויש תוצאות תקרה את התןצאות ותפעל בהתאם.

     

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

    בהצלחה


    אסף שלם
    • סומן כתשובה על-ידי Meir Pinto יום רביעי 22 יוני 2011 10:58
    יום שני 06 יוני 2011 10:35
  • כמה נקודות תוספת חשובות מאוד:

     

    1. לעולם אל תעבוד כמו שכתבת כאן! לעולם אל תיצור שרשרת של השאילתה כפי שהיא!

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

    תוכל לקרוא על כך כאן וגם לראות דוגמאות מלאות
    http://www.csharp-station.com/Tutorials/AdoDotNet/Lesson06.aspx

    2. אסף כתב לך דוגמה כמו שכותבים אותה בתוכנת ה SSMS למשל. כפי שהוא אמר (אני רק מבהיר אם לא היה ברור) ניתן לרשום את כל מה שהוא כתב בלי מעבר שורה כשאילתה אחת.

    3. לגבי קבלת השגיאה: השיטה היא לעבוד עם אובייקט SqlDataReader שמגידירים אותו כ NULL בהתחלה. את פעולת הקריאה מבצעים בתוך בלוק try כך שאם בסיום הפעולה האובייקט עדיין NULL אז זה אומר שלא היו נתונים והאובייקט ריק (הקישור מעל מציג את דרך העבודה הנכונה)

     

    • סומן כתשובה על-ידי Meir Pinto יום רביעי 22 יוני 2011 10:58
    יום רביעי 08 יוני 2011 15:56
    מנחה דיון
  • היי,

    אשמח אם תוכל/י לעדכן אותנו בסטטוס השאלה שלך.

     

    במידה וקיבלת תשובה מתאימה לשאלתך, יש לסמן את התשובה המתאימה ע"י לחיצה על "סמן כתשובה" ליד סימון ה V הירוק

    אם לא קיבלת תשובה, מומלץ לספק פרטים נוספים אודות הבעיה, פרטי לוג, צילומי מסך וכו'

    על מנת להעלות תמונה לפורום ניתן להעזר במדריך להעלאת תמונה.


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

    על מנת להעלות תמונה לפורום ניתן להעזר במדריך להעלאת תמונה
    מיקרוסופט מציעה שירות זה ללא תשלום, למטרת סיוע למשתמשים והעשרת הידע הקשור בטכנולוגיות ובמוצרים של Microsoft. תוכן זה מתפרסם כפי שהוא והוא אינו מעיד על כל אחריות מצד מיקרוסופט.
    יום שלישי 21 יוני 2011 13:10