Identity یا هویت یکی از جدیدترین API های نرم افزار ASP.NET می‌باشد که به تازگی توسط مایکروسافت ارائه شده است. این API به منظور مدیریت کاربران استفاده می‌شود. در سال‌های گذشته برای مدیریت کاربر نیاز به عضویت در ASP.NET بود که البته، با مشکلاتی در زمینه طراحی مواجه می‌شد. Asp.net Identity روش جدیدی برای تأیید اعتبار برای انواع الگوهای Asp.net مانند فرم‌های وب، MVC ،Web API و غیره است. همچنین قابلیت مدیریت کاربر و نقش را فراهم می‌کند. Asp.net Identity همچنین به کاربر امکان می‌دهد با استفاده از اطلاعات معتبر سایت اجتماعی خود مانند فیس بوک، گوگل و مایکروسافت وارد سایت شود. Asp.net Identity از چارچوب OWIN برای تولید کوکی احراز هویت و قابلیت ورود از طریق شبکه اجتماعی استفاده می‌کند. ما در این مطلب به آموزش احراز هویت یا authentication در MVC خواهیم پرداخت.

آموزش احراز هویت یا authentication در MVC
آموزش احراز هویت یا authentication در MVC

قبل از ارائه این API چه مشکلاتی وجود داشت؟

قبل از این که مایکروسافت بخواهد هویت را معرفی نماید، کارهای دیگری هم صورت پذیرفت بود. عضویت ساده سبب می‌شد تا پیچیدگی کم و اطلاعات کاربر به راحتی شخصی‌سازی شود. هر چند، نیاز به مدل نسبی حافظه احساس می‌شد. دومین راه عملی ASP.NET universal providers بود. امتیاز universal providers این بود که برای به وجود آوردن پایگاه داده اتوماتیک از ویژگی Entity Framework Code First استفاده می‌کند و در هر زمان که نمی‌توانید به ابزار مدیریتی دسترسی داشته باشید، قادر هستید تا پایگاه داده‌ی Azure cloud service ایجاد کنید. با همه این تفاسیر اگرچه سیستم عضویت خیلی بهتر شده بود اما هنوز هم مشکلات زیادی، باقی مانده بود!

هویت Asp.net چیست؟

Asp.net Identity روش جدید احراز هویت برای پروژه‌های Asp.net است که توسط مایکروسافت ارائه می‌شود. این یک مکانیسم تأیید اعتبار رایج است که توسط تمام فریمورک‌های مایکروسافت مانند فرم‌های وب، MVC ،Web API و غیره استفاده می‌شود. همچنین قابلیت مدیریت کاربر و نقش را در سیستم فراهم می‌کند. این API از میان افزار OWIN برای تولید کوکی احراز هویت و اعتبار سنجی ورد از شبکه اجتماعی استفاده می‌کند. هویت Asp.net برای عملکرد به VS2015 و Net 4.5 نیاز دارد.

آموزش ساخت فروشگاه اینترنتی با ASP MVC

مزایای Asp.net Identity

با معرفی پلتفرم مدیریت کاربر جدید توسط مایکروسافت، هویت جایگزین عضویت شد و هر دو مشکل برطرف شد. هرچند هویت درASP.NET قابلیت توسعه دارد و منعطف می‌باشد ولی هنوز جای رشد زیادی دارد. برخی از ویژگی‌های ساده نیز در سیستم‌های دیگر ممکن است، زمان‌بر باشد و یا طول بکشد. به هر حال مایکروسافت بسیار منعطف، هویت را خلق کرده است، به طوری که بتوانید زمان کافی داشته باشید تا موارد خاصی که مد نظر دارید، پیاده سازی نمایید. برای آموزش authentication در MVC ما از مزایای این API عالی استفاده خواهیم کرد.

آموزش احراز هویت یا authentication در MVC

قبل از هر فرآیند این نکته را بگوییم که شناسایی ASP.NET با استفاده از فریم ورک OWIN انجام می‌شود. OWIN برای احراز هویت بین پست بک‌ها کوکی تولید می‌کند. به یک عبارت دیگر می‌توان گفت امکاناتی در اختیار برنامه نویس قرار می‌دهد که از سوی شبکه‌های اجتماعی دارای مجوز باشد. حتی کاربران قادر خواهند بود تا با استفاده از اکانت‌هایشان برای ورود به این شبکه‌ها استفاده کنند. اجازه دهید برای آموزش احراز هویت در MVC در قالب یک مثال عملی توضیحاتی را به شما ارائه کنیم:

این مثال یک پروژه کوچک MVC است که یه کمک آن می‌توانید چگونگی اخراز هویت را درک کنید. مثال حاضر یک سیستم انتخاب دروس دانشجو است. به این ترتیب که هر دانشجو یا کاربر می‌تواند، دروسی که مایل است اضافه کند.

  • ابتدا باید یک پروژه MVC بسازید و سپس از گزینه Individual User Accounts احراز هویت یا Authentication را انتخاب کنید. با این کار تمامی dll ها و پکیج‌های مورد نیاز برایNet Identity و OWIN به پروژه افزوده می‌شود.
ایجاد یک پروژه MVC اولین اقدام برای آموزش احراز هویت یا authentication در MVC
ایجاد یک پروژه MVC اولین اقدام برای آموزش احراز هویت یا authentication در MVC
  • به دلیل اینکه Net Identity از کد اولیه موجودیت فریم ورک استفاده می‌کند، با کمی تغییر در کدهای پیش‌فرض، مدل ApplicationUser جایگزین می‌شود.
Public class StudentUser : IdentityUser
     {
           Public studentUser{}
                             Courses = new Hashset<Course>{};
     }
     Public int RollNo { get; set; }
     Public  string Address { get; set; }
     Public  string Sex { get; set;}
     Public virtual Icollection<course> Courses { get; set; }
  • درس مدلی جدید است که خصوصیت زیر را دارد:
    • هر دو مدل با هم رابطه چند به چند دارند یعنی هر دو یک کالکشن از دیگری می‌باشند.
Public Class Course
   {
       Public course {}
       This.Students = new HashSet<studentUser>();
   }
   PUBLIC INT Id   { get; set; }
  [Required]
  Pubic String Title { get; set; }
  Pubic String Description { get; set; }
  Pblic float Credit { get; set; }
Public virtual Icollection<StudentUser> Students { get; set; }
  • از طرفی کلاس پیش فرض ApplicationDbContext با کدی جایگزین شده است که در زیر، آن را خواهید دید.
public class StudentCourseManagementDbContext : IdentityDbContext <studentuser>
{
    public StudentCourseManagementDbContext() : base("StudentCourseManagementCS")
    {
        Configuration.ProxyCreationEnabled = false;
    }

    public System.Data.Entity.DbSet<course> Courses { get; set; }
}

دقت داشته باشید که در اینجا IdentityDbContext کلاسی درون Asp.net Identity است و در موجودیت فریم ورک دسترسی به داده‌ها دسترسی می‌دهد.

علاوه بر این، StudentCourseManagementCS یک رشته متصل شده داخل فایل web.config است.

کلاس Context تنها یک جدول با نام course دارد. بقیه جداول جهت مدیریت نقش‌ها و کاربران است و به وسیله Asp.net Identity ساخته می‌شود.

  • با دستور enable-migrations می‌توانید کلاس code first migration را از کنسول مدیر بسته فعال کنید تا پوشه Migrations وcs ایجاد شود.
  • حالا باید از کنسول مدیر بسته دستور add-migration InitialCreate را اجرا کنید تا فایل .cs را  در پوشه Migrations بسازد. این فایل شامل کدهایی است که به منظور ایجاد جداول اولیه دیتابیس ساخته شده است.
  • با اجرای Update-Database دستور از کنسول مدیر بسته، فایل ایجاد شده اجرا می‌شود و جداول Net Identity تشکیل می‌شوند.
  • جداول دیتابیس ایجاد شده را در شکل می‌بینید:

جداول دیتابیس ایجاد شده در Asp.Net Identity

  • به جز دو جدول Courses و StudentUserCourses (که برای نگهداری رابطه چندتایی جدول‌های Courses و AspNetUsers ساخته شده است) بقیه جدول‌ها همان پیش‌فرض‌های net Identity هستند.
  • CourseController به همراه اکشن‌های درونش، برای افزودن، حذف و ادیت دروس و همچنین، تخصیص هر درس به دانشجو کاربرد دارند. با AccountController به طور پیش‌ فرض کاربر جدید (دانشجوی جدید) ایجاد می‌شود.
  • پس از این که پروژه اجرا شد، رابط کاربری زیر را می‌بینید:

  • برای ایجاد view از اکشن زیر استفاده می‌شود:
<span class=”code-keyword”>public<span>ActionReslt Index(<span class=”code-keyword
{viewBag.Message = message;
<span class=” code-keyword”>return</span> view(db.Corses.ToList());}

این اکشن حتی بدون login کردن در دسترس کاربران قرار می‌گیرد و بدون هیچ محدودیتی، کاربر به این اکشن دسترسی دارد. چگونه می‌توانیم اکشن را محدود کنیم و سپس احراز هویت را برایش بررسی نماییم؟

  • اگر با لینک Add New Courses درس جدیدی اضافه کنید و یا با لینک Assign to User درسی را به کابر تخصیص دهید، برنامه کاربر را به صفحه Login می‌برد. این نشان می‌دهد که دسترسی وی محدود شده است. در قطعه کد زیر اکشن مربوط به ایجاد درس جدید را می‌بینید. در این اکشن، احراز هویت با ویژگی Authorize  اعمال می‌شود. بنابراین، کاربر باید برای دسترسی، لاگین کرده و نام کاربری و رمز عبور وارد کند.
[Authorize (Users = <span class=”code-string”>”</span><span class=”code-string”>Bashe
               <span class=”code-keyword”>public</span>ActionResult Create()
                {
                            <span   class=” code-keyword”>return</span> View();           }
  • پس از کلیک بر روی لینک Assign to User اکشن زیر انجام می‌شود:
[Authorize]
   <span class=”code-keyworf’>public</span> ActionResult Assign()
      {
              <span class=”code-comment”>
       }

در اینجا مجوز دسترسی به کاربر خاصی داده نشده است و همه کاربران امکان دسترسی دارند. کافی است تا کاربر برای دسترسی لوگین کند.

  • برای یک کابر جدید، صفحه ثبت نام به شکل زیر است:

کاربر با اکشن زیر ایجاد می‌شود:

public async Task<actionresult> Register(RegisterViewModel model)
        {
            if (ModelState.IsValid)
            {
                var user = new StudentUser() { UserName = model.UserName };
                var result = await UserManager.CreateAsync(user, model.Password);
                if (result.Succeeded)
                {
                    await SignInAsync(user, isPersistent: false);
                    return RedirectToAction("Index", "Home");
                }
                else
                {
                    AddErrors(result);
                }
            }
            return View(model);
        }

کلاس UserManager توسط Asp.Net Identity و به شکل خودکار ساخته می‌شود. از این کلاس برای ایجاد کاربر جدید استفاده خواهد شد. Identity در اینجا برای ایجاد کاربر جدید استفاده می‌شود. البته، می‌توانید برای ویرایش و یا حذف کاربر نیز، از آن استفاده کنید و یا یک نقش جدید ایجاد کنید.

  • برای درس جدید از رابط کاربری زیر استفاده می‌شود:

رابط کاربری ایجاد دوره جدید Asp.Net Identity

برای ثبت درس جدید در MVC، از اکشن زیر استفاده می‌شود:

[Authorize]
    public ActionResult Create([Bind(Include="Id,Title,Description,Credit")] Course course)
    {
        if (ModelState.IsValid)
        {
            db.Courses.Add(course);
            db.SaveChanges();
            return RedirectToAction("Index");
        }
        return View(course);
    }

در اینجا کلاس StudentCourseManagementDbContex از موجودیت Framework DB Context به منظور اضافه کردن درس جدید استفاده می‌شود.

  • رابط کاربری زیر برای تخصیص دروس به دانشجو استفاده می‌شود:

در این قسمت از اکشن زیر استفاده می‌شود:

[Authorize]
    public ActionResult Assign(IEnumerable<courseviewmodel> assignVeiwModel)
    {
        var currentUser = userManager.FindById(User.Identity.GetUserId());
        if(currentUser !=null)
        {
            var user = db.Users.Include("Courses").Where(u => u.Id == currentUser.Id).FirstOrDefault();
            foreach (CourseViewModel courseVM in assignVeiwModel)
            {
                if (courseVM.IsSelected)
                {
                    Course course = user.Courses.Where(c => c.Id == courseVM.Id).FirstOrDefault();
                    if(course == null)
                    {
                        Course courseAdd = db.Courses.Where(c => c.Id == courseVM.Id).FirstOrDefault();
                        currentUser.Courses.Add(courseAdd);
                    }
                }
            }
            db.SaveChanges();
        }
        return RedirectToAction("AssignedCourses");
    }

در این عملیات اول اطلاعات کاربر کنونی که لاگین کرده است گرفته شده و درون یک آبجکت به نام currentUser قرار می‌گیرد. سپس تمام دروسی که به این کاربر قبلا اخذ شده ست گرفته می‌شود. سپس تمام دروس اختصاص نیافته به کاربر دریافت شده و به کاربر نمایش داده می‌شود. اینجا یک کلاس CourseViewModel برای نگه‌داری تمام دروس اختصاص نیافته استفاده می‌شود.

خصوصیات این کلاس به صورت زیر می‌باشد:

public class CourseViewModel
{
    public int Id { get; set; }
    public string Title { get; set; }
    public string Description { get; set; }
    public float Credit { get; set; }
    public bool IsSelected { get; set; }
}
  • در انتها به منظور نمایش لیست تمامی دورس تخصیص داده شده به کاربر، رابط کاربری به شکل زیر است:

در اینجا از اکشن زیر استفاده شده است:

[Authorize]
    public ActionResult AssignedCourses()
    {
        var currentUser = userManager.FindById(User.Identity.GetUserId());
        if (currentUser != null)
        {
            var user = db.Users.Include("Courses").Where(u => u.Id == currentUser.Id).FirstOrDefault();
            return View(user.Courses);
        }
        return RedirectToAction("Assign");
    }

در این قطعه کد، در ابتدا آبجکت کاربر گرفته می‌شود و دروس تخصیص‌یافته به این کاربر گرفته می‌شود. این عملیات در رابط کاربری نمایش داده می‌شود.

نتیجه گیری آموزش authentication در MVC

در این مقاله، آموزش احراز هویت یا authentication در MVC، در قالب یک پروژه نشان داده شد. این مقاله تماما در مورد تایید هویت با استفاده از Identity یا هویت Asp.Net برای پروژه MVC بود. Authentication یا احراز هویت به کاربر اجازه می‌دهد تا به سیستم دسترسی داشته باشد. امیدوارم این پروژه آزمایشی شما را با چگونگی این کار در MVC آشنا کرده باشد.