در آموزش احراز هویت – Authentication در Asp.Net MVC قصد داریم تا کلیه موارد مربوط به بحث Authentication را به همراه ویدیو آموزشی مورد بحث قرار دهیم. با ما همراه باشید.
در پروژه های طراحی سایت گاهی نیاز است ما یک اکشن یا یک کنترلر و یا مجموعه ای از صفحات Area را محدود کنیم. یعنی اجازه دسترسی نداشته باشند تا زمانی که احراز هویت کنند مثلا در سایت لاگین یا رجیستر کنند و یا فراتر از آن تا زمانی که نقش خاصی نداشته باشند نتوانند به یک بخش دسترسی داشته باشند.
[Authorize]
or
[Authorize(Roles ="Admin")]
[Authorize]
or
[Authorize(Roles ="Admin")]
<location path="Admin">
<system.web>
<authorization>
<deny users="?"/>
</authorization>
</system.web>
</location>
مثال : فقط کاربرانی با نقش Admin و Editor قابلیت دسترسی داشته باشند. و بقیه کاربران با هر نقشی دسترسی نداشته باشند. عنصر Allow بیان میکند که نقشهای Admin و Editor مجاز هستند. عنصر Deny دستور می دهد که همه کاربران غیر مجاز شوند.
علامت سوال ? کاربران ناشناس را رد می کند و ستاره * نشان می دهد که همه حساب های کاربری دسترسی ندارند.
<authorization>
<allow roles="Admin, Editor" />
<deny users="*" />
</authorization>
تا اینجای کار توانستیم Action – Controller – Area های مد نظر خود را Authorize کنیم و اجازه دسترسی را از آنها گرفتیم حلا توسط Authentication باید نوع و آدرس و تنظیمات دیگر Authentication را مشخص کنیم به زبان ساده مشخص کنیم کاربر از چه طریقی و از چه آدرسی احراز هویت کند.
name : باید یک نام منحصر به فرد باشد چون این name دقیقا نام کوکی ای میباشد که قرار است ذخیره شود.
loginUrl : اگر سیستم کاربری را بخواهد از صفحه ای بیرون بیندازد به این صفحه هدایت میکند.
defaultUrl : بعد از لاگین کاربر به این آدرس هدایت میشود.
timeout : مدت زمان نگداری کوکی است مثلا اگر بخواهیم ۱۵ روز کوکی نگهداری شود مقدار ۱۵*۲۴*۶۰ که برابر با ۲۱۶۰۰ میباشد را وارد میکنیم. توجه داشته باشید که مقدار آن به دقیقه میباشد.
<authentication mode="Forms">
<forms name="TehranIt" loginUrl="/Account/Login" defaultUrl="/" timeout="21600" protection="All"></forms>
</authentication>
در ViewModel حتما علاوه بر فیلد های نام کاربری و رمز عبور فیلد های زیر را نیز اضافه کنید.
همچنین برای نام کاربری از ایمیل استفاده میکنیم.
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Web;
using System.Xml.Linq;
namespace Area.Models.ViewModels
{
public class LoginViewModel
{
[Display(Name = "ایمیل")]
[Required(ErrorMessage = "فیلد {۰} نباید خالی باشد.")]
[EmailAddress(ErrorMessage = "قالب {۰} اشتباه است")]
[MaxLength(100)]
public string Email { get; set; }
[Display(Name = "رمز عبور")]
[Required(ErrorMessage = "فیلد {۰} نباید خالی باشد.")]
[StringLength(13, MinimumLength = 5, ErrorMessage = "تعداد کاراکتر ها نباید کمتر از ۵ و بیشتر از ۱۳ باشد")]
[DataType(DataType.Password)]
[MaxLength(100)]
public string Password { get; set; }
[Display(Name = "مرا به خاطر بسپار")]
public bool RememberMe { get; set; }
public string ReturnUrl { get; set; }
}
}
public ActionResult Login(string ReturnUrl="/")
{
LoginViewModel loginViewModel = new LoginViewModel();
loginViewModel.ReturnUrl = ReturnUrl;
return View(loginViewModel);
}
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Login([Bind(Include = "Email,Password,RememberMe,ReturnUrl")] LoginViewModel LoginUser)
{
if(ModelState.IsValid)
{
User user= new User();
user = db.Users.Where(t=> t.Email == LoginUser.Email && t.Password==LoginUser.Password).FirstOrDefault();
if (user == null)
{
ModelState.AddModelError("LoginError", "نام کاربری یا رمز عبور اشتباه است");
return View();
}
FormsAuthentication.SetAuthCookie(LoginUser.Email, LoginUser.RememberMe);
return Redirect(LoginUser.ReturnUrl);
}
return View();
}
[Authorize]
public ActionResult Logout()
{
FormsAuthentication.SignOut();
return Redirect("/");
}
https://github.com/ahadian2/Autentication