আজকের লেকচারে স্বাগতম!
কোথায় আছি আমরা? আপনি বর্তমানে Section 25: Identity-তে আছেন। গত লেকচারে আমরা Authentication Cookie এবং SignInManager ব্যবহার করে ইউজারকে সিস্টেমে লগইন করানো শিখেছি। কিন্তু লগইন করার পরও আমাদের সাইটের মেনুতে “Register” এবং “Login” বাটন দেখা যাচ্ছিলো। আজকে আমরা শিখবো কীভাবে ইউজারের লগইন স্ট্যাটাসের উপর ভিত্তি করে UI (User Interface) ডাইনামিক করতে হয়, অর্থাৎ লগইন থাকলে শুধু নাম ও “Logout” বাটন দেখাবে, আর না থাকলে “Register/Login” দেখাবে।
📝 Quick Summary for Revision
ভবিষ্যতে দ্রুত রিভিশন দেওয়ার জন্য পুরো লেকচারের মূল বিষয়গুলো নিচে লিস্ট করা হলো:
- Dynamic UI Goal: ইউজার লগইন করা থাকলে Navigation Bar-এ Username এবং Logout বাটন দেখানো। লগআউট করা থাকলে Register এবং Login বাটন দেখানো।
- Authentication Check: Razor View-তে
User.Identity.IsAuthenticatedপ্রপার্টি ব্যবহার করে ইউজার লগইন করা আছে কিনা তা (true/false) চেক করা হয়। - Cookie Dependency: ব্রাউজারে Identity Cookie থাকলেই
IsAuthenticatedtrue হয়, Cookie না থাকলে বা রিমুভ হয়ে গেলে false হয়। - If-Else Logic:
_Layout.cshtmlফাইলে if-else কন্ডিশন ব্যবহার করে কন্টেন্ট রেন্ডার করা। - UI Enhancement: নামের পাশে FontAwesome-এর ইউজার আইকন (
fa-user) যুক্ত করা।
🧠 Comprehensive Breakdown
এখানে লেকচারের প্রতিটি বিষয় বিস্তারিতভাবে এবং ধাপে ধাপে ব্যাখ্যা করা হলো:
১. The Requirement: Conditional Navigation Menu (Priority: 8/10)
সাধারণত যেকোনো ওয়েবসাইটে (যেমন: Facebook, Google) আপনি যখন লগইন অবস্থায় থাকেন, তখন আপনাকে নতুন করে অ্যাকাউন্ট খোলার বা লগইন করার বাটন দেখানো হয় না। এর বদলে আপনার প্রোফাইলের নাম বা আইকন এবং লগআউট করার অপশন থাকে। আমাদের প্রজেক্টেও ঠিক এই লজিকটি ইমপ্লিমেন্ট করতে হবে।
২. How to Check Login Status in Razor View (Priority: 10/10)
ASP.NET Core-এ যেকোনো Razor View ফাইলে (.cshtml) User নামে একটি বিল্ট-ইন প্রপার্টি থাকে। এটি ClaimsPrincipal টাইপের একটি অবজেক্ট, যা বর্তমান রিকোয়েস্ট করা ইউজারের সকল তথ্য ধারণ করে।
User.Identity.IsAuthenticated: এটি একটি বুলিয়ান (Boolean) প্রপার্টি।- যদি ইউজার লগইন করা থাকে (অর্থাৎ ইউজারের ব্রাউজারে Authentication Cookie সেট করা থাকে), তাহলে এটি
trueরিটার্ন করে। - আর যদি ইউজার লগইন করা না থাকে (বা Cookie এক্সপায়ার/ডিলিট হয়ে যায়), তবে এটি
falseরিটার্ন করে।
৩. Modifying the Layout View (Priority: 10/10)
আমাদের _Layout.cshtml ফাইলের Navigation অংশে আগে শুধু Register এবং Login এর লিংক হার্ডকোড করা ছিলো। এখন আমরা সেখানে if-else স্টেটমেন্ট ব্যবহার করে লজিক বসাবো।
💻 Code Implementation (Views/Shared/_Layout.cshtml):
<ul class="nav">
@* কন্ডিশন চেক করা হচ্ছে: ইউজার কি লগইন করা আছে? *@
@if (User.Identity.IsAuthenticated)
{
@* যদি লগইন থাকে (True) *@
<li>
@* নামের পাশে একটি ইউজার আইকন দেখানোর জন্য FontAwesome ব্যবহার করা হয়েছে *@
<i class="fa-solid fa-user"></i>
@User.Identity.Name
</li>
<li>
@* লগআউট করার লিংক (অ্যাকশনটি আমরা পরবর্তী লেকচারগুলোতে তৈরি করবো) *@
<a asp-controller="Account" asp-action="Logout">Logout</a>
</li>
}
else
{
@* যদি লগইন না থাকে (False) *@
<li>
<a asp-controller="Account" asp-action="Register">Register</a>
</li>
<li>
<a asp-controller="Account" asp-action="Login">Login</a>
</li>
}
</ul>
How it works at runtime: যখন রিকোয়েস্ট সার্ভারে আসে, তখন Authentication Middleware ইউজারের Cookie পড়ে User অবজেক্ট তৈরি করে। এরপর যখন Layout View রেন্ডার হতে শুরু করে, তখন এই If-Else কন্ডিশনটি ইভালুয়েট (evaluate) হয়। ইউজারের স্ট্যাটাস অনুযায়ী শুধুমাত্র if ব্লক অথবা শুধুমাত্র else ব্লকের HTML ট্যাগগুলো ব্রাউজারে পাঠানো হয়।
🌟 Best Practices & Modern Updates (.NET 10 Context)
- Best Practice 1: Use Partial Views (
_LoginPartial.cshtml): লেকচারার সরাসরি_Layout.cshtmlফাইলে এই If-Else লজিকটি লিখেছেন। কিন্তু প্রোডাকশন লেভেলের প্রজেক্টে বা ডিফল্ট ASP.NET Core টেমপ্লেটে লগইন/রেজিস্টার সম্পর্কিত এই মেনুটি একটি আলাদা Partial View-তে রাখা হয় (যাকে সাধারণত_LoginPartial.cshtmlবলা হয়)। এরপর_Layout.cshtmlথেকে সেটিকে కాల్ (call) করা হয়:<partial name="_LoginPartial" />। এতে Layout ফাইলটি ক্লিন থাকে। - Best Practice 2: Logout should ALWAYS be a POST Request (Critical Security): লেকচারার Logout-এর জন্য একটি সাধারণ
<a>(anchor) লিংক ব্যবহার করেছেন, যা একটি HTTP GET রিকোয়েস্ট তৈরি করে। এটি একটি বড় সিকিউরিটি রিস্ক! GET রিকোয়েস্ট দিয়ে লগআউট করলে আপনার সাইট CSRF (Cross-Site Request Forgery) অ্যাটাকের শিকার হতে পারে। হ্যাকাররা সহজেই অন্য কোনো সাইট থেকে বা ইমেজ ট্যাগের সোর্স হিসেবে আপনার লগআউট ইউআরএল বসিয়ে ইউজারকে অটোমেটিক লগআউট করিয়ে দিতে পারে। সঠিক ও মডার্ন পদ্ধতি: লগআউট সবসময় Form সাবমিট (POST request) এর মাধ্যমে করতে হবে।
<form asp-controller="Account" asp-action="Logout" method="post" style="display:inline;">
<button type="submit" class="btn btn-link nav-link">Logout</button>
</form>
পরবর্তী লেকচারে আমরা শিখবো কীভাবে মেনুবারের Active Link হাইলাইট করতে হয়, যাতে ইউজার বুঝতে পারে সে বর্তমানে কোন পেজে অবস্থান করছে!