আজকের লেকচারে স্বাগতম!

কোথায় আছি আমরা? আপনি বর্তমানে Section 25: Identity-তে আছেন। গত লেকচারে আমরা Identity-র ব্যাসিক আর্কিটেকচার নিয়ে আলোচনা করেছিলাম। আজকে আমরা শিখবো কীভাবে Identity-র মূল ভিত্তি অর্থাৎ Entity Classes (IdentityUser এবং IdentityRole) তৈরি করতে হয় এবং আমাদের ডাটাবেস কনটেক্সটকে (IdentityDbContext) কীভাবে কনফিগার করতে হয়। চলুন শুরু করি!


📝 Quick Summary for Revision

ভবিষ্যতে দ্রুত রিভিশন দেওয়ার জন্য পুরো লেকচারের মূল বিষয়গুলো নিচে লিস্ট করা হলো:

  • Core Entities: Identity-তে ইউজার এবং রোলের ডেটা স্টোর করার জন্য দুটি বিল্ট-ইন ক্লাস থাকে: IdentityUser এবং IdentityRole
  • Custom Entities: বিল্ট-ইন ক্লাসে নতুন প্রপার্টি (যেমন: PersonName) যোগ করার জন্য এদের থেকে ইনহেরিট করে ApplicationUser এবং ApplicationRole নামে চাইল্ড ক্লাস তৈরি করা হয়।
  • Primary Key Data Type: বাই ডিফল্ট ইউজার এবং রোলের ID string হয়, তবে আনলিমিটেড এবং ইউনিক আইডি জেনারেট করার জন্য Guid ব্যবহার করা উত্তম।
  • IdentityDbContext: রেগুলার Entity Framework-এর DbContext-এর বদলে IdentityDbContext ব্যবহার করতে হয়। এটি অটোমেটিকভাবে ইউজার এবং রোলের জন্য প্রয়োজনীয় DbSet তৈরি করে দেয়।
  • NuGet Packages: Identity এবং Entity Framework-কে একসাথে কাজ করানোর জন্য Microsoft.AspNetCore.Identity.EntityFrameworkCore প্যাকেজটি Core, Infrastructure এবং UI লেয়ারে ইন্সটল করতে হয়।

🧠 Comprehensive Breakdown

এখানে লেকচারের প্রতিটি বিষয় বিস্তারিতভাবে এবং সহজ করে ব্যাখ্যা করা হলো:

১. Identity Entity Classes: IdentityUser & IdentityRole (Priority: 10/10)

আগের প্রজেক্টগুলোতে আমরা যেমন Country বা Person নামে Entity Class তৈরি করেছিলাম, ঠিক তেমনি Identity-তে ইউজার এবং রোলের ডেটাবেস টেবিল তৈরি করার জন্য মাইক্রোসফট দুটি রেডিমেড ক্লাস দিয়ে দিয়েছে: IdentityUser এবং IdentityRole

  • IdentityUser: এটি ইউজারের ডেটা রিপ্রেজেন্ট করে। এর মধ্যে বাই ডিফল্ট ৫টি গুরুত্বপূর্ণ প্রপার্টি থাকে: Id, UserName, PasswordHash, Email, এবং PhoneNumber

  • Why PasswordHash? পাসওয়ার্ড কখনো প্লেইন টেক্সট বা সাধারণ স্ট্রিং হিসেবে ডেটাবেসে সেভ করা উচিত নয়। কেউ ডেটাবেস হ্যাক করলে সহজেই পাসওয়ার্ড দেখে ফেলতে পারবে। তাই Identity অটোমেটিকভাবে পাসওয়ার্ডকে এনক্রিপ্ট করে PasswordHash হিসেবে স্টোর করে।

  • IdentityRole: এটি ইউজারের ধরন (যেমন: Customer, Admin, Manager) রিপ্রেজেন্ট করে। এর মধ্যে প্রধানত দুটি প্রপার্টি থাকে: Id এবং Name

২. Creating Custom Entity Classes (Priority: 9/10)

যেহেতু IdentityUser-এ আমাদের প্রয়োজনীয় সব প্রপার্টি নাও থাকতে পারে (যেমন: ইউজারের আসল নাম, ঠিকানা ইত্যাদি), তাই আমরা IdentityUser থেকে ইনহেরিট করে একটি নিজস্ব চাইল্ড ক্লাস তৈরি করি। এর প্রচলিত নাম হলো ApplicationUser। একইভাবে রোলের জন্য তৈরি করা হয় ApplicationRole

  • Why Guid over String/Int? এই ক্লাসগুলো Generic Type রিসিভ করে, যা দিয়ে Primary Key-এর ডেটা টাইপ নির্ধারণ করা হয়। বাই ডিফল্ট এটি string থাকে। যদি আপনি int ব্যবহার করেন, তবে ডেটাবেসে একটি নির্দিষ্ট সংখ্যার পর আর ইউজার সেভ করা যাবে না। কিন্তু Guid (Globally Unique Identifier) ব্যবহার করলে আনলিমিটেড এবং সম্পূর্ণ ইউনিক আইডি তৈরি করা সম্ভব।

💻 Code Implementation (ApplicationUser & ApplicationRole): এই ক্লাসগুলো আমাদের Domain Layer (Core Project-এর IdentityEntities ফোল্ডার)-এ তৈরি করতে হবে।

using Microsoft.AspNetCore.Identity;
using System;
 
// ApplicationUser inheriting from IdentityUser with Guid as Primary Key
public class ApplicationUser : IdentityUser<Guid>
{
    // Adding extra custom property that IdentityUser doesn't have
    public string? PersonName { get; set; } 
}
 
// ApplicationRole inheriting from IdentityRole with Guid as Primary Key
public class ApplicationRole : IdentityRole<Guid>
{
    // You can add extra properties for roles here if needed
}
 

৩. Installing NuGet Packages (Priority: 8/10)

এই ক্লাসগুলো এবং Identity-র ফিচারগুলো ব্যবহার করার জন্য আপনাকে কিছু NuGet Package ইন্সটল করতে হবে।

  • Core Project: Microsoft.AspNetCore.Identity এবং Microsoft.AspNetCore.Identity.EntityFrameworkCore
  • Infrastructure Project: Microsoft.AspNetCore.Identity.EntityFrameworkCore
  • UI Project: Microsoft.AspNetCore.Identity.EntityFrameworkCore

Note: লেকচারার ভার্সন মেলানোর কথা বলেছেন। আপনি .NET-এর যে ভার্সন ব্যবহার করছেন (যেমন: .NET 8 বা .NET 10), প্যাকেজের ভার্সনও ঠিক সেইম রাখবেন।

৪. Configuring IdentityDbContext (Priority: 10/10)

সাধারণ Entity Framework-এ আমরা ডেটাবেসের সাথে কানেক্ট করার জন্য DbContext ব্যবহার করি এবং ম্যানুয়ালি প্রত্যেকটি ক্লাসের জন্য DbSet তৈরি করি। কিন্তু Identity-র ক্ষেত্রে আমাদের IdentityDbContext ব্যবহার করতে হবে।

  • Why IdentityDbContext? Identity-র ইউজার, রোল এবং তাদের ম্যাপিং স্টোর করার জন্য ডেটাবেসে প্রায় ৫-৭টি টেবিল লাগে (যেমন: AspNetUsers, AspNetRoles, AspNetUserRoles ইত্যাদি)। IdentityDbContext ব্যবহার করলে আপনাকে আর কষ্ট করে এই টেবিলগুলোর জন্য ম্যানুয়ালি DbSet লিখতে হবে না; এটি ব্যাকগ্রাউন্ডে অটোমেটিকভাবে সেগুলো তৈরি করে দেয়।

💻 Code Implementation (ApplicationDbContext): এটি Infrastructure Layer-এ তৈরি করতে হবে। খেয়াল করুন, এখানে Generic Parameter হিসেবে আমাদের তৈরি করা কাস্টম ক্লাসগুলো এবং ID-র টাইপ (Guid) পাস করতে হবে।

using Microsoft.AspNetCore.Identity.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore;
using System;
 
// Inheriting from IdentityDbContext instead of standard DbContext
public class ApplicationDbContext : IdentityDbContext<ApplicationUser, ApplicationRole, Guid>
{
    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options)
    {
    }
 
    // You can still add your regular DbSets here
    // public DbSet<Person> Persons { get; set; }
    // public DbSet<Country> Countries { get; set; }
}
 

🌟 Best Practices & Modern Updates (.NET 10 Context)

  • Best Practice 1 (Keep Domain Clean): ApplicationUser বা ApplicationRole ক্লাসগুলোতে শুধু সেই প্রপার্টিগুলোই রাখুন যেগুলো সরাসরি ইউজার অথেনটিকেশন বা প্রোফাইলের সাথে জড়িত (যেমন: Name, DateOfBirth, Address)। ইউজারের করা অন্য কোনো ট্রানজেকশন ডেটা (যেমন: Order History) অন্য Entity-তে রেখে Foreign Key দিয়ে কানেক্ট করা উচিত।
  • Best Practice 2 (Use Guid): সবসময় Identity Primary Key হিসেবে Guid ব্যবহার করবেন, এটি ডিস্ট্রিবিউটেড সিস্টেম এবং মাইক্রোসার্ভিস আর্কিটেকচারে ডেটা মাইগ্রেশনের সময় কনফ্লিক্ট এড়াতে সাহায্য করে।

Modern Updates in .NET 8 / 10: লেকচারের কোর কনসেপ্ট (MVC অ্যাপ্লিকেশনের জন্য) .NET 10-এও একদম সেম। তবে, যদি আপনি Web API বা Minimal API নিয়ে কাজ করেন, তাহলে .NET 8/10-এ Identity API Endpoints নামে একটি নতুন ফিচার এসেছে। সেখানে కন্ট্রোলার না লিখে সরাসরি builder.Services.AddIdentityApiEndpoints<ApplicationUser>() এবং app.MapIdentityApi<ApplicationUser>() ব্যবহার করে মাত্র ২ লাইনে লগইন/রেজিস্ট্রেশন API তৈরি করা যায়। তবে যেহেতু এই প্রজেক্টটি MVC ভিত্তিক, তাই লেকচারে দেখানো পদ্ধতিটিই এখানে সবচেয়ে সঠিক ও স্ট্যান্ডার্ড!