จะสร้างแบบฟอร์มเข้าสู่ระบบอย่างง่ายโดยใช้ FormsAuthentication และ MySQL ได้อย่างไร

ฉันได้ลองค้นหาวิธีการทำสิ่งนี้ให้สำเร็จแล้ว แต่ทุกสิ่งที่ฉันพบดูเหมือนซับซ้อนและครอบคลุมเกินไปจนฉันไม่เข้าใจวิธีการทำงานจริงๆ ต่อไปนี้เป็นสถานการณ์ของฉัน:

ฉันมีตาราง MySQL ธรรมดาชื่อ users ซึ่งมีแอตทริบิวต์สามรายการ: user_id, username และ password

ในหน้า ASP.NET ฉันมีสองกล่องข้อความและปุ่มเข้าสู่ระบบ

ฉันได้อ่านเจอว่าฉันสามารถใช้ FormsAuthentication ได้ แต่ไม่รู้ว่ามันทำงานอย่างไร ฉันต้องใช้ "การเป็นสมาชิก" หรือไม่ หรือฉันสามารถใช้ FormsAuthentication โดยไม่ได้? ฉันอยากให้มันเรียบง่ายที่สุดเท่าที่จะเป็นไปได้

จนถึงตอนนี้ ฉันเพียงแค่เลือกดังนี้:

        String query = "SELECT * FROM users WHERE username = @UserName
           AND password = @Password;";
        cmd = new MySqlCommand(query, conn);
        cmd.Parameters.AddWithValue("@UserName", userName);
        cmd.Parameters.AddWithValue("@Password", password);

ในโค้ดของฉันฉันมีสิ่งนี้:

        String username = txtUsername.Text;
        String password = txtPassword.Text;

        User user = database.LogIn(username, password);

และสุดท้ายในไฟล์ web.config ของฉัน ฉันมีสิ่งนี้:

      <authentication mode="Forms">
        <forms name="MyCookieName"
               loginUrl="~/Default.aspx"
               timeout="10"
               protection="All"
               path="/">
        </forms>
      </authentication>
      <authorization>
        <deny users="?"/>
      </authorization>

จนถึงตอนนี้ฉันสามารถตรวจสอบได้ว่าผู้ใช้ป้อนข้อมูลที่ถูกต้องหรือไม่ แต่ฉันไม่เข้าใจว่าฉันจะใช้ FormsAuthentication ได้อย่างไร ความช่วยเหลือใด ๆ ที่ชื่นชม


person guitarzero    schedule 17.12.2013    source แหล่งที่มา


คำตอบ (2)


การรับรองความถูกต้องของแบบฟอร์มไม่เหมือนกับการเป็นสมาชิก คำอธิบาย

คุณได้ตั้งค่าทุกอย่างถูกต้องแล้ว Web.config เป็นที่ที่คุณเปิดใช้งาน Forms Auth ซึ่งโดยพื้นฐานแล้วคือโมดูล HTTP ที่ตรวจสอบคุกกี้ ASPXAUTH ในการเริ่มต้นตั้งค่าคุกกี้ในโค้ดของคุณหลังจากตรวจสอบรหัสผ่านแล้ว ให้ใช้:

FormsAuthentication.RedirectFromLoginPage(userName, createPersistentCookie); 

ฉันคิดว่านี่คือในเนมสเปซ System.Web.dll, System.Web.Security

คำขอครั้งต่อไปของคุณจะมีชื่อผู้ใช้ที่คุณระบุ

โปรดทราบว่าการเก็บรหัสผ่านเป็นข้อความธรรมดาถือเป็นความคิดที่ไม่ดี ใช้การแฮช

person 0leg    schedule 17.12.2013

ดูลิงก์นี้

ไม่ต้องสนใจสิ่งที่พวกเขาพูดเกี่ยวกับขั้นตอนการจัดเก็บ จากนั้นชำระเงินรหัสนี้

protected void Application_AuthenticateRequest(object sender, EventArgs e)
{
    MySqlConnection conn;

    if(Request.IsAuthenticated)
    {
        try 
        {
            conn = new MySqlConnection("server=Cheese;user id=george; password=blah; database=mysql; pooling=false");
            MySqlCommand cmd = new MySqlCommand();
            cmd.Connection = conn;
            cmd.CommandText = 
               "SELECT G.Name  FROM Roles R INNER JOIN Groups G ON R.GroupID = G.GroupID INNER JOIN Users U ON  R.UserID = U.UserID AND U.Username = ?";
            cmd.Parameters.Add("UserName",User.Identity.Name);
            conn.Open()
            MySqlDataReader r = cmd.ExecuteReader();
            ArrayList groups = new ArrayList();

            while(r.Read())
                {
                    groups.Add(r.GetString(0));
            }

            HttpContext.Current.User = new GenericPrincipal(User.Identity, groups.ToArray(typeof(System.String)));
        }
        finally
        {
            conn.Close();
        }
    }
}

แจ้งให้เราทราบหากยังมีคำถามอยู่

ไชโย

person Muhammad Atif Nadeem    schedule 17.12.2013
comment
ขอบคุณสำหรับคำตอบ. ฉันจะตรวจสอบสิ่งนี้ - person guitarzero; 17.12.2013