আজকের লেকচারে স্বাগতম!
কোথায় আছি আমরা? আপনি বর্তমানে 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 নিজে থেকেই এই রুলসগুলো চেক করে। রুলস না মানলেSucceededfalse হয়ে যায় এবং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.Succeededfalse হয়ে যায়। এরপর যখন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 তৈরি করা শিখবো!