تغییر کلمه عبور در ASP 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>
برای دریافت کد های این مقاله می توانید از طریق لینک زیر اقدام فرمایید.