
آموزش Asp.Net MVC احراز هویت – Authentication
در آموزش احراز هویت – Authentication در Asp.Net MVC قصد داریم تا کلیه موارد مربوط به بحث Authentication را به همراه ویدیو آموزشی مورد بحث قرار دهیم. با ما همراه باشید.
Authorize یا محدود کردن Action – Controller – Area
در پروژه های طراحی سایت گاهی نیاز است ما یک اکشن یا یک کنترلر و یا مجموعه ای از صفحات Area را محدود کنیم. یعنی اجازه دسترسی نداشته باشند تا زمانی که احراز هویت کنند مثلا در سایت لاگین یا رجیستر کنند و یا فراتر از آن تا زمانی که نقش خاصی نداشته باشند نتوانند به یک بخش دسترسی داشته باشند.
- محدود کردن Action : محدود کردن یک اکشن بسیار ساده است کافی است در بالای اکشن اتربیوت [Authorize] را اضافه کنید زمانی که این صفت را وارد میکنید کاربران تا زمانی که مجوز نداشته باشند نمیتوانند به این اکشن دسترسی داشته باشند. همچنین این صفت میتواند مقدار Roles را نیز بگیرد که در آن باید مشخص کنیم تا چه نقشی اجازه دسترسی به این اکشن را دارد.
[Authorize]
or
[Authorize(Roles = "Admin")]- محدود کردن Controller : محدود کردن یک Controller بسیار ساده است کافی است در بالای Controller اتربیوت [Authorize] را اضافه کنید زمانی که این صفت را وارد میکنید کاربران تا زمانی که مجوز نداشته باشند نمیتوانند به این Controller و اکشن های آن دسترسی داشته باشند. همچنین این صفت میتواند مقدار Roles را نیز بگیرد که در آن باید مشخص کنیم تا چه نقشی اجازه دسترسی به این Controller و اکشن های آن را دارد.
[Authorize]
or
[Authorize(Roles = "Admin")]- محدود کردن Area : برای محدود کردن یک Area به فایل Web.config میرویم. داخل تگ configuration تگ Location را اضافه میکنیم صفت Path را به آن اضافه میکنیم مقدار آن دقیقا باید هم نام Area باشد. تگ system.web را مشخص میکنیم و در داخل آن تگ authorization را وارد میکنیم و مشخص میکنیم این Area نیاز به اهراز هویت دارد و در داخل آن میتوانیم از تگ deny و یا allow استفاده کنیم مثلا <deny users=”?”/> یعنی هیچ کاربری اجازه دسترسی ندارد تا زمانی که مجوز بگیرد.
<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>تنظیمات Authentication
تا اینجای کار توانستیم Action – Controller – Area های مد نظر خود را Authorize کنیم و اجازه دسترسی را از آنها گرفتیم حلا توسط Authentication باید نوع و آدرس و تنظیمات دیگر Authentication را مشخص کنیم به زبان ساده مشخص کنیم کاربر از چه طریقی و از چه آدرسی احراز هویت کند.
- به صفحه WebConfig و تگ system.web بروید، WebConfig اصلی پروژه چون ممکن است بعد ها پروژه های دیگر و یا Location های دیگری به پروژه اضافه شود که خود دارای WebConfig و Location های مجزا باشند.
- سپس تگ Authorize را اضافه کنید و به آن صفت mode را اضافه کنید. نوع احراز هویت ما از نوع Forms میباشد یعنی از طریق یک Form احراز هویت انجام میشود.
- چون احراز هویت ما از نوع Forms است پس یک تگ Forms ایجاد میکنیم.
name : باید یک نام منحصر به فرد باشد چون این name دقیقا نام کوکی ای میباشد که قرار است ذخیره شود.
loginUrl : اگر سیستم کاربری را بخواهد از صفحه ای بیرون بیندازد به این صفحه هدایت میکند.
defaultUrl : بعد از لاگین کاربر به این آدرس هدایت میشود.
timeout : مدت زمان نگداری کوکی است مثلا اگر بخواهیم ۱۵ روز کوکی نگهداری شود مقدار ۱۵*۲۴*۶۰ که برابر با ۲۱۶۰۰ میباشد را وارد میکنیم. توجه داشته باشید که مقدار آن به دقیقه میباشد.
<authentication mode="Forms">
<forms name="TehranIt" loginUrl="/Account/Login" defaultUrl="/" timeout="21600" protection="All"></forms>
</authentication>ایجاد ViewModel برای صفحه لاگین
در ViewModel حتما علاوه بر فیلد های نام کاربری و رمز عبور فیلد های زیر را نیز اضافه کنید.
- فیلد RememberMe برای ذخیره اطلاعات نام کاربری و رمزعبوز
- فیلد ReturnUrl آخرین صفحه ای که قبل از لاگین داخل آن بوده ایم.
همچنین برای نام کاربری از ایمیل استفاده میکنیم.
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();
}اکشن مربوط به Logout
[Authorize]
public ActionResult Logout()
{
FormsAuthentication.SignOut();
return Redirect("/");
}سورس کد Autentication
شما میتوانید سورس کد کامل Autentication را از طریق گیت مشاهده کنید و یا اگر گیت کار نمیکنید، به راحتی آن را به صورت فایل فشرده (ZIP) دانلود کنید. فایلهای دانلودی شامل تمام بخشهای پروژه است و میتوانید آن را روی سیستم خود اجرا یا تغییر دهید.































باسلام و تشکر از شما استاد
لطفا بفرمایید آموزش کار با identity را در کدام جلسه اموزش ارائه دادید؟