آیدنتیتی یک سیستم کامل مدیریت کاربران است که توسط مایکروسافت ارائه شده است. با استفاده از آیدنتیتی کاربران میتوانند با ساخت یک اکانت جدید و یا با استفاده از اکانت های Google, FaceBook,LinkedIn و ... وارد سیستم شوند. در این مقاله به پیاده سازی آیدنتیتی میپردازیم.

ابتدا یک پروژه از نوع Console App .Net Core به نام IdentityExample.ConsoleApp ایجاد میکنیم. توجه داشته باشید که ورژن پروژه Core 2.1 باشد.

در ادامه پکیج زیر را نصب نمایید 

  • Microsoft.AspNetCore.Identity.EntityFrameworkCore ورژن 2.1.6
  • Microsoft.EntityFrameworkCore ورژن 2.1.4
  •  Microsoft.EntityFrameworkCore.SqlServer  ورژن 2.1.4
  • Microsoft.EntityFrameworkCore.Tools ورژن 2.1.4

سپس یک پوشه در روت پروژه به نام Data و یک پوشه به نام Models بسازید. پوشه ی Models محل قرار گیری جداول دیتابیس  و پوشه ی Data محل قرارگیری کلاس کانتکست که ارتباط پروژه و بانک اطلاعاتی را فراهم میکند می باشد. در پروژه های واقعی باید هرکدام از پوشه های Models و Data را در یک پروژه جدا قرار دهید اما در این مثال فقط به پیاده سازی یک نمونه ساده از آیدنتیتی میپردازیم و نیاز به جداسازی پروژه ها نیست.

آیدنتیتی به طور پیشفرض برای جداول کاربران و نقش ها از یک GUID برای کلید استفاده میکند. برای تغییر این عمل و استفاده از int برای کلید های جداول به صورت زیر عمل میکنیم.

ابتدا یک کلاس به نام Users در پوشه Models ایجاد میکنیم :

public class Users : IdentityUser<int>
{
}


این کلاس از جدول اصلی کاربران آیدنتیتی ارث بری کرده و یک تایپ از نوع int به پارامتر جنریک کلاس IdentityUser پاس داده است. با این کار مشخص کرده ایم که کلید منحصر به فرد جدول کاربر باید از نوع int باشد.

همین کار را نیز برای جدول نقش ها انجام میدهیم :

public class Roles : IdentityRole<int>
{
}

تنها تفاوت کلاس بالا ارث بری کردن از کلاس IdentityRole میباشد.

سپس یک کلاس در پوشه Data به نام ApplicationDbContext ایجاد میکنیم و محتوای کلاس به صورت زیر است :

public class ApplicationDbContext : IdentityDbContext<Users, Roles, int>
{
    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseSqlServer("Data Source=.; Initial Catalog=IdentityExampleDB;Integrated Security=True;");
    }
}

توجه داشته باشید که کلاس کانتکست شما باید حتما با Context خاتمه یابد مانند ApplicationDbContext چون Package Manager Console از این کلمه برای یافتن کلاس کانتکست استفاده میکند.

در حالت عادی کلاس Context فقط از DbContext ارث بری میکند اما چون در اینجا میخواهیم از آیدنتیتی استفاده میکنیم تغییراتی را باید اعمال کنیم.

  • ارث بری کردن از IdentityDbContext
  • مشخص کردن نوع کلید (int) برای ساخت جداول آیدنتیتی و جداول کاربران و نقش ها ( Users, Roles )

در ادامه برای اتصال به بانک اطلاعاتی نیاز به یک رشته اتصال داریم. میتوانیم رشته اتصال را از فایل appSettings.json بخوانیم و یا مستقیما آن را در متد UseSqlServer بنویسیم. در این بخش نام دیتابیس برابر است با IdentityExampleDB و محل قرار گیری دیتابیس را نقطه گذاشته ایم که به معنای سیستم فعلی یا localhost می باشد. اگر میخواهید با استفاده از نام کاربری و کلمه عبور به SQL Server متصل شوید رشته اتصال را به صورت زیر تغییر دهید :

optionsBuilder.UseSqlServer("Data Source=.; Initial Catalog=IdentityExampleDB;User Id=sa; Password=admin123;");

تا به اینجا مراحل ساخت دیتا کانتکست و جداول مربوطه را انجام دادیم. برای اعمال تغییرات بر روی دیتابیس باید از Package Manager Console استفاده کنیم.

هر زمان که تغییری در مدل های خود ایجاد میکنید نیاز به ساخت یک Migration دارید و پس از Migration باید دیتابیس را Update یا بروزرسانی کنید. برای انجام این کار ابتدا منوی Tools را انتخاب کرده سپس NuGet Package Manager و بعد Package Manager Console را انتخاب کنید. سپس در محیط کنسول دستور زیر را تایپ کنید.

Add-Migration InitialDataBase

و در ادامه 

 Update-Database

اگر الان به Sql Server خود بروید مشاهده میکنید که یک دیتابیس جدید به نام IdentityExampleDB ساخته شده است و چندین جدول که اصلا از آنها خبری ندارید (;

در ادامه به بررسی جداول ایجاد شده در بانک اطلاعاتی توسط آیدنتیتی و ساخت یک وب اپلیکیشن جهت کار با آیدنتیتی میپردازیم.