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

কোথায় আছি আমরা? আপনি বর্তমানে Section 25: Identity-তে আছেন। গত লেকচারে আমরা Identity-র Entity Classes (ApplicationUser এবং ApplicationRole) এবং IdentityDbContext তৈরি করেছিলাম। আজকে আমরা শিখবো কীভাবে এই ক্লাসগুলোকে আমাদের অ্যাপ্লিকেশনের IoC (Inversion of Control) Container-এ Service হিসেবে রেজিস্টার বা কনফিগার করতে হয়। চলুন শুরু করি!


📝 Quick Summary for Revision

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

  • Add Identity Service: AddIdentity মেথড ব্যবহার করে ASP.NET Core-কে জানানো হয় যে আমরা Identity ব্যবহার করতে চাই।
  • Define Models: জেনেরিক প্যারামিটার হিসেবে আমাদের কাস্টম ApplicationUser এবং ApplicationRole ক্লাসগুলোকে ডিক্লেয়ার করা।
  • Entity Framework Stores: Identity-র ডেটা সেভ করার জন্য AddEntityFrameworkStores ব্যবহার করে আমাদের ApplicationDbContext-কে লিঙ্ক করা।
  • Configure Repositories: Identity-র ইন্টারনাল Repository Layer হিসেবে UserStore এবং RoleStore কনফিগার করা।
  • Token Providers: ইমেইল ভেরিফিকেশন বা পাসওয়ার্ড রিসেটের সময় OTP বা টোকেন জেনারেট করার জন্য AddDefaultTokenProviders যুক্ত করা।

🧠 Comprehensive Breakdown

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

১. Adding Identity to the IoC Container (Priority: 10/10)

Identity নিয়ে কাজ শুরু করার আগে, এর সার্ভিসগুলোকে Dependency Injection (DI) বা IoC Container-এ যুক্ত করতে হবে।

Why do this? ASP.NET Core অটোমেটিকভাবে জানে না যে আপনি ইউজার ম্যানেজমেন্টের জন্য কোন ক্লাস ব্যবহার করছেন। AddIdentity<ApplicationUser, ApplicationRole>() কল করার মাধ্যমে আমরা ফ্রেমওয়ার্ককে বলে দিচ্ছি, “আমার ইউজার ডেটা ApplicationUser-এ থাকবে এবং রোল ডেটা ApplicationRole-এ থাকবে।” এটি ডেটাবেসে AspNetUsers এবং AspNetRoles টেবিল তৈরি করার ভিত্তি স্থাপন করে।

২. Configuring Entity Framework Stores (Priority: 10/10)

Identity কনফিগার করার সময় আপনাকে বলে দিতে হবে ডেটা কোথায় এবং কীভাবে সেভ হবে।

Why do this? Identity নিজে থেকে কোনো ডেটাবেসের সাথে কানেক্ট হতে পারে না। AddEntityFrameworkStores<ApplicationDbContext>() ব্যবহার করে আমরা বলে দিই যে, “Entity Framework Core ব্যবহার করে আমার ApplicationDbContext এর মাধ্যমে ডেটাবেসে ইউজার এবং রোল সেভ করো।“

৩. Configuring the Repository Layer: UserStore & RoleStore (Priority: 8/10)

আগের লেকচারে আমরা আর্কিটেকচার নিয়ে কথা বলেছিলাম। Controllers সরাসরি DbContext ব্যবহার করে না, তারা UserManager ব্যবহার করে। আর UserManager ব্যাকগ্রাউন্ডে UserStore (Repository) ব্যবহার করে।

Why do this? যদিও AddEntityFrameworkStores অনেক কিছু অটোমেটিক করে দেয়, লেকচারার এখানে এক্সপ্লিসিটলি (explicitly) AddUserStore এবং AddRoleStore কনফিগার করেছেন। এর মূল কারণ হলো আমাদের Primary Key এর ডেটা টাইপ string এর বদলে Guid। ফ্রেমওয়ার্ককে সঠিকভাবে Repository তৈরি করার জন্য DbContext এবং Guid টাইপ চিনিয়ে দিতে হয়।

  • UserStore: এটি Users টেবিলের উপর CRUD operations হ্যান্ডেল করে।
  • RoleStore: এটি Roles টেবিলের উপর CRUD operations হ্যান্ডেল করে।

৪. Default Token Providers (Priority: 7/10)

সবশেষে লেকচারার AddDefaultTokenProviders() মেথডটি কল করেছেন।

Why do this? যখন কোনো ইউজার “Forgot Password”-এ ক্লিক করে, তখন তাকে একটি সিকিউর লিংক বা OTP ইমেইল করা হয়। অথবা নতুন ইউজার রেজিস্ট্রেশন করলে ইমেইল ভেরিফিকেশন লিংক পাঠানো হয়। এই সিকিউর রেন্ডম টোকেনগুলো (যেমন: Email Token, Phone Number Token, Security Stamp Token) জেনারেট করার জন্য এই সার্ভিসটি IoC কন্টেইনারে থাকতে হয়।

💻 Code Implementation (Putting it all together)

আপনার StartupExtensions.cs (বা যে ফাইলে আপনি সার্ভিস কনফিগার করছেন) ফাইলে অন্যান্য সার্ভিস এবং DbContext অ্যাড করার ঠিক পরে নিচের কোডটি যুক্ত করতে হবে:

using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Identity.EntityFrameworkCore;
 
// ... other service registrations ...
 
// 1. Adding Identity and mentioning custom models
services.AddIdentity<ApplicationUser, ApplicationRole>()
        
        // 2. Mentioning which DbContext to use for EF Core
        .AddEntityFrameworkStores<ApplicationDbContext>()
        
        // 3. Configuring UserStore (Repository for Users) with Guid
        .AddUserStore<UserStore<ApplicationUser, ApplicationRole, ApplicationDbContext, Guid>>()
        
        // 4. Configuring RoleStore (Repository for Roles) with Guid
        .AddRoleStore<RoleStore<ApplicationRole, ApplicationDbContext, Guid>>()
        
        // 5. Enabling Token generation for OTPs and Reset Links
        .AddDefaultTokenProviders();
 

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

  • Keep Service Registration Clean: আপনার প্রজেক্ট বড় হলে Program.cs ফাইলে সব সার্ভিস একসাথে লিখলে কোড হিজিবিজি হয়ে যায়। লেকচারার যেমন ConfigureServices নামে এক্সটেনশন মেথড ব্যবহার করেছেন, এটি একটি চমৎকার বেস্ট প্র্যাকটিস।
  • Minimal Configuration (Modern .NET): .NET 6 থেকে .NET 10 পর্যন্ত, আপনি যদি স্ট্যান্ডার্ড AddIdentity এবং AddEntityFrameworkStores ব্যবহার করেন, তবে অনেক সময় ম্যানুয়ালি AddUserStore এবং AddRoleStore লেখার প্রয়োজন হয় না। ফ্রেমওয়ার্ক জেনেরিক টাইপগুলো থেকে অটোমেটিকভাবে Guid চিনে নিতে পারে।

.NET 10 Code Example (Smarter & Shorter Approach): .NET 10-এ Program.cs ফাইলে (যেখানে builder.Services ব্যবহার করা হয়) আপনি নিচের মতো করেও কোড লিখতে পারেন, যা একদম সেম কাজ করবে:

builder.Services.AddIdentity<ApplicationUser, ApplicationRole>()
    .AddEntityFrameworkStores<ApplicationDbContext>()
    .AddDefaultTokenProviders();
 

নোট: যেহেতু আপনি একটি নির্দিষ্ট কোর্স ফলো করছেন, তাই লেকচারার যেভাবে AddUserStore এবং AddRoleStore দেখিয়েছেন সেভাবে প্র্যাকটিস করাই ভালো, এতে আন্ডার-দ্য-হুড (under the hood) আর্কিটেকচার সম্পর্কে ধারণা পরিষ্কার থাকে।