کاربران ثبت نام شده می توانند با تایید هویت خود در صفحه ورود، به پورتال دانشجویی دسترسی داشته باشند. صفحه ورود جایی است که کاربران نام کاربری و رمز عبور خود را وارد می کنند و این صفحه به یک View Model ورود متصل و مرتبط می شود. View Model ورود دارای ویژگی های صفحه ورود است که کاربر داخل صفحه وارد می کند. بهتر است توجه خود را به Account Controller معطوف کنیم زیرا اینجاست که کد برنامه مربوط به ورود را اضافه می کنیم. اولین کاری که قرار است انجام دهیم، اعلان و تعریف کلاس SignInManager است که یک آبجکت از نوع IdentityUser را به عنوان ورودی دریافت می کند.
private readonly SignInManager<IdentityUser> _signInManager;
در مرحله بعد باید کلاس SignInManager را به سازنده Account Controller تزریق کنیم. کلاس SignInManager، متد های احراز هویتی را که برای پیاده سازی ورود و خروج به آن نیاز داریم، فراهم می کند.
حال داخل Account Controller اسکرول می کنیم تا اولین متد Login را پیدا کنیم و خواهیم دید که نوعی که این متد بر می گرداند IActionResult است و مشخص شده است که نحوه فراخوانی آن باید به صورت [HttpGet] باشد.
// GET: /Account/Login
[HttpGet]
public IActionResult Login()
{
return View();
}
این همان متدی است که صفحه ورود به سیستم را برای کاربر نمایش می دهد. متد Login ی که نحوه فراخوانی آن به صورت [HttpPost] تعریف شده است و پایین همین متد است، در اصل همان متدی است که ما کد ورود خود را در بدنه آن پیاده سازی می کنیم. ما از متدی به نام PasswordSignInAsync از کلاس signInManager برای ورود استفاده می کنیم و ایمیل و همچنین رمز عبور وارد شده در صفحه لاگین را که از View Model گرفتیم به عنوان ورودی به آن ارسال می کنیم.
// POST: /Account/Login
[HttpPost]
public async Task<IActionResult> Login(LoginViewModel model, string returnUrl = null)
{
ViewData["ReturnUrl"] = returnUrl;
if (ModelState.IsValid)
{
var result = await _signInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, lockoutOnFailure: false);
if (result.Succeeded)
{
if (Url.IsLocalUrl(returnUrl))
{
return Redirect(returnUrl);
}
else
{
return RedirectToAction(nameof(StudentController.Index), "Student");
}
}
else
{
ModelState.AddModelError(string.Empty, "Invalid login attempt.");
}
}
// If we got this far, something failed, redisplay form
return View(model);
}
پارامتر بعدی در اصل یک flag است که مشخص می کند کوکی احراز هویت پس از بستن مرورگر ذخیره گردد یا خیر. ما با استفاده از انتخاب چک باکس RememberMe از صفحه ورود به سیستم، آن را تنظیم می کنیم. تنظیم پارامتر lockoutOnFailure از ورود چند باره کاربر پس از تلاش های ناموفق برای ورود به سیستم جلوگیری می کند. از آنجایی که این نیز یک متد آسنکرون است، باید تنظیمات جزئی را در متد اعمال کنیم. ما باید کلمه کلیدی async را در ابتدای تعریف متد اضافه کنیم و یک Task از نوع IActionResult را برگردانیم.
پارامتری که متد PasswordSigninAsync برمی گرداند، یک پارامتر Boolean است که مشخص می کند آیا ورود موفقیت آمیز بوده است یا خیر. اگر نتیجه فراخوانی ورود به سیستم با موفقیت انجام شود، کاربر را به آدرس برگشتی هدایت می کنیم، در غیر این صورت، یعنی اگر آدرس برگشتی وجود نداشته باشد، کاربر را به صفحه اصلی پورتال دانش آموزی ارسال میکنیم. فراموش نکنیم که ما باید مطمئن شویم که URL بازگشتی ارائه شده یک URL محلی (درون برنامه ای) است. ما این کار را با استفاده از متد IsLocalUrl و ارسال returnUrl به عنوان ورودی به این متد انجام می دهیم.
در این صورت ما به همین سادگی کاربر را به URL بازگشتی هدایت می کنیم.
اگر URL محلی نباشد، کاری که باید انجام دهیم این است که کاربر را به صفحه اصلی پورتال دانشجویی هدایت کنیم. بنابراین ما کاربر را به action مربوطه به نام index در StudentController هدایت خواهیم کرد. در صورتی که نتیجه ورود ما ناموفق باشد، کاری که انجام خواهیم داد، ارسال خطا به عنوان پاسخ به کاربر است. برای این کار ما متد AddModelError از آبجکت ModelState را فراخوانی می کنیم و یک رشته خالی را به عنوان پارامتر کلید و برای پیام خطا، عبارت "یک تلاش برای ورود نامعتبر " را به عنوان پارامتر دوم به متد اشاره شده ارسال می کنیم. کل این کار بدنه متد ورود(action) ما خواهد بود.
مورد بعدی که اضافه می کنیم متد خروج از سیستم به AccountConrtoller است.
// POST: /Account/Logout
[HttpPost]
public async Task<IActionResult> Logout()
{
await _signInManager.SignOutAsync();
return RedirectToAction(nameof(HomeController.Index), "Home");
}
از آنجایی که این متد نیز یک متد آسنکرون خواهد بود، مثل متد های قبلی از کلمه کلیدی مربوطه که همان Async هست در ابتدای متد و تعریف آن استفاده می کنیم. تمام چیزی که در متد خروج از سایت باید قرار دهیم، فراخوانی متد SignOutAsync از آبجکت(کلاس) signInManager است. سپس، کاربر را به صفحه اصلی پورتال دانشجویی هدایت می کنیم. این راه خوبی است که فقط به کاربرانی که درخواستی از نوع HTTPPost به ما ارسال کرده اند پاسخ بدهیم و آنها را به عنوان پاسخ درخواست از سیستم خارج کنیم. این کار از هدایت ناآگاهانه کاربران به عمل خروج از سایت جلوگیری می کند.