تغییر کلمه عبور در ASP Identity

تغییر کلمه عبور در ASP Identity

بسم الله الرحمن الرحیم

آموزش Authentication در MVC

آموزش Asp.net Membership

آموزش ASP.NET Identity

آموزش 2 ASP.NET Identity

آموزش 3 ASP.NET Identity

تغییر کلمه عبور در ASP Identity

برای دریافت کد های این مقاله می توانید از طریق لینک زیر اقدام فرمایید.

دانلود کدهای پروژه
عنوان: آموزش asp.net Identity

در این آموزش قصد داریم تحوه انجام Reset Password را با استفاده از ASP Identity بررسی کنیم.

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

بسم الله الرحمن الرحیم

آموزش Authentication در MVC

آموزش Asp.net Membership

آموزش ASP.NET Identity

آموزش 2 ASP.NET Identity

آموزش 3 ASP.NET Identity

تغییر کلمه عبور در ASP Identity

برای دریافت کد های این مقاله می توانید از طریق لینک زیر اقدام فرمایید.

دانلود کدهای پروژه
عنوان: آموزش asp.net Identity

در این آموزش قصد داریم تحوه انجام Reset Password را با استفاده از ASP Identity بررسی کنیم.

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

پس از ایجاد آدرس می بایست در صورتی که آدرس توسط کاربر درخواست داده شود، ادرس را (که Token نیز نامیده می شود) به همراه کلمه عبور جدید بررسی می کنیم و در صورت مورد تایید بودن اطلاعات خود را ویرایش می کنیم.

ForgetPassword در ASP Identity

ابتدا یک View با نام ForgetPassword برای این منظور ایجاد می کنیم و کد زیر را در آن قرار می دهیم.

@model AspnetIdentitySample.Models.BeforePasswordResetViewModel

@{
    ViewBag.Title = "Forgot your password?";
}

<hgroup class="title">
    <h1>@ViewBag.Title.</h1>
</hgroup>

@using (Html.BeginForm()) {
    @Html.AntiForgeryToken()
    @Html.ValidationSummary(true)

    <fieldset class="form-horizontal">
        <legend>Forgot password</legend>

        <div class="control-group">
            @Html.LabelFor(model => model.Email, new { @class = "control-label" })
            <div class="controls">
                @Html.EditorFor(model => model.Email)
                @Html.ValidationMessageFor(model => model.Email, null, new { @class = "help-inline" })
            </div>
        </div>

        <div class="form-actions no-color">
            <input type="submit" value="Submit" class="btn" />
        </div>
    </fieldset>
}

@section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
}

کد بالا تنها یک ایمیل را از کاربر دریافت می کند.

کد Controller خود را برای این View به صورت زیر می نویسیم.

 // GET: /Account/BeforePasswordReset
[AllowAnonymous]
public ActionResult ForgotPassword()
{
  return View();
}

لینک RestPassword در ASP Identity

پس از اینکه کاربر بر روی Button Submit در View کلیک کرد می بایست در Controller خود یک Action برای دریافت ایمیل کاربر به صورت POST پیاده سازی کنیم.

Acrion  ما باید ابتدا بررسی کند که کاربری با این ایمیل در پایگاه داده ما ثبت شده است و یا خیر، در صورتی که این کاربر وجود دارد یک آدرس Random برای ساخت لینک بازیابی کلمه عبور ایجاد می کنیم، به این آدرس Token گفته می شود، Token  ما باید یک زمان انقضا داشته باشد تا در صورتی که کاربر بعد از مدت مشخص شده از آن استفاده نکرد، دیگر قابل استفاده نباشد، این بازه زمانی در این مثال یک روز قرار داده ایم.

در آخر یک پیام نیز به کاربر ارسال می کنیم که لینک بازیابی کلمه عبور شما ساخته شده است و می توانید از طریق ایمیلتان به این لینک دسترسی داشته باشید.

کد Action توضیح داده شده ما به صورت زیر است:

[AllowAnonymous]
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<ActionResult> ForgotPassword(BeforePasswordResetViewModel model)
{
   string message = null;
   //the token is valid for one day
    var until = DateTime.Now.AddDays(1);
   //We find the user, as the token can not generate the e-mail address,
    //but the name should be.
    var db = new MyDbContext();
 var user = db.Users.SingleOrDefault(x => x.Email == model.Email);

    if (null != user)
    {
        var token = new StringBuilder();

        //Prepare a 10-character random text
         using (RNGCryptoServiceProvider
                             rngCsp = new RNGCryptoServiceProvider())
                {
                    var data = new byte[4];
                    for (int i = 0; i < 10; i++)
                    {
                        //filled with an array of random numbers
                        rngCsp.GetBytes(data);
                        //this is converted into a character from A to Z
                        var randomchar = Convert.ToChar(
                            //produce a random number
                            //between 0 and 25
                                                  BitConverter.ToUInt32(data, 0) % 26
                            //Convert.ToInt32('A')==65
                                                  + 65
                                         );
                        token.Append(randomchar);
                    }
                }
        //This will be the password change identifier
        //that the user will be sent out
        var tokenid = token.ToString();

       //Generating a token
        var result = await IdentityManager
                             .Passwords
                             .GenerateResetPasswordTokenAsync(
                                                      tokenid,
                                                      user.UserName,
                                                      until
                         );

        if (result.Success)
        {
         //send the email
         //... کد ارسال ایمیل را باید خودتان پیاده سازی کنید
         }
}
message = "We have sent a password reset request if the email is verified.";
return RedirectToAction("PasswordReset", new { token = string.Empty, message = message });
}

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

PasswordReset در ASP Identity

در بخش دوم وقتی کاربر بر روی لینک ارسالی شما کلیک می کند ما می بایست یک فرم برای ثبت کلمه عبور جدید به او نمایش دهیم پس یک View با نام PasswordReset ایجاد کنید و کد زیر را در آن قرار دهید.

@model AspnetIdentitySample.Models.PasswordResetViewModel

@{
    ViewBag.Title = "PasswordReset";
}

<hgroup class="title">
    <h1>@ViewBag.Title.</h1>
</hgroup>

<p class="text-success">@ViewBag.StatusMessage</p>

@using (Html.BeginForm()) {
    @Html.AntiForgeryToken()
    @Html.ValidationSummary(true)

    <fieldset class="form-horizontal">
        <legend>PasswordResetViewModel</legend>

        <div class="control-group">
            @Html.LabelFor(model => model.Token, new { @class = "control-label" })
            <div class="controls">
                @Html.EditorFor(model => model.Token)
                @Html.ValidationMessageFor(model => model.Token, null, new { @class = "help-inline" })
            </div>
        </div>

        <div class="control-group">
            @Html.LabelFor(model => model.Password, new { @class = "control-label" })
            <div class="controls">
                @Html.EditorFor(model => model.Password)
                @Html.ValidationMessageFor(model => model.Password, null, new { @class = "help-inline" })
            </div>
        </div>

        <div class="control-group">
            @Html.LabelFor(model => model.ConfirmPassword, new { @class = "control-label" })
            <div class="controls">
                @Html.EditorFor(model => model.ConfirmPassword)
                @Html.ValidationMessageFor(model => model.ConfirmPassword, null, new { @class = "help-inline" })
            </div>
        </div>

        <div class="form-actions no-color">
            <input type="submit" value="Change password" class="btn" />
        </div>
    </fieldset>
}

@section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
}

کد Action ما برای فراخوانی این View به صورت زیر است

// GET: /Account/PasswordReset
[AllowAnonymous]
public ActionResult PasswordReset(string message)
{
ViewBag.StatusMessage = message ?? "";
  return View();
}

وقتی کاربر در View ما کلمه عبور جدیدش را ثبت کند و Button submit را بزند ما می بایست  از طریق تابع زیر

await IdentityManager.Passwords.ResetPasswordAsync(model.Token, model.Password);

بررسی کنیم که آیا قبلا ما چنین Token ایی را ایجاد کرده ایم و یا خیر در صورتی که این Token وجود داشته باشد و همچنین Expire نشده باشد، کلمه عبور جدید برای کاربر ثبت می شود در غیر این صورت خطای مربوطه به کاربر ارسال می شود.

کد کامل این Action به صورت زیر است

// POST: /Account/PasswordReset
[AllowAnonymous]
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<ActionResult> PasswordReset(PasswordResetViewModel model)
{
    if (ModelState.IsValid)
    {
        string message = null;
        //reset the password
        var result = await IdentityManager.Passwords.ResetPasswordAsync(model.Token, model.Password);
        if (result.Success)
        {
            message = "The password has been reset.";
            return RedirectToAction("PasswordResetCompleted", new { message = message });
        }
        else
        {
            AddErrors(result);
        }
    }
    // If we got this far, something failed, redisplay form
    return View(model);
}

همانطور که در کد بالا مشخص است پس از اتمام فرایند تغییر کلمه عبور کاربر به Action PasswordResetCompleted منتقل می شود.

کد Action PasswordResetCompleted به صورت زیر است

 // GET: /Account/PasswordResetCompleted
 [AllowAnonymous]
 public ActionResult PasswordResetCompleted(string message)
 {
     ViewBag.StatusMessage = message ?? "";
     return View();
 }

View مربوط به Action  بالا به صورت زیر خواهد بود

@{
    ViewBag.Title = "Register";
}
<hgroup>
    <h2>@ViewBag.Title.</h2>
</hgroup>
<p class="text-success">@ViewBag.StatusMessage</p>

برای دریافت کد های این مقاله می توانید از طریق لینک زیر اقدام فرمایید.

دانلود کدهای پروژه
عنوان: آموزش asp.net Identity

نظرات یا سوالات خودرا با ما درمیان بگذارید

0912 097 5516 :شماره تماس
0713 625 1757 :شماره تماس