আজকের লেকচারে স্বাগতম!
কোথায় আছি আমরা? আপনি বর্তমানে Section 25: Identity-এর একেবারে শেষ পর্যায়ে আছেন। গত লেকচারে আমরা Areas ব্যবহার করে Admin-দের জন্য আলাদা Controller এবং View তৈরি করা শিখেছিলাম। কিন্তু তখন একটি সমস্যা ছিল—যে কেউ চাইলে URL টাইপ করে Admin Area-তে ঢুকে যেতে পারতো। আজকে আমরা শিখবো Role-Based Authentication (Authorization), যার মাধ্যমে আমরা নির্দিষ্ট Controller বা Action Method-কে শুধুমাত্র নির্দিষ্ট Role (যেমন: Admin) এর জন্য সিকিউর করতে পারবো। চলুন শুরু করি!
📝 Quick Summary for Revision
ভবিষ্যতে দ্রুত রিভিশন দেওয়ার জন্য পুরো লেকচারের মূল বিষয়গুলো নিচে লিস্ট করা হলো:
- Role-Based Authentication: নির্দিষ্ট Role-এর ইউজারদের (যেমন Admin, Employee) জন্য নির্দিষ্ট পেজ বা Endpoints অ্যাক্সেস সীমাবদ্ধ করার প্রক্রিয়া।
- [Authorize] Attribute: এটি একটি Predefined authorization filter, যা
Microsoft.AspNetCore.Authorizationnamespace থেকে আসে। - Roles Property:
[Authorize(Roles = "Admin")]ব্যবহার করে বলে দেওয়া যায় কোন Role এই পেজটি অ্যাক্সেস করতে পারবে। একাধিক Role থাকলে কমা (,) দিয়ে লেখা যায়। - Scope of Application: এটি পুরো Controller-এর ওপর বা নির্দিষ্ট কোনো Action Method-এর ওপর ব্যবহার করা যায়।
- Access Denied Redirection: যদি কোনো সাধারণ ইউজার (যে Admin নয়) লগইন থাকা অবস্থায় Admin পেজে ঢোকার চেষ্টা করে, তবে সিস্টেম তাকে Login পেজে নয়, বরং স্বয়ংক্রিয়ভাবে
Account/AccessDeniedURL-এ রিডাইরেক্ট করে দেয়।
🧠 Comprehensive Breakdown
এখানে লেকচারের প্রতিটি বিষয় বিস্তারিতভাবে এবং ধাপে ধাপে ব্যাখ্যা করা হলো:
১. What is Role-Based Authentication? (Priority: 9/10)
Role-Based Authentication (বা Authorization) হলো এমন একটি মেকানিজম, যেখানে আমরা সিস্টেমকে বলে দিই যে, “এই নির্দিষ্ট পেজ বা Controller-টি শুধুমাত্র সেই ইউজাররাই ভিজিট করতে পারবে, যাদের Role হলো ‘Admin’ বা ‘Manager’।” এর মাধ্যমে আমরা সাধারণ Customer এবং Administrator-দের মধ্যে অ্যাক্সেস কন্ট্রোলের একটি শক্ত দেয়াল তৈরি করি।
২. Applying the [Authorize] Attribute (Priority: 10/10)
গত লেকচারে আমরা Admin Area-এর ভেতরে যে HomeController তৈরি করেছিলাম, সেটিকে এখন আমরা সিকিউর করবো। এর জন্য আমাদের [Authorize] অ্যাট্রিবিউট ব্যবহার করতে হবে এবং এর ভেতরে Roles প্রপার্টি সেট করতে হবে।
💻 Code Implementation (Areas/Admin/Controllers/HomeController.cs):
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Authorization; // এই Namespace টি ইমপোর্ট করতে হবে
namespace ContactManager.UI.Areas.Admin.Controllers
{
[Area("Admin")]
// Role-based Authorization অ্যাপ্লাই করা হলো
[Authorize(Roles = "Admin")]
public class HomeController : Controller
{
public IActionResult Index()
{
return View();
}
}
}
- Multiple Roles (Extra Info): যদি আপনি চান যে ‘Admin’ এবং ‘Manager’ দুজনেই পেজটি দেখতে পারবে, তবে কমা দিয়ে লিখতে পারেন:
[Authorize(Roles = "Admin,Manager")]।
৩. Controller Level vs Action Method Level (Priority: 8/10)
লেকচারার এখানে একটি চমৎকার পয়েন্ট উল্লেখ করেছেন:
- Controller Level: যখন আপনি
[Authorize]অ্যাট্রিবিউটটি Controller ক্লাসের ঠিক ওপরে লেখেন (যেমনটা আমরা ওপরে করেছি), তখন ওই Controller-এর ভেতরের সবগুলো Action Method ওই Role-এর আন্ডারে সিকিউর হয়ে যায়। এটি সবচেয়ে কমন প্র্যাকটিস। - Action Method Level: যদি আপনার একটি Controller-এ ১০টি Action Method থাকে এবং আপনি চান যে তার মধ্যে মাত্র ২টি মেথড শুধু Admin-রা অ্যাক্সেস করুক, তবে আপনি Controller-এর ওপর না লিখে সরাসরি ওই ২টি Action Method-এর ওপরে
[Authorize(Roles = "Admin")]লিখতে পারেন।
৪. The “Access Denied” Behavior (Priority: 10/10)
এটি এই লেকচারের সবচেয়ে ট্রিকি এবং ইম্পর্ট্যান্ট পার্ট!
- Scenario 1 (Not Logged In): যদি কেউ লগইন না করেই
admin/home/indexএ ঢোকার চেষ্টা করে, তবে Authorization Middleware তাকে সোজা Login Page-এ রিডাইরেক্ট করবে (যা আমরা আগের লেকচারগুলোতে দেখেছি)। - Scenario 2 (Logged In, but Wrong Role): ধরুন, ‘Harsha’ নামের একজন সাধারণ ইউজার সিস্টেমে লগইন করলো। লগইন করার পর সে চালাকি করে ব্রাউজারের URL বারে
admin/home/indexলিখে এন্টার দিলো। তখন কী হবে? সিস্টেম জানে যে Harsha লগইন করা আছে, তাই তাকে আর Login পেজে পাঠাবে না। কিন্তু সিস্টেম এটাও দেখবে যে Harsha-এর Role ‘Admin’ নয়। তখন ফ্রেমওয়ার্ক অটোমেটিকভাবে তাকে/Account/AccessDeniedনামের একটি পেজে রিডাইরেক্ট করে দিবে।
🌟 Best Practices & Modern Updates (.NET 10 Context)
- Create the AccessDenied View: ফ্রেমওয়ার্ক অটোমেটিকভাবে
/Account/AccessDeniedURL-এ রিডাইরেক্ট করে ঠিকই, কিন্তু আপনি যদি আপনারAccountController-এAccessDeniedনামে কোনো Action Method এবং View তৈরি না করেন, তবে ইউজার একটি 404 Error খাবে। তাই সবসময় একটি সুন্দর 403 Forbidden বা Access Denied পেজ ডিজাইন করে রাখা Best Practice।
// AccountController.cs
[AllowAnonymous]
[HttpGet("Account/AccessDenied")]
public IActionResult AccessDenied()
{
return View(); // একটি View তৈরি করে সেখানে লিখুন: "You do not have permission to view this page."
}
- Modern Trend - Policy-Based Authorization (.NET 8/10): যদিও
[Authorize(Roles = "Admin")].NET 10-এ পুরোপুরি সাপোর্ট করে এবং ছোট-মাঝারি প্রজেক্টে প্রচুর ব্যবহৃত হয়, তবে বর্তমানে মাইক্রোসফট Policy-Based Authorization ব্যবহার করতে বেশি উৎসাহিত করে। Policy-তে আপনি শুধু Role নয়, বরং ইউজারের বয়স, লোকেশন বা অন্যান্য Claims-এর ওপর ভিত্তি করেও অত্যন্ত ফ্লেক্সিবল রুলস তৈরি করতে পারেন (যেমন:[Authorize(Policy = "RequireAdminRole")])।
অসাধারণ! আপনি সফলভাবে ASP.NET Core Identity-এর মতো একটি জটিল সেকশন শেষ করেছেন। রেজিস্ট্রেশন, লগইন, কুকি ম্যানেজমেন্ট, রোল, এবং এরিয়াস—সবকিছুই এখন আপনার নখদর্পণে!