سفارشی ساختن کنترل تغییر رمز عبور بدون استفاده از Membership Provider در Asp.Net

سه شنبه 4 فروردین 1394

در این مقاله نحوه سفارشی سازی تغییر رمز عبور بدون استفاده از کلاس Membership Provider در Asp.Net با استفاده از دستورات #C و VB.Net را شرح میدهیم .

سفارشی ساختن کنترل تغییر رمز عبور بدون استفاده از Membership Provider در Asp.Net

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

در ابتدا یک بانک اطلاعاتی با نام  LoginDB  میسازیم ,سپس یک جدول با نام  Users  در داخل بانک ساخته شده ایجاد می کنیم .

سپس رکوردهای مورد نظر را به صورت پیش فرض تکمیل میکنیم :

تگ HTML شامل کنترل ChangePassword و یک Label می باشد , برای کنترل ChangePassword شامل خصوصیات زیر میباشد :

1 - OnChangingPassword : این رویداد روند تغییر پسورد را مدیریت می کند .

2 - CancelDestinationPageUrl : در صورت کلیک دکمه Cancel کاربر را به صفحه مشخص شده هدایت می کند.

3 - NewPasswordRegularExpression : برای اعتبار سنجی بیشتر سیاست تولید رمز استفاده میشود .که در حال حاضر ما میخواهیم کاربر را محدود کنیم که حد اقل 5 کلمه برای رمز عبور وارد نماید .

4 - NewPasswordRegularExpressionErrorMessage : پیغام خطا میباشد که در صورت مجاز نبودن رمز وارد شده جدید با سیاست تعیین شده توسط ما نمایش داده میشود .

تگ label برای نمایش موفقیت در اعمال تغییر رمز استفاده میشود :

<asp:ChangePassword ID="ChangePassword1" runat="server" OnChangingPassword="OnChangingPassword"
    RenderOuterTable="false" NewPasswordRegularExpression="^[\s\S]{5,}$" NewPasswordRegularExpressionErrorMessage="Password must be of minimum 5 characters." CancelDestinationPageUrl = "~/Home.aspx">
</asp:ChangePassword>
<br />
<asp:Label ID="lblMessage" runat="server" />

ما باید namespace های مورد نظر را نیز به پروژه اضافه کنیم :

کد #C :

using System.Drawing;
using System.Configuration;
using System.Data.SqlClient;

کد VB.NET :


Imports System.Drawing
Imports System.Configuration
Imports System.Data.SqlClient

زمانی که دکمه ChangePassword را کلیک میکنیم رویداد اجرا میشود .اول از همه چک میشود که رمز جدید با رمز قبلی یکی نباشد , در صورت یکی بودن label داخل کنترل پیغام خطایی را نمایش می دهد .سپس چک میکند که حتمی حد اقل از 1 کلمه بیشتر باشد , و مجدد با سیاست تعیین شده کلمات وارد شده را مطابقت می دهد .

کد #C :


protected void OnChangingPassword(object sender, LoginCancelEventArgs e)
{
    if (!ChangePassword1.CurrentPassword.Equals(ChangePassword1.NewPassword, StringComparison.CurrentCultureIgnoreCase))
    {
        int rowsAffected = 0;
        string query = "UPDATE [Users] SET [Password] = @NewPassword WHERE [Username] = @Username AND [Password] = @CurrentPassword";
        string constr = ConfigurationManager.ConnectionStrings["constr"].ConnectionString;
        using (SqlConnection con = new SqlConnection(constr))
        {
            using (SqlCommand cmd = new SqlCommand(query))
            {
                using (SqlDataAdapter sda = new SqlDataAdapter())
                {
                    cmd.Parameters.AddWithValue("@Username", this.Page.User.Identity.Name);
                    cmd.Parameters.AddWithValue("@CurrentPassword", ChangePassword1.CurrentPassword);
                    cmd.Parameters.AddWithValue("@NewPassword", ChangePassword1.NewPassword);
                    cmd.Connection = con;
                    con.Open();
                    rowsAffected = cmd.ExecuteNonQuery();
                    con.Close();
                }
            }
            if (rowsAffected > 0)
            {
                lblMessage.ForeColor = Color.Green;
                lblMessage.Text = "Password has been changed successfully.";
            }
            else
            {
                lblMessage.ForeColor = Color.Red;
                lblMessage.Text = "Password does not match with our database records.";
            }
        }
    }
    else
    {
        lblMessage.ForeColor = Color.Red;
        lblMessage.Text = "Old Password and New Password must not be equal.";
    }
 
    e.Cancel = true;
}

کد VB.NET :


Protected Sub OnChangingPassword(sender As Object, e As LoginCancelEventArgs)
    If Not ChangePassword1.CurrentPassword.Equals(ChangePassword1.NewPassword, StringComparison.CurrentCultureIgnoreCase) Then
        Dim rowsAffected As Integer = 0
        Dim query As String = "UPDATE [Users] SET [Password] = @NewPassword WHERE [Username] = @Username AND [Password] = @CurrentPassword"
        Dim constr As String = ConfigurationManager.ConnectionStrings("constr").ConnectionString
        Using con As New SqlConnection(constr)
            Using cmd As New SqlCommand(query)
                Using sda As New SqlDataAdapter()
                    cmd.Parameters.AddWithValue("@Username", Me.Page.User.Identity.Name)
                    cmd.Parameters.AddWithValue("@CurrentPassword", ChangePassword1.CurrentPassword)
                    cmd.Parameters.AddWithValue("@NewPassword", ChangePassword1.NewPassword)
                    cmd.Connection = con
                    con.Open()
                    rowsAffected = cmd.ExecuteNonQuery()
                    con.Close()
                End Using
            End Using
            If rowsAffected > 0 Then
                lblMessage.ForeColor = Color.Green
                lblMessage.Text = "Password has been changed successfully."
            Else
                lblMessage.ForeColor = Color.Red
                lblMessage.Text = "Password does not match with our database records."
            End If
        End Using
    Else
        lblMessage.ForeColor = Color.Red
        lblMessage.Text = "Old Password and New Password must not be equal."
    End If
 
    e.Cancel = True
End Sub

اگر شما از .net framework 4 یا بالاتر استفاده می کنید ممکن است که با پیغام خطا مواجه شوید , برای رفع این مشکل تگ زیر را در داخل System.Web اضافه میکنید :


<pages controlRenderingCompatibilityVersion = "3.5"></pages>

برنامه نویسان

نویسنده 3355 مقاله در برنامه نویسان

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

در صورتی که در رابطه با این مقاله سوالی دارید، در تاپیک های انجمن مطرح کنید