PDA

View Full Version : آموزش: آموزش ساخت صفحه ی ثبت نام،ورود و ....



Mohammad_dn
شنبه 21 دی 1392, 18:37 عصر
پست ویرایش شد

سورس ضمیمه شد

با سلام....دیدم برخی از دوستان دنبال ساخت صفحه ی ثبت نام ..ورود به سایت و ... هستن گفتم آموزش ساختشو اینجا بزارم

اول از ثبت نام شروع میکنم

ثبت نام در سایت:

برای این کار ابتدا شما باید یه بانک بسازید...بعد از ساخت بانک Table مربوط به اون رو میسازیم...

اطلاعات داخل این table ..معمولا
UserName,Password,Email هست.....البته فقط همینا کافی نیست

من کد ساخت تیبل رو میزارم و از روی همین میریم جلو:


CREATE TABLE [dbo].[UserData] (
[Id] INT IDENTITY (1, 1) NOT NULL,
[UserName] NVARCHAR (MAX) NOT NULL,
[Password] NVARCHAR (MAX) NOT NULL,
[Email] NVARCHAR (MAX) NOT NULL,
[Name] NVARCHAR (MAX) NOT NULL,
[Family] NVARCHAR (MAX) NOT NULL,
[RegistryUserDate] NVARCHAR (50) NOT NULL,
PRIMARY KEY CLUSTERED ([Id] ASC)
);



فیلد های(id,UserName,Password,Email,Name,Family,Regi stryUserDate)

ابتدا 5 textbox روی صفحه مون اظافه میکنم...
همچنین فضا های نام :(قسمت ویرایش شده)

using System.Security.Cryptography;
برای رمز کردن پسورد

using System.Data.SqlClient;

برای کار با پایگاه داده

using System.Web.Configuration;

برای کار با Web.config و گرفتن ConnectionString از اون

بعد انجام این کارها...باید اطلاعاتی رو که کاربر وارد کرده رو در بانک ثبت کنیم...و در واقع کاربر ثبت نام شه

این کار دقیقا همون کار با پایگاه داده ی sql هست(فقط یه کم فرق میکه)

اول از همه باید برسی کنیم که چنین نام کاربری ای قبلا ثبت نشده باشه:

ابتدا یه متغیر تعریف میکنیم و ConnectionString بانک رو توش ذخیره میکنیم(من اینجا رشته ی اتصالی رو توی web.config ذخیره کردم)

string strConnection = WebConfigurationManager.ConnectionStrings["Site"].ToString();

2:یک کانکشن به وصیله ی این رشته(ConnectionString) میسازیم:


SqlConnection con = new SqlConnection(strConnection);

3:یک متغیر تعریف میکنیم و دستور sql را جهت واکشی اطلاعات و فهمیدن این که آیا نام کاربری وجود دارد یا نه ایجاد میکنیم

string strCmd = "SELECT UserName FROM UserData WHERE UserName=@UserName";

4:حالا باید یک متغیر از نوع sqlCommand برای اجرای دستورات sql مون ایجاد کنیم:

SqlCommand cmd = new SqlCommand(strCmd, con);

5:برای این که اطلاعات رو واکشی کنیم نیاز به یه متغیر از نوع sqlDataReader داریم:

SqlDataReader reader;

6:اگه دقت کرده باشید در مرحله ی 3 من پارامتری برای دستور sql تعریف کردم(@UserName)
حالا باید پارامتر رو مقداردهی کنیم:

cmd.Parameters.AddWithValue("@UserName", TextBox1.Text);

توجه:TextBox1 همون نام کاربری ای هست که کاربر وارد کرده

7:حالا به بانک وصل میشیم و اطلاعات رو واکشی میکنیم:


con.Open();
reader = cmd.ExecuteReader();


8:اگه رکوردی وجود داشته باشه یعنی که کسی با این نام کاربری قبلا ثبت نام کرده:


if (reader.Read())
{
Fakhravary.Message.MessageBox("این نام کاربری قبلا ثبت شده است", this);
con.Close();
return;
}


در اینجا برای نمایش پیغام به کاربر من از کامپوننتی که آقای "فخراوری" نوشتن ایتفاده کردم
در صورتی که رکوردی وجود داشته باشه پیغامی به کاربر نشون میده و کار دیگه ادامه پیدا نمیکنه

در صورتی که نام کاربری قبلا ثبت نشده باشه کار ادامه پیدا میکنه

10:حالا باید یه بار دیگه به بانک وصل شیم و اطلاعات رو ذخیره کنیم:

ابتدا یک دستور sql جدید ایجاد میکنیم...


strCmd = "INSERT INTO UserData (UserName, Password,Email, Name, Family, RegistryUserDate";
strCmd += ") VALUES(@UserName, @Password,@Email, @Name, @Family, @RegistryUserDate";
strCmd += ")";
cmd = new SqlCommand(strCmd, con);



11:حالا باید یکی یکی پارامتر ها رو مقدار دهی کنیم:(قسمت ویرایش شده)



string str = TextBox2.Text;
byte[] data = System.Text.UTF8Encoding.UTF8.GetBytes(str);
SHA256Managed sha = new SHA256Managed();
byte[] hashValue = sha.ComputeHash(data);
string strp = "";
foreach (byte strb in hashValue)
{
strp += strb.ToString();
}

cmd.Parameters.AddWithValue("@UserName", TextBox1.Text);
cmd.Parameters.AddWithValue("@Password", strp);
cmd.Parameters.AddWithValue("@Email", TextBox5.Text);
cmd.Parameters.AddWithValue("@Name", TextBox3.Text);
cmd.Parameters.AddWithValue("@Family", TextBox4.Text);
cmd.Parameters.AddWithValue("@RegistryUserDate", DateTime.Now.Date.ToString());



نکته ای که در اینجا خیلی مهمه اینه که باید پسورد وارد شده را رمز کرده و بعد در بانک ذخیره کنیم:(قسمت ویرایش شده)


string str = TextBox2.Text;
byte[] data = System.Text.UTF8Encoding.UTF8.GetBytes(str);
SHA256Managed sha = new SHA256Managed();
byte[] hashValue = sha.ComputeHash(data);
string strp = "";
foreach (byte strb in hashValue)
{
strp += strb.ToString();
}


دستور بالا عملیات رمز کردن رو انجام میده

12 در نهایت اطلاعات رو در بانک ذخیره میکنیم


upp = cmd.ExecuteNonQuery();
if (upp > 0)
{
Label1.Text = "ثبت نام با موفقیت انجام شد";
}




در اینجا یه متغیر از نوع int داریم اگه این متغیر بزرگ تر از 0 باشه(باید 1 باشه چون یک رکورد داره ذخیره میشه)
یعنی رکورد به درستی ذخیره و در نتیجه ثبت نام انجام شده است


امیدوارم به دردتون خورده باشه اگه.....به دردتون خورد بگید تا قسمت Login رو هم بزارم:لبخندساده::لبخندساده: :لبخندساده:

ahmad156
شنبه 21 دی 1392, 19:34 عصر
دوست عزیز
کار خوبی هست به اشتراک گذاشتن مطالب ولی اگه مطلبی که گذاشتین از منبعی هست و از اون دارین استفاده میکنین اون رو ذکر کنین.
مثلا Fakhravary.Message از کجا امده؟
md5 که به تاریخ پیوست!!!

طبیب دل
شنبه 21 دی 1392, 19:44 عصر
دوست عزیز
md5 که به تاریخ پیوست!!![/FONT]

میشه بگید الان بجای md5 از چی استفاده میشه؟

ahmad156
شنبه 21 دی 1392, 19:54 عصر
SHA256 (http://msdn.microsoft.com/en-us/library/system.security.cryptography.sha256%28v=vs.110%29. aspx) و SHA512 (http://msdn.microsoft.com/en-us/library/system.security.cryptography.sha512%28v=vs.110%29. aspx)

Mohammad_dn
شنبه 21 دی 1392, 20:07 عصر
مثلا Fakhravary.Message از کجا امده؟


این یه کامپوننت برای نمایش پیغام هست....البته خوب میشه داخل یه لیبل پیغام رو نشون بدی

SHA512 (http://msdn.microsoft.com/en-us/library/system.security.cryptography.sha512%28v=vs.110%29. aspx)

خوب چه طور میشه رمز های کد شده ی قبلی رو به این تبدیل کرد؟

ahmad156
شنبه 21 دی 1392, 20:23 عصر
دوست عزیز راه تبدیلی وجود نداره(تا جایی که من میدونم).این الگوریتم ها برگشت پذیر نیستند

Mohammad_dn
شنبه 21 دی 1392, 20:54 عصر
خوب حد اقل بگید چه طوری از این الگوریتم رمز نگاری استفاده کنم..(من انگلیسیم ضعیفه)

ahmad156
شنبه 21 دی 1392, 21:06 عصر
http://barnamenevis.org/showthread.php?311403-%D8%A7%D9%84%DA%AF%D9%88%D8%B1%DB%8C%D8%AA%D9%85-%D9%87%D8%A7%DB%8C-%D8%BA%DB%8C%D8%B1-%D9%82%D8%A7%D8%A8%D9%84-%D8%A8%D8%A7%D8%B2%DA%AF%D8%B4%D8%AA&highlight=SHA256Managed

Mohammad_dn
شنبه 21 دی 1392, 21:30 عصر
من یکم گیج شدم...میشه بگید کد زیر درسته یا نه؟


string str = TextBox1.Text;
byte[] data = System.Text.UTF8Encoding.UTF8.GetBytes(str);
SHA256Managed sha = new SHA256Managed();
TextBox1.Text = "";
byte[] hashValue = sha.ComputeHash(data);
foreach (byte strb in hashValue)
{
TextBox1.Text += strb.ToString();
}

ahmad156
شنبه 21 دی 1392, 22:06 عصر
روشی که من استفاده میکنم

var query = string.Format("SELECT * FROM admins WHERE username=@username AND password=@password");
var param = new SqlParameter[2];
param[0] = new SqlParameter("@username", username);
byte[] data = Encoding.UTF8.GetBytes(password);
var sha = new SHA256Managed();
byte[] hashValue = sha.ComputeHash(data);
string hashPassword = Convert.ToBase64String(hashValue);
param[1] = new SqlParameter("@password", hashPassword);
return new DbInterface().RunQuery(query, param);

Mohammad_dn
شنبه 21 دی 1392, 22:15 عصر
خوب این همون کدیه که من گذاشتم دیگه..مگه نه؟؟؟...فقط این خطش فرق میکنه:

string hashPassword = Convert.ToBase64String(hashValue);

درسته؟؟؟

راستی نحوه ی ساخت صفحه ی ثبت نامه من درسته دیگه(به غیر از رمز نگاری)؟؟؟؟

ahmad156
یک شنبه 22 دی 1392, 17:24 عصر
توی صفحات عمومی مانند ثبت نام حتما از Captcha استفاده کنین.ورودی ها را حتما از لحاظ XSS چک کنین.

Mohammad_dn
یک شنبه 22 دی 1392, 18:32 عصر
بله من توی ورودیه خودم از ولید ها و کپچا استفاده کردم....اینجا فقط کلیات رو گفتم تا دوستان بقیه ی کارا رو خودشون انجام بدن

Mohammad_dn
یک شنبه 22 دی 1392, 19:08 عصر
قسمت دوم..ورود به سایت

ورود به سایت هم تقریبا یک اتصال ساده به بانک و واکشی اطلاعات هست فقط یکم فرق میکنه

چیزایی که نیاز داریم:دو تا TextBox و یه CheckBox

فضا های نام هم مثل قبلی(ثبت نام)هستند..فقط علاوه بر فضای نام زیر:
using System.Security.Cryptography;

باید فضای نام:
using System.Web.Security;

رو هم اظافه کنید

اول از همه میایم ConnectionString رو به دست میاریم

string strConnection = WebConfigurationManager.ConnectionStrings["Site"].ToString();

من کانکشن استرینگ رو از web.config استخراج کردم

بعد از اون باید یک دستور sql ایجاد کنیم:

string strCmd = "SELECT UserName, Password FROM UserData WHERE UserName=@UserName";

ما اینجا به نام کاربری و پسورد برای ورود نیاز داریم(البته همیشه اینطور نیست..گاهی باید برسی کرد که آیا این کاربر Active شده یا نه)

کدای زیر هم که در پست اول توضیح داده شد:


SqlConnection con = new SqlConnection(strConnection);
SqlCommand cmd = new SqlCommand(strCmd, con);
SqlDataReader reader;


حالا باید پارامتر های مربوط به دستور sql مون رو مغدار دهی کنیم.در اینجا ما فقط یک پارامتر به نام(@UserName) داریم پس همونو مقدار دهی میکنیم


cmd.Parameters.AddWithValue("@UserName", TextBox1.Text);


در ادامه ی کار به بانک وصل میشیم و اطلاعات رو واکشی میکنیم...

بعد از واکشی باید برسی کنیم که آیا نام کاربری وارد شده با پسورد وارد شده مچ هستند یا نه ... و یا اصلا چنین نام کاربری ای وجود داره یا نه

برای این که بفهمیم پسورد وارد شده صحیح است باید پسوردی را که کاربر در فرم ورود وارد کرده را دوباره رمز کنیم و پسورد رمز شده ی ورودی را با پسورد رمز شده ای که در بانک (به هنگام ثبت نام) ذخیره شده است مقایسه کنیم(پسورد های رمز شده قابل بازگشت نیستند به همین دلیل باید پسورد ورودی رو هم رمز کنیم و برسی کنیم)

رمز کردن پسورد:


string str = TextBox2.Text;
byte[] data = System.Text.UTF8Encoding.UTF8.GetBytes(str);
SHA256Managed sha = new SHA256Managed();
byte[] hashValue = sha.ComputeHash(data);
string strp = "";
foreach (byte strb in hashValue)
{
strp += strb.ToString();
}


خوب حالا که پسورد رمز شد باید پسورد جدید رو با پسورد قبلی مقایسه کنیم:


if (reader["Password"].ToString() == strp)


اگه شرط درست باشه(یعنی پسورد ورودی با پسورد ذخیره شده یکی باشه) کد ها ادامه پیدا میکنه:

خوب اگه یادتون باشه ما یک چک باکس روی صفحه گذاشته بودیم
این چک باکس در واقه همون چک باکسی هست که در اغلب فرمای ورود با عنوان(مرا به خاطر بسپار) وجود دارد

کد زیر برای وارد کردن کاربر به سایت در صورتی که کاربر چک باکس را فعال کرده باشد:


int intTime = (int)TimeSpan.FromDays(365).TotalMinutes;
FormsAuthenticationTicket ti = new FormsAuthenticationTicket(TextBox1.Text,
true, intTime);
string enti = FormsAuthentication.Encrypt(ti);
HttpCookie cok = new HttpCookie(FormsAuthentication.FormsCookieName, enti);
cok.Expires = ti.Expiration;
HttpContext.Current.Response.Cookies.Set(cok);
string strm = FormsAuthentication.GetRedirectUrl(TextBox1.Text, false);
Response.Redirect(strm, true);


توضیحات:ما ابتدا یک متغیر از نوع int داریم ....توی این متغیر زمان انقضای کوکی ذخیره میشود(در واقع زمانی است که کاربر به خاطر سپرده میشه)

ti که از نوع (FormsAuthenticationTicket) است که در واقع یک بلیت امنیتی را در خود نگه میدارد(برای مثال شئ FormsIdentity از طریق خصوصیتی به نام Ticket یک بلیط امنیتی برمیگرداند که واسط IIdentity تعریف نشده است و لذا مستقیما از طریق شئ User.Identity قابل دسترس نیست.این بلیط نمونه ای از کلاس FormsAuthenticationTicket است و جزئیات مفیدی دارد،ماننده زمانی که کاربر وارد سیستم سده و زمانی که بلیط وی منقضی خواهد شد)

شئ ti را کد میکنیم...و بعد از ست کردن زمان کوکی (زمان ماندگاری) کاربر را وارد کرده به صفحه ای که از اون اومده بر میگردونیم

خوب اگه چک باکس رو فعال نکرده بود از کد زیر استفاده میکنیم:

FormsAuthentication.RedirectFromLoginPage(TextBox1 .Text, false);

با اینکار کاربر تا زمانی فعال خواهد بود که سسیشن اون از بین نرفته

خوب کاربر هم اکنون وارد سایت شده..

به دست آوردن نام کاربریه شخصی که لوگ این کرده:

User.Identity.Name

فهمیدن این که آیا کاربر وارد سایت شده یا اینکه به عنوان مهمان در سایت حضور داره:


User.Identity.IsAuthenticated


این دستور یه مقدار از نوع bool بر میگردونه



کلام آخر(توجه):در همه ی موارد برای TextBox های موجود از ولیدیشن ها استفاده کنید...و همچنین بهتره در فرم ورود و همچنین ثبت نام از کپچا استفاده بشه

موفق ، پیروز و سر بلند باشید

r_s1389@yahoo.com
یک شنبه 22 دی 1392, 21:45 عصر
سلام
تشکر که این همه زحمت کشیدین میشه خود فایل این تاپیک رو هم بذارین برا دانلود
به هر حال تشکر

ahmad156
یک شنبه 22 دی 1392, 22:35 عصر
قسمت دوم..ورود به سایت

ورود به سایت هم تقریبا یک اتصال ساده به بانک و واکشی اطلاعات هست فقط یکم فرق میکنه

چیزایی که نیاز داریم:دو تا TextBox و یه CheckBox

فضا های نام هم مثل قبلی(ثبت نام)هستند..فقط علاوه بر فضای نام زیر:
using System.Security.Cryptography;

باید فضای نام:
using System.Web.Security;

رو هم اظافه کنید

اول از همه میایم ConnectionString رو به دست میاریم

string strConnection = WebConfigurationManager.ConnectionStrings["Site"].ToString();

من کانکشن استرینگ رو از web.config استخراج کردم

بعد از اون باید یک دستور sql ایجاد کنیم:

string strCmd = "SELECT UserName, Password FROM UserData WHERE UserName=@UserName";

ما اینجا به نام کاربری و پسورد برای ورود نیاز داریم(البته همیشه اینطور نیست..گاهی باید برسی کرد که آیا این کاربر Active شده یا نه)

کدای زیر هم که در پست اول توضیح داده شد:


SqlConnection con = new SqlConnection(strConnection);
SqlCommand cmd = new SqlCommand(strCmd, con);
SqlDataReader reader;


حالا باید پارامتر های مربوط به دستور sql مون رو مغدار دهی کنیم.در اینجا ما فقط یک پارامتر به نام(@UserName) داریم پس همونو مقدار دهی میکنیم


cmd.Parameters.AddWithValue("@UserName", TextBox1.Text);


در ادامه ی کار به بانک وصل میشیم و اطلاعات رو واکشی میکنیم...

بعد از واکشی باید برسی کنیم که آیا نام کاربری وارد شده با پسورد وارد شده مچ هستند یا نه ... و یا اصلا چنین نام کاربری ای وجود داره یا نه

برای این که بفهمیم پسورد وارد شده صحیح است باید پسوردی را که کاربر در فرم ورود وارد کرده را دوباره رمز کنیم و پسورد رمز شده ی ورودی را با پسورد رمز شده ای که در بانک (به هنگام ثبت نام) ذخیره شده است مقایسه کنیم(پسورد های رمز شده قابل بازگشت نیستند به همین دلیل باید پسورد ورودی رو هم رمز کنیم و برسی کنیم)

رمز کردن پسورد:


string str = TextBox2.Text;
byte[] data = System.Text.UTF8Encoding.UTF8.GetBytes(str);
SHA256Managed sha = new SHA256Managed();
byte[] hashValue = sha.ComputeHash(data);
string strp = "";
foreach (byte strb in hashValue)
{
strp += strb.ToString();
}


خوب حالا که پسورد رمز شد باید پسورد جدید رو با پسورد قبلی مقایسه کنیم:


if (reader["Password"].ToString() == strp)


اگه شرط درست باشه(یعنی پسورد ورودی با پسورد ذخیره شده یکی باشه) کد ها ادامه پیدا میکنه:

خوب اگه یادتون باشه ما یک چک باکس روی صفحه گذاشته بودیم
این چک باکس در واقه همون چک باکسی هست که در اغلب فرمای ورود با عنوان(مرا به خاطر بسپار) وجود دارد

کد زیر برای وارد کردن کاربر به سایت در صورتی که کاربر چک باکس را فعال کرده باشد:


int intTime = (int)TimeSpan.FromDays(365).TotalMinutes;
FormsAuthenticationTicket ti = new FormsAuthenticationTicket(TextBox1.Text,
true, intTime);
string enti = FormsAuthentication.Encrypt(ti);
HttpCookie cok = new HttpCookie(FormsAuthentication.FormsCookieName, enti);
cok.Expires = ti.Expiration;
HttpContext.Current.Response.Cookies.Set(cok);
string strm = FormsAuthentication.GetRedirectUrl(TextBox1.Text, false);
Response.Redirect(strm, true);


توضیحات:ما ابتدا یک متغیر از نوع int داریم ....توی این متغیر زمان انقضای کوکی ذخیره میشود(در واقع زمانی است که کاربر به خاطر سپرده میشه)

ti که از نوع (FormsAuthenticationTicket) است که در واقع یک بلیت امنیتی را در خود نگه میدارد(برای مثال شئ FormsIdentity از طریق خصوصیتی به نام Ticket یک بلیط امنیتی برمیگرداند که واسط IIdentity تعریف نشده است و لذا مستقیما از طریق شئ User.Identity قابل دسترس نیست.این بلیط نمونه ای از کلاس FormsAuthenticationTicket است و جزئیات مفیدی دارد،ماننده زمانی که کاربر وارد سیستم سده و زمانی که بلیط وی منقضی خواهد شد)

شئ ti را کد میکنیم...و بعد از ست کردن زمان کوکی (زمان ماندگاری) کاربر را وارد کرده به صفحه ای که از اون اومده بر میگردونیم

خوب اگه چک باکس رو فعال نکرده بود از کد زیر استفاده میکنیم:

FormsAuthentication.RedirectFromLoginPage(TextBox1 .Text, false);

با اینکار کاربر تا زمانی فعال خواهد بود که سسیشن اون از بین نرفته

خوب کاربر هم اکنون وارد سایت شده..

به دست آوردن نام کاربریه شخصی که لوگ این کرده:

User.Identity.Name

فهمیدن این که آیا کاربر وارد سایت شده یا اینکه به عنوان مهمان در سایت حضور داره:


User.Identity.IsAuthenticated


این دستور یه مقدار از نوع bool بر میگردونه



کلام آخر(توجه):در همه ی موارد برای TextBox های موجود از ولیدیشن ها استفاده کنید...و همچنین بهتره در فرم ورود و همچنین ثبت نام از کپچا استفاده بشه

موفق ، پیروز و سر بلند باشید

با احترام به دوستمون، اینجا (http://barnamenevis.org/showthread.php?415958-%D8%AA%D8%B9%DB%8C%DB%8C%D9%86-%D8%A7%D8%B9%D8%AA%D8%A8%D8%A7%D8%B1-%D8%A8%D8%A7-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-FormsAuthentication&highlight=formsauthentication)بحث رو کامل توضیح داده

Mohammad_dn
یک شنبه 22 دی 1392, 23:29 عصر
با احترام به دوستمون، اینجا (http://barnamenevis.org/showthread.php?415958-%D8%AA%D8%B9%DB%8C%DB%8C%D9%86-%D8%A7%D8%B9%D8%AA%D8%A8%D8%A7%D8%B1-%D8%A8%D8%A7-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-FormsAuthentication&highlight=formsauthentication)بحث رو کامل توضیح داده

بله دوستان باید مطالبی رو که در تاپیک آقای احمدی هم گفته شده در نظر بگیرن(و البته + مسائل امنیتی دیگر)

من روند کار رو برای آشنایی دوستان گفتم کلیت کار همینه...به خاطر این گذاشتم که خیلیا درست کردن اینو(صفحه ی ورود و ثبت نام) خیلی سخت میگرفتن...و چندین بار دیدم که میپرسیدن "چطور صفحه ی لوگ این خودمونو بسازیم؟"


تشکر که این همه زحمت کشیدین میشه خود فایل این تاپیک رو هم بذارین برا دانلود

چشم در اصرع وقت میزارم

Mohammad_dn
دوشنبه 23 دی 1392, 21:20 عصر
سلام

اینم از سورس صفحه ی لوگ این و ثبت نام در سایت

توی این سورس از ولیدیشن ها + کپچا هم استفاده شده

اسکریپت ساخت Table هم ضمیمه کردم

mRizvandi
یک شنبه 25 اسفند 1392, 14:51 عصر
به دنبال مطلبی بودم که به این آموزش برخوردم، اول از شما تشکر میکنم چون مطالب آموزشی خوبی در مطلب شما وجود داره. و این خیلی خوبه که با توجه به جنبه آموزشی این موضوع رو شرح دادید.

اما همانطور که حتما شما هم می دونید در ASP.NET کنترلهای کاملی برای ساخت کاربر، لاگین، وضعیت و ... وجود داره و اصولا نیازی به این همه کد نویسی نیست. کافی است در مراحلی خیلی ساده، ممبرشیپ و پروفایل رو در پروژه خود استفاده کنید.
کنترل CreateUserWisard یک کنترل همه کاره با کلی امکانات هست که عملیات ساخت کاربر رو انجام میده، از لحاظ ظاهری هم کاملا دست برنامه نویس بازه، از لحاظ کد نویسی هم همینطور. برای لاگین و ... هم همین شرایط وجود داره.
ساخت جداول موردنیاز برای ممبرشیب و پروفایل Membership, Profile هم توسط یکی از ابزارهای دات نت صورت می گیره و کلیه جداول، استورپروسیجرها، ویوها و... هم ساخته میشه.
کافیست که وب سایت خودتون رو کانفیگ کنید.
موفق باشید.