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

কোথায় আছি আমরা? আপনি বর্তমানে Section 25: Identity-এর একটি চমৎকার এবং দরকারি লেকচারে আছেন। গত লেকচারে আমরা Active Nav Link হাইলাইট করা শিখেছিলাম। আজকে আমরা শিখবো Password Complexity Configuration। অর্থাৎ, ইউজার যখন রেজিস্ট্রেশন করবে, তখন তার পাসওয়ার্ড কতটা শক্তিশালী (strong) হতে হবে, সেই রুলসগুলো কীভাবে সেট করতে হয়, তা আমরা আজ দেখবো। চলুন শুরু করি!


📝 Quick Summary for Revision

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

  • Password Complexity: ইউজারের পাসওয়ার্ড কতটা কঠিন বা সিকিউর হবে তা নির্ধারণ করার প্রক্রিয়া।

  • Configuration Place: এটি AddIdentity সার্ভিস অ্যাড করার সময় Lambda expression-এর মাধ্যমে কনফিগার করা হয়।

  • Key Properties: * RequiredLength: পাসওয়ার্ডের সর্বনিম্ন ক্যারেক্টার সংখ্যা (ডিফল্ট: 6)।

  • RequireNonAlphanumeric: স্পেশাল ক্যারেক্টার (যেমন: @, #, $) লাগবে কিনা।

  • RequireUppercase: বড় হাতের অক্ষর (A-Z) লাগবে কিনা।

  • RequireLowercase: ছোট হাতের অক্ষর (a-z) লাগবে কিনা।

  • RequireDigit: সংখ্যা (0-9) লাগবে কিনা।

  • RequiredUniqueChars: পাসওয়ার্ডে ন্যূনতম কতগুলো ভিন্ন বা ইউনিক ক্যারেক্টার থাকতে হবে।

  • Validation Point: UserManager.CreateAsync কল করার সময় Identity নিজে থেকেই এই রুলসগুলো চেক করে। রুলস না মানলে Succeeded false হয়ে যায় এবং Errors রিটার্ন করে।


🧠 Comprehensive Breakdown

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

১. What is Password Complexity Configuration? (Priority: 9/10)

Identity ফ্রেমওয়ার্ক বাই ডিফল্ট পাসওয়ার্ডের জন্য বেশ কড়া নিয়ম মেনে চলে। যেমন: পাসওয়ার্ডে অন্তত একটি বড় হাতের অক্ষর, একটি ছোট হাতের অক্ষর, একটি নাম্বার এবং একটি স্পেশাল ক্যারেক্টার থাকতে হবে এবং লেন্স ন্যূনতম ৬ হতে হবে। কিন্তু ডেভেলপমেন্ট বা প্র্যাকটিসের সময় বারবার এত কঠিন পাসওয়ার্ড দেওয়া বিরক্তিকর হতে পারে। তাই PasswordOptions ব্যবহার করে আমরা আমাদের ইচ্ছামতো এই রুলসগুলো কাস্টমাইজ বা সহজ করতে পারি। রিয়েল-ওয়ার্ল্ড প্রজেক্টে এগুলো কড়া (Strict) রাখাই উত্তম।

২. PasswordOptions Properties (Priority: 10/10)

লেকচারার এখানে বেশ কয়েকটি গুরুত্বপূর্ণ প্রপার্টির কথা বলেছেন যা options.Password-এর অধীনে থাকে:

  • RequiredLength: পাসওয়ার্ডের সাইজ কমপক্ষে কত হতে হবে। লেকচারে এটি কাস্টমাইজ করে 5 করা হয়েছে (ডিফল্ট 6 থাকে)।
  • RequireNonAlphanumeric: true হলে পাসওয়ার্ডে অন্তত একটি স্পেশাল ক্যারেক্টার (symbol) থাকা বাধ্যতামূলক। প্র্যাকটিসের সুবিধার জন্য লেকচারে এটি false করা হয়েছে।
  • RequireUppercase: true হলে অন্তত একটি Uppercase লেটার লাগবে। এটিও লেকচারে false করা হয়েছে।
  • RequireLowercase: true হলে অন্তত একটি Lowercase লেটার লাগবে। লেকচারে এটি true রাখা হয়েছে।
  • RequireDigit: true হলে অন্তত একটি নাম্বার (digit) লাগবে। লেকচারে এটি false করা হয়েছে।
  • RequiredUniqueChars: একটি পাসওয়ার্ডে কয়টি আলাদা আলাদা বা ইউনিক ক্যারেক্টার থাকতে হবে। ধরুন, পাসওয়ার্ড দেওয়া হলো ab12ab। এখানে ‘a’, ‘b’, ‘1’, এবং ‘2’—এই ৪টি ইউনিক ক্যারেক্টার আছে। লেকচারে এটি 3 সেট করা হয়েছে।

৩. Code Implementation in ConfigureServices (Priority: 10/10)

Identity সার্ভিস IoC Container-এ যুক্ত করার সময় একটি Action<IdentityOptions> ডিলিগেট বা ল্যাম্বডা এক্সপ্রেশন (Lambda expression) পাস করে এটি কনফিগার করা হয়।

💻 Code Implementation (As shown in the lecture): আপনার StartupExtensions.cs বা যেখানে সার্ভিস কনফিগার করা হয়েছে, সেখানে AddIdentity মেথডে নিচের মতো করে রুলস সেট করতে হবে:

services.AddIdentity<ApplicationUser, ApplicationRole>(options =>
{
    // Password Complexity Rules Setup
    options.Password.RequiredLength = 5; // Minimum length 5
    options.Password.RequireNonAlphanumeric = false; // No symbols required
    options.Password.RequireUppercase = false; // No uppercase letters required
    options.Password.RequireLowercase = true; // Must have at least one lowercase letter
    options.Password.RequireDigit = false; // No numbers required
    options.Password.RequiredUniqueChars = 3; // Must have at least 3 distinct characters
})
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();
 

৪. How the Validation Works at Runtime (Priority: 8/10)

আপনি কনফিগারেশনে রুলস তো সেট করলেন, কিন্তু এটি চেক হয় কখন?

  • যখন আপনি Register View-এর ফর্মে ডেটা দিয়ে সাবমিট করেন, তখন Controller-এ registerDTO ডেটা নিয়ে আসে।
  • এরপর যখন আপনি await _userManager.CreateAsync(user, password); কল করেন, তখন UserManager নিজে থেকেই আপনার দেওয়া পাসওয়ার্ডটি এই PasswordOptions রুলসের সাথে মিলিয়ে চেক করে।
  • Example from Lecture: লেকচারার প্রথমে পাসওয়ার্ড দিয়েছিলেন j123 (৪ ক্যারেক্টার)। কিন্তু রুলসে RequiredLength = 5 দেওয়া ছিলো। তাই CreateAsync ফেইল করে এবং result.Succeeded false হয়ে যায়। এরপর যখন j1234 দেওয়া হয়, তখন এটি সব রুলস (length 5, lowercase আছে, unique char 3+ আছে) মেনে চলায় রেজিস্ট্রেশন সাকসেসফুল হয়।

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

  • Production vs. Development: লেকচারার যা দেখিয়েছেন (যেমন: Uppercase, Digit, Symbols false করে দেওয়া) তা শুধুমাত্র শেখার বা প্র্যাকটিসের সুবিধার জন্য। প্রোডাকশন লেভেলে কখনোই এগুলো false করবেন না। বরং RequiredLength ৮ বা ১০ করে দেওয়া উচিত।
  • Match Backend with Frontend: আপনি ব্যাকএন্ডে (PasswordOptions) যে রুলস সেট করবেন, খেয়াল রাখবেন আপনার RegisterDTO-এর Data Annotations (যেমন: Regular Expression বা StringLength) যেন ঠিক একই রুলস ফলো করে। তা না হলে Client-side validation পাস হয়ে যাবে, কিন্তু সার্ভার-সাইডে এসে CreateAsync ফেইল করবে।

.NET 10 Code Update: .NET 10 বা লেটেস্ট ভার্সনগুলোতে Program.cs ফাইলে আমরা সরাসরি builder.Services ব্যবহার করে খুব ক্লিন ওয়েতে এটি কনফিগার করতে পারি।

// Program.cs in .NET 10
builder.Services.AddIdentity<ApplicationUser, ApplicationRole>(options =>
{
    // Standard secure defaults for modern applications
    options.Password.RequireDigit = true;
    options.Password.RequireLowercase = true;
    options.Password.RequireNonAlphanumeric = true;
    options.Password.RequireUppercase = true;
    options.Password.RequiredLength = 8;
    options.Password.RequiredUniqueChars = 4;
})
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();
 

পরবর্তী লেকচারে আমরা ইউজারদের লগইন করানোর জন্য Login View তৈরি করা শিখবো!