PDA

View Full Version : مقاله: طرز تهیه Activation Register Account



mostafa_sgh
یک شنبه 05 آبان 1387, 17:25 عصر
سلام به همه دوستان گرامی
این مقاله بنا به درخواست دوستان تهیه و در اینجا گرد آورده شده است .
با نظراتتان ما را در بهبود فهم و منطق آن کمک کنید.
امیدواریم مورد پسندتان قرار بگیرد ...

طرز تهیه Activation Register Account برای شام :لبخند:

1 . ابتدا مراحل ثبت نام کاربر را به اتمام برسانیم .( نام صفحه Register.aspx )
2 . احتیاج به 1 یا 2 فیلد بسته بنا به سلیقه داخل دیتابیستون داریم .

الف ) فیلدی به نام Status از نوع Bit ( بولین ) که باید در موقع ثبت مقدارش False باشد
ب ) فیلدی برای کلید Active به نام ActiveKey از نوع varchar(40) ( در اینجا کلید توسط GUID تولید می شود )
توضیح : این کلید میتواند Email و یا نام کاربری و یا یک کلید ساخت خودتون( Guid , یا تمام الگوریتم هائی که برای تولید کلید به کار میرود ) باشد.

3 . بعد از ساخت فیلد ها باید این کلید رو ساخته و در دیتابیس ذخیره و در ایمیل حاوی اطلاعات مربوط به Active به عنوان یک پارامتر در یک لینک برای کاربر ارسال می کنیم .

Namespaces :
System.Data.SqlClient
System.Net.Mail



protected void btnRegister_Click(object sender, EventArgs e)
{
// Create Activation Key & Url
string accountKey = Guid.NewGuid().ToString().Replace("-", string.Empty).ToUpper();
string activeLink = "http://www.mysite.com/ActiveUser.aspx?uid=" + accountKey;
// Insert Account Info in the database with accountkey
int result = -1;
SqlConnection sp_conn = new SqlConnection(connectionString);
SqlCommand sp_comm = new SqlCommand();
sp_comm.CommandType = CommandType.Text;
sp_comm.Connection = sp_conn;
sp_comm.CommandText = "Insert Into tblUsers VALUES(@Name,@Email,@ActiveKey,@Status)";
sp_comm.Parameters.AddWithValue("Name", txtName.Text);
sp_comm.Parameters.AddWithValue("Email", txtEmail.Text);
sp_comm.Parameters.AddWithValue("ActiveKey", accountKey);
sp_comm.Parameters.AddWithValue("Status", false);
try
{
sp_conn.Open();
result = sp_comm.ExecuteNonQuery();
sp_conn.Close();
}
catch
{
if (sp_conn != null)
sp_conn.Close();
}
finally
{
switch (result)
{
case 1:
ShowResult("Create User Successfully .");
SendEmail(txtEmail.Text,txtName.Text,activeLink);
break;
case -1:
case 0 :
ShowResult("Create User Failed !");
break;
}
}
}
private void SendEmail(string email,string name,string key)
{
// Send Email to user's Email Address with active link
try
{
MailMessage msg = new MailMessage();
msg.From = new MailAddress("info@domain.com", "My site Registratration");
msg.To.Add(new MailAddress(email, name, Encoding.UTF8));
msg.Subject = "My site - Register Account";
msg.IsBodyHtml = true;
msg.DeliveryNotificationOptions = DeliveryNotificationOptions.None;
msg.Priority = MailPriority.Normal;
msg.ReplyTo = new MailAddress("support@domain.com", "My site Support Systems");
StreamReader sr = new StreamReader(Server.MapPath("~/ActiveMail.htm"));
string temp = sr.ReadToEnd();
temp = temp.Replace("[###Name###]", name).Replace("[###Url###]", key);
msg.Body = temp;
SmtpClient smtp = new SmtpClient("mail.domain.com");
System.Net.NetworkCredential perm = System.Net.NetworkCredential("account@domain.com", "password");
smtp.Credentials = perm;
smtp.Send(msg);
ShowResult("Send Email Success !");
}
catch
{
ShowResult("Send Email Failed !");
}
}
private void ShowResult(string p)
{
lblStatus.Text = p;
}


4 . در این مرحله کاربر بر روی لینکی که تولید کردیم، کلیک میکند و به صفحه ActiveUser.aspx وارد میشود.
توضیح : در این صفحه پارامتر uid رو چک میکنیم و بعد در صورت مثبت بودن :



protected void Page_Load(object sender, EventArgs e)
{
// Check this Key with your database
string key = Request.QueryString["uid"];
if (!string.IsNullOrEmpty(key))
{
int result = -1;
SqlConnection sp_conn = new SqlConnection(connectionString);
SqlCommand sp_comm = new SqlCommand();
sp_comm.CommandType = CommandType.Text;
sp_comm.Connection = sp_conn;
sp_comm.CommandText = "Update tblUsers Set Status = 1 Where( Status = 0 ) And ( ActiveKey = @ActiveKey )";
sp_comm.Parameters.AddWithValue("ActiveKey", key);
try
{
sp_conn.Open();
result = sp_comm.ExecuteNonQuery();
sp_conn.Close();
}
catch
{
if (sp_conn != null)
sp_conn.Close();
}
finally
{
switch (result)
{
case 1:
ShowResult("Active User Successfully .");
break;
case -1:
case 0:
ShowResult("Invalid Activation Key !");
break;
}
}
}
}


در صورتی که کلید صحیح و قبلاً فعال نشده بود ، فیلد Status کاربر مربوطه را True میکنیم.

فایل ActiveMail.htm


<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>.:: My Site - Active Register Account ::.</title>
</head>
<body>
<div align="center">
<div style="width:90%" align="left">
Dear [###Name###]<br/>
<br/>
Thanks for using this site<br/>
<br/>
To continue registering account , you should active it .<br/>
Click this link below to Active your account :<br/>
<br/>
<a href="[###Url###]">[###Url###]</a></div>
</div>
</body>
</html>


حالا غذا آماده است ، بچه ها رو صدا کنید بیان شام بخورن !!!!!!
بچه ها شرمنده .....
غذا یه خورده بی نمکه !

منتظر نظزات و پیشنهادات برای بهبود این مقاله هستیم ....

vb_bmw
یک شنبه 05 آبان 1387, 21:34 عصر
سلام دوستم!

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



temp = temp.Replace("[###Name###]", name).Replace("[###Url###]", key)

باعث افت کارایی میشه!!!

merlin_vista
یک شنبه 05 آبان 1387, 22:11 عصر
سلام دوستم!

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



temp = temp.Replace("[###Name###]", name).Replace("[###Url###]", key)باعث افت کارایی میشه!!!

پس ميشه بگيد چه كاري انجام بديم . :متفکر:
شما راه بهتري ميشناسيد ، لطفاً اعلام كنيد . :متفکر:

لطفاً براي حرف خود دليل و مدرك ارائه دهيد :لبخندساده:

mostafa_sgh
دوشنبه 06 آبان 1387, 11:27 صبح
سلام به رفقای عزیزم

این هم کد VB.Net :


Imports System.Data.SqlClient
Imports System.Net.Mail
Imports System.Data



Protected Sub btnRegister_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnRegister.Click
' Create Activation Key & Url
Dim accountKey As String = Guid.NewGuid().ToString().Replace("-", String.Empty).ToUpper()
Dim activeLink As String = "http://www.mysite.com/ActiveUser.aspx?uid=" + accountKey
' Insert Account Info in the database with accountkey
Dim result As Integer = -1
Dim sp_conn As New SqlConnection("Your Connection String")
Dim sp_comm As New SqlCommand()
sp_comm.CommandType = CommandType.Text
sp_comm.Connection = sp_conn
sp_comm.CommandText = "Insert Into tblUsers VALUES(@Name,@Email,@ActiveKey,@Status)"
sp_comm.Parameters.AddWithValue("Name", txtName.Text)
sp_comm.Parameters.AddWithValue("Email", txtEmail.Text)
sp_comm.Parameters.AddWithValue("ActiveKey", accountKey)
sp_comm.Parameters.AddWithValue("Status", False)
Try
sp_conn.Open()
result = sp_comm.ExecuteNonQuery
sp_conn.Close()
Catch ex As Exception
If Not (sp_conn Is Nothing) Then
sp_conn.Close()
End If
Finally
Select Case (result)
Case 1
ShowResult("Create User Successfully .")
SendEmail(txtEmail.Text, txtName.Text, activeLink)
Case -1
Case 0
ShowResult("Create User Failed !")
End Select
End Try
End Sub

Private Sub SendEmail(ByVal email As String, ByVal name As String, ByVal key As String)
' Send Email to user's Email Address with active link
Try
Dim msg As New MailMessage()
msg.From = New MailAddress("info@domain.com", "My site Registratration")
msg.To.Add(New MailAddress(email, name, Encoding.UTF8))
msg.Subject = "My site - Register Account"
msg.IsBodyHtml = True
msg.DeliveryNotificationOptions = DeliveryNotificationOptions.None
msg.Priority = MailPriority.Normal
msg.ReplyTo = New MailAddress("support@domain.com", "My Domain Support Systems")
Dim sr As New StreamReader(Server.MapPath("~/ActiveMail.htm"))
Dim temp As String = sr.ReadToEnd()
temp = temp.Replace("[###Name###]", name).Replace("[###Url###]", key)
msg.Body = temp
Dim smtp As New SmtpClient("mail.domain.com")
Dim perm AsNew System.Net.NetworkCredential("account@domain.com", "password")
smtp.Credentials = perm;
smtp.Send(msg)
ShowResult("Send Email Success !")
Catch ex As Exception
ShowResult("Send Email Failed !")
End Try
End Sub

Private Sub ShowResult(ByVal p As String)
lblStatus.Text = p
End Sub


ActivUser.aspx



Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
' Check this Key with your database
Dim key As String = Request.QueryString("uid")
If Not (String.IsNullOrEmpty(key)) Then
Dim result As Integer = -1
Dim sp_conn As New SqlConnection("Your Connection String")
Dim sp_comm As New SqlCommand()
sp_comm.CommandType = CommandType.Text
sp_comm.Connection = sp_conn
sp_comm.CommandText = "Update tblUsers Set Status = 1 Where( Status = 0 ) And ( ActiveKey = @ActiveKey )"
sp_comm.Parameters.AddWithValue("ActiveKey", key)
Try
sp_conn.Open()
result = sp_comm.ExecuteNonQuery
sp_conn.Close()
Catch ex As Exception
If Not (sp_conn Is Nothing) Then
sp_conn.Close()
End If
Finally
Select Case (result)
Case 1
ShowResult("Active User Successfully .")
Case -1
Case 0
ShowResult("Invalid Activation Key !")
End Select
End Try
End If
End Sub

mostafa_sgh
سه شنبه 07 آبان 1387, 16:04 عصر
با سلام مجدد خدمت دوستان

شما مطابق با شرایطی که دارید باید تنظیمات مربوط به ارسال ایمیل را انجام دهید :

اصلاح تنظیمات مربوط به ارسال ایمیل برای کامپیوتر محلی :

VB.NET


Dim smtp As New SmtpClient("localhost")


#C

SmtpClient smtp = new SmtpClient("localhost");


اصلاح تنظیمات مربوط به ارسال ایمیل برای هاست :

VB.Net


Dim smtp As New SmtpClient("mail.domain.com")
Dim perm As New System.Net.NetworkCredential("account@domain.com", "password")
smtp.Credentials = perm;

#C

SmtpClient smtp = new SmtpClient("mail.domain.com");
System.Net.NetworkCredential perm = System.Net.NetworkCredential("account@domain.com", "password");
smtp.Credentials = perm;

hobab-theme
جمعه 19 تیر 1388, 02:26 صبح
string accountKey = Guid.NewGuid().ToString().Replace("-", string.Empty).ToUpper();

ممنون از مقاله خوبت
میخواستم ببینم اون زیر خطی که قبل از string.Empty اومده دقیقاً چیه و برای چی باید حتماً بذاریم
اینو میگم

"-", string.Empty
وقتی من اینو مثل شما قرار میدم خروجی به صورت پیوسته نشون میده ولی وقتی مثلاً به صورت -- یا چیز دیگه ای میذارم تو خروجی بین اعداد یه - میذاره
جریان چیه؟
و وقتی هم که اینو حذف میکنم خطا میگیره؟!
اگه یه توضیح بدید ممنون میشم

milade
جمعه 19 تیر 1388, 10:40 صبح
سلام مهدی آقا
لطفاً تاپیک های قدیمی رو بالا نیار .

میخواستم ببینم اون زیر خطی که قبل از string.Empty اومده دقیقاً چیه و برای چی باید حتماً بذاریم
آقا مصطفی برای تولید کد رندم از Guid استفاده کرده .
خوب اگه در جریان باشی یه Guid حتماً درش - هست . که برای امنیت یا دلیل دیگه اون رو فیلتر کرده !

موفق باشی عزیز .

hobab-theme
جمعه 19 تیر 1388, 13:26 عصر
سلام به آقا میلاد گلم

لطفاً تاپیک های قدیمی رو بالا نیار .
شما به بزرگی خودتون ببخشید:چشمک: ولی این تاپیک جز تاپیکهایی بود که تو این قسمت گذاشته شده
فهرست مقالات، پروژه ها و تاپیک های مفید تالار ASP.NET (در حال تکمیل) (http://barnamenevis.org/forum/showthread.php?t=141777)
فکر نکنم اشکالی داشته باشه که اونا رو باز کنیم . به هر حال بازم عذر میخوام

خوب اگه در جریان باشی یه Guid حتماً درش - هست . که برای امنیت یا دلیل دیگه اون رو فیلتر کرده
ممنون از جوابت
موفق باشی عزیز:قلب:

mehrdad201
دوشنبه 06 دی 1389, 20:04 عصر
یه سوال. اگه ما بخوایم برای سیستم ممبر شیپ مایکروسافت این سیستم فعالسازی رو پیاده کنیم. چه راهی رو پیشنهاد میدید ؟ استفاده از یک فیلد خاص در پروفایل کاربر جهت تایید اینکه یوزر فعال شده یا نه ؟ یا اینکه از خودت خاصیت is Approved کمک بگیریم بهتره ؟

mostafa_sgh
چهارشنبه 08 دی 1389, 10:01 صبح
به نظر من اگه دیتابیس رو شلوغش نکنیم بهتره
از آنجایی که مشکلات متعددی در استفاده از Profile وجود داره ( نمونه بارز آن جستجو در آیتم های Profile در موارد با کاربران زیاد که Performance را پایین میاره که ترجیح میدم به جاش از یک Table برای این کار استفاده کنم )
من خودم از خاصیت Approved و از GUID های asp_Users و asp_Membership به عنوان کلید برای این کار استفاده کرده ام.
البته اگه خواستید امنیت بازم بیشتر بشه میتونید یکی از GUID ها رو با الگوریتم Cryptography رمز کنید.

mehrdad201
چهارشنبه 08 دی 1389, 11:46 صبح
اقا مصطفی عزیز توضیح میدی سیستمت رو چطور پیاده سازی میکنی. GUID رو مستقیم از دیتابیس میخونی ؟!؟

mostafa_sgh
چهارشنبه 08 دی 1389, 12:33 عصر
مراحل کار بدین صورت هستش :




MembershipCreateStatus status;

MembershipUser user = Membership.CreateUser(userName, password, email, null, null, false, null, out status);

if (status == MembershipCreateStatus.Success)

{

string userKey = user.ProviderUserKey.ToString();



// Send email to user



}

mehrdad201
چهارشنبه 08 دی 1389, 14:23 عصر
برای بررسی اینکه از مدت زمان مشخص شده گذشته یا نه. (دیدی که بعضی سایت ها اگه مثلا 24 ساعت بگذره اون لینک فاقد اعتبار میشه) برای اینکار چطوری عمل میکنی ؟

فیلد تاریخ انقضا رو جدا در نظر میگیری یا از همین ابجکتهای موجود استفاده میکنی ؟

mostafa_sgh
چهارشنبه 08 دی 1389, 18:42 عصر
برای این کار از یک فیلد جدید با نام ActivationKeyCreatedDate استفاده کنید.

بدین صورت که با استفاده از TimeSpan زمان فعلی را با زمان ActivationKeyCreatedDate بررسی کرده و در صورتی که تفاوت بیشتر از 72 ساعت ( 3 روز ) بود، کاربر اکتیو نشه.

البته من یه عذر خواهی بکنم از پست قبلی :

این مطلب برای 2 سال پیش هستش و اگه بخوام امروز این کارو انجام بدم بسیار متفاوت خواهد بود.

من به یک نکته توجه نکردم و اون هم این بود که بعضی ها نمیتونن یا بنا به هر دلیلی نتونستن کاربرشون رو اکتیو کنن، در این صورت اگر از GUID های aspnet_Users استفاده کنید با مشکل مواجه میشید و اون هم اینه که برای ارسال مجدد کلید فعال سازی باید GUID قبلی رو تغییر بدی و این کار هم غیر منطقی خواهد بود.
در نتیجه برای کلید فعال سازی از یک فیلد مجزا استفاده کنید ، بهتر است.

mehrdad201
چهارشنبه 08 دی 1389, 19:02 عصر
ممنون. یعنی میفرمایید یه GUID خودمون (بر اساس یه سری فیلدها مثل آیدی کاربر - زمان ثبت نام و .... ) ایجاد کنیم و از اون استفاده کنیم.
حالا یک سوال. این GUID و ActivationKeyCreatedDate رو کجا نگه داریم؟ درون 2 پراپرتی از ابجکت پروفایل کاربر یا مستقیم توی دیتابیس ؟

mostafa_sgh
چهارشنبه 08 دی 1389, 19:12 عصر
به نظر من این ستون ها رو در همان جدول asp_Membership ایجاد کنید بهتر است.

hamid2reza
جمعه 26 خرداد 1391, 15:58 عصر
سلام به تمامي اساتيد
خواهشمندم به صورت pdfبذارين چون برنامه مشكل دار

r_s1389@yahoo.com
چهارشنبه 01 خرداد 1392, 21:25 عصر
سلام به رفقای عزیزم

این هم کد VB.Net :


Imports System.Data.SqlClient
Imports System.Net.Mail
Imports System.Data



Protected Sub btnRegister_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnRegister.Click
' Create Activation Key & Url
Dim accountKey As String = Guid.NewGuid().ToString().Replace("-", String.Empty).ToUpper()
Dim activeLink As String = "http://www.mysite.com/ActiveUser.aspx?uid=" + accountKey
' Insert Account Info in the database with accountkey
Dim result As Integer = -1
Dim sp_conn As New SqlConnection("Your Connection String")
Dim sp_comm As New SqlCommand()
sp_comm.CommandType = CommandType.Text
sp_comm.Connection = sp_conn
sp_comm.CommandText = "Insert Into tblUsers VALUES(@Name,@Email,@ActiveKey,@Status)"
sp_comm.Parameters.AddWithValue("Name", txtName.Text)
sp_comm.Parameters.AddWithValue("Email", txtEmail.Text)
sp_comm.Parameters.AddWithValue("ActiveKey", accountKey)
sp_comm.Parameters.AddWithValue("Status", False)
Try
sp_conn.Open()
result = sp_comm.ExecuteNonQuery
sp_conn.Close()
Catch ex As Exception
If Not (sp_conn Is Nothing) Then
sp_conn.Close()
End If
Finally
Select Case (result)
Case 1
ShowResult("Create User Successfully .")
SendEmail(txtEmail.Text, txtName.Text, activeLink)
Case -1
Case 0
ShowResult("Create User Failed !")
End Select
End Try
End Sub

Private Sub SendEmail(ByVal email As String, ByVal name As String, ByVal key As String)
' Send Email to user's Email Address with active link
Try
Dim msg As New MailMessage()
msg.From = New MailAddress("info@domain.com", "My site Registratration")
msg.To.Add(New MailAddress(email, name, Encoding.UTF8))
msg.Subject = "My site - Register Account"
msg.IsBodyHtml = True
msg.DeliveryNotificationOptions = DeliveryNotificationOptions.None
msg.Priority = MailPriority.Normal
msg.ReplyTo = New MailAddress("support@domain.com", "My Domain Support Systems")
Dim sr As New StreamReader(Server.MapPath("~/ActiveMail.htm"))
Dim temp As String = sr.ReadToEnd()
temp = temp.Replace("[###Name###]", name).Replace("[###Url###]", key)
msg.Body = temp
Dim smtp As New SmtpClient("mail.domain.com")
Dim perm AsNew System.Net.NetworkCredential("account@domain.com", "password")
smtp.Credentials = perm;
smtp.Send(msg)
ShowResult("Send Email Success !")
Catch ex As Exception
ShowResult("Send Email Failed !")
End Try
End Sub

Private Sub ShowResult(ByVal p As String)
lblStatus.Text = p
End Sub


ActivUser.aspx



Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
' Check this Key with your database
Dim key As String = Request.QueryString("uid")
If Not (String.IsNullOrEmpty(key)) Then
Dim result As Integer = -1
Dim sp_conn As New SqlConnection("Your Connection String")
Dim sp_comm As New SqlCommand()
sp_comm.CommandType = CommandType.Text
sp_comm.Connection = sp_conn
sp_comm.CommandText = "Update tblUsers Set Status = 1 Where( Status = 0 ) And ( ActiveKey = @ActiveKey )"
sp_comm.Parameters.AddWithValue("ActiveKey", key)
Try
sp_conn.Open()
result = sp_comm.ExecuteNonQuery
sp_conn.Close()
Catch ex As Exception
If Not (sp_conn Is Nothing) Then
sp_conn.Close()
End If
Finally
Select Case (result)
Case 1
ShowResult("Active User Successfully .")
Case -1
Case 0
ShowResult("Invalid Activation Key !")
End Select
End Try
End If
End Sub

اگه فایلشو رو هم بذارین عالی میشه به هر حال مرسی

مهدی امینیان
دوشنبه 26 آبان 1393, 02:11 صبح
اگر فایلش را زحمت میکشید و میزاشتین ممنون میشدم