ผมจะแสดงไว้เป็น 2 ตัวอย่างนะครับคือ การสร้าง ระบบ login อย่างง่าย และ แบบมี Ticket
การสร้าง ระบบ login อย่างง่าย
ในตัวอย่างนี้
ผมมีข้อมูลใน Database ดังรูป ( ฐานข้อมูลชื่อ LoginDB , ตาราง ชื่อ mylogin)

แล้วไปที่ web site
ลาก textbox 2 textbox , button 1 button มาวางดังรูป

จากนั้น คลิกที่ button แล้วเขียนโค้ดดังนี้
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.Common;
public partial class login : System.Web.UI.Page
{
bool isLogin=false;
protected void Page_Load(object sender, EventArgs e)
{
}
protected void Button1_Click(object sender, EventArgs e)
{
IsCheck(UsernameTextBox.Text, PasswordTextBox.Text);//เรียกใช้เมธอด IsCheck แล้วส่งค่า username,password ที่รับค่าเข้ามาจากทาง TextBox ไป
}
private void IsCheck(string username, string password)//ตรวจสอบค่าที่รับเข้ามา
{
IDbDataParameter param1, param2 = null;
DbProviderFactory factory = DbProviderFactories.GetFactory("System.Data.SqlClient"); //จะทำเป็น AppSetting ใน webconfig แล้วเรียกใช้ผ่านชื่อของ AppSetting ก็ได้
IDbConnection con = factory.CreateConnection();//จะใช้ เป็น SqlConnection ก็ได้ครับ
con.ConnectionString = @"Addr =.\Sqlexpress;Database =LoginDB;Integrated Security=SSPI"; //จะทำเป็น ConnectionString ใน webconfig ก็ได้
IDbCommand com = factory.CreateCommand(); //จะใช้เป็น SqlCommand ก็ได้
com.Connection = con;
com.CommandText = "SELECT m.username , m.password FROM mylogin AS m WHERE m.username = @username AND m.password = @password";
param1 = factory.CreateParameter();
param1.ParameterName = "@username";
param1.DbType = DbType.String;
param1.Value = username;
param2 = factory.CreateParameter();
param2.ParameterName = "@password";
param2.DbType = DbType.String;
param2.Value = password;
com.Parameters.Add(param1);
com.Parameters.Add(param2);
con.Open();
using (IDataReader reader = com.ExecuteReader())
{
while (reader.Read())
{
if (username == reader.GetString(0))
{
if (password == reader.GetString(1))
{
isLogin = true;//ถ้า username,password ตรงกับฐานข้อมูลให้กำหนดค่าจริงให้กับตัวแปร isLogin
}
else
{
isLogin = false;//ถ้า password ไม่ตรงก็ให้เป็น false
}
}
else
{
isLogin = false;//ถ้า username ไม่ตรงกับฐานข้อมูลก็ให้เป็น false
}
}
reader.Close();
con.Close();
}
if (isLogin)//ตรวจสอบค่าของ isLogin ว่าเป็น true หรือ false
{
Response.Redirect("page1.aspx"); //เมื่อ login ได้ให้ ไปที่หน้า page1.aspx
}
else
{
Response.Write("Login Failed"); //เมื่อไม่สามารถ login ได้ก็แจ้ง error
}
}
}
แล้วลองรันดูนะครับ ถ้าใส่ username,password ถูกก็จะเข้าสู่หน้าต่อไป (page1.aspx)
การสร้างหน้า login แบบ มี Ticket
ปกติแล้วถ้าใช้ตัวอย่าง ตามที่เขียนมา ถ้าเรามีหลายๆหน้า แต่เราต้องการให้ ผู้ใช้งาน login ก่อน ถึงจะเข้าหน้าอื่นๆได้ จะต้องเขียนคำสั่งเพิ่มเข้ามา
ไม่งั้น ถ้าผู้ใช้งานเข้าหน้าอื่นก็จะสามารถเข้าได้เลยถ้ารู้ url โดยที่ไม่ต้อง login ดังนั้นในการเขียนคำสั่งเพิ่ม เพื่อป้องกันไม่ให้ผู้ใช้งานสามารถเข้าหน้าอื่นๆ
ได้ก่อนที่จะ login
ซึ่งมีหลายวิธี เช่น การใช้ Session, Cookies ,querystring ,Ticket ฯ
ในตัวอย่างนี้ผมจะแสดงโดยใช้ Ticket นะครับ
ผมจะใช้โค้ดเดิมที่ผมเขียนก่อนหน้านี้นะครับ
1 . เปิด ไฟล์ webconfig แล้วเขียนโค้ดตร authenticaltion เพิ่มดังนี้
<authentication mode="Forms">
<forms loginUrl="login.aspx" name="login" timeout="60" path="/">
</forms>
</authentication>
<authorization>
<deny users="?"/>
<allow users="*"/>
</authorization>
2. เขียนโค้ดดังนี้
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.Common;
public partial class login : System.Web.UI.Page
{
bool isLogin=false;
protected void Page_Load(object sender, EventArgs e)
{
}
protected void Button1_Click(object sender, EventArgs e)
{
IsCheck(UsernameTextBox.Text, PasswordTextBox.Text);//เรียกใช้เมธอด IsCheck แล้วส่งค่า username,password ที่รับค่าเข้ามาจากทาง TextBox ไป
}
private void IsCheck(string username, string password)//ตรวจสอบค่าที่รับเข้ามา
{
IDbDataParameter param1, param2 = null;
DbProviderFactory factory = DbProviderFactories.GetFactory("System.Data.SqlClient");
IDbConnection con = factory.CreateConnection();//จะใช้ เป็น SqlConnection ก็ได้ครับ
con.ConnectionString = @"Addr =.\Sqlexpress;Database =LoginDB;Integrated Security=SSPI";
IDbCommand com = factory.CreateCommand(); //จะใช้เป็น SqlCommand ก็ได้
com.Connection = con;
com.CommandText = "SELECT m.username , m.password FROM mylogin AS m WHERE m.username = @username AND m.password = @password";
param1 = factory.CreateParameter();
param1.ParameterName = "@username";
param1.DbType = DbType.String;
param1.Value = username;
param2 = factory.CreateParameter();
param2.ParameterName = "@password";
param2.DbType = DbType.String;
param2.Value = password;
com.Parameters.Add(param1);
com.Parameters.Add(param2);
con.Open();
using (IDataReader reader = com.ExecuteReader())
{
while (reader.Read())
{
if (username == reader.GetString(0))
{
if (password == reader.GetString(1))
{
isLogin = true;//ถ้า username,password ตรงกับฐานข้อมูลให้กำหนดค่าจริงให้กับตัวแปร isLogin
}
else
{
isLogin = false;//ถ้า password ไม่ตรงก็ให้เป็น false
}
}
else
{
isLogin = false;//ถ้า username ไม่ตรงกับฐานข้อมูลก็ให้เป็น false
}
}
reader.Close();
con.Close();
if (isLogin)
{
MyTicket(username); //เรียกใช้ ticket
}
else
{
Response.Write("Login Failed");
}
}
}
void MyTicket(string username) //Ticket
{
FormsAuthenticationTicket ticket;//สร้าง Ticket
HttpCookie cookie = null; //สร้าง cookies เพื่อเก็บค่าเป็น cookies
ticket = new FormsAuthenticationTicket(1, username, DateTime.Now, DateTime.Now.AddMinutes(5), false, "");
string encrypt = FormsAuthentication.Encrypt(ticket);
cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encrypt);
Response.Cookies.Add(cookie);
Response.Redirect("page1.aspx");
}
}
จากนั้นทดสอบรันดูให้รันที่หน้าอื่นๆที่ไม่ใช้ หน้า login.aspx ผลลัพธ์คือจะไม่สามารถเข้าหน้าอื่นๆได้ถ้ายังไม่ login แล้วทางโปรแกรมก็จะ redirect ไปที่หน้า login.aspx ให้เอง
[With great power comes great responsibility]