eitaa logo
پروژه ASP.Net Core MVC (وب و سی شارپ)
120 دنبال‌کننده
168 عکس
38 ویدیو
376 فایل
❁﷽❁ آموزش 📖 برنامه نویسی ASP.Net Core MVC (وب و سی شارپ) Admin: @alialirezapanahi برنامه نویسی برنامه نویسی سی شارپ eitaa.com/sisharpapp برنامه نویسی وب eitaa.com/aspdatnet ویراستی virasty.com/alialirezapanahi آپارات aparat.com/alialirezapanahi
مشاهده در ایتا
دانلود
پروژه ASP.Net Core MVC (وب و سی شارپ)
درس آخر فروشگاه مدیریت سفارش فروشگاه و مدیریت پرداخت ها و Authorization و Authentication در ادمین
این کد مربوط به یک کلاس استاتیک به نام
ClaimUtility
است که ابزارهایی برای مدیریت و استخراج اطلاعات از ClaimsPrincipal در ASP.NET Core ارائه می‌دهد. در ASP.NET Core، ClaimsPrincipal یک شیء است که اطلاعات احراز هویت و مجوزهای کاربر، مانند شناسه کاربر، ایمیل و نقش‌ها را ذخیره می‌کند. بیایید هر بخش از این کد را بررسی کنیم: --- ### ۱. کلاس و هدف کلی csharp public static class ClaimUtility - نوع کلاس: استاتیک. - هدف: این کلاس شامل متدهایی برای استخراج اطلاعات کلیدی از ClaimsPrincipal، مثل شناسه کاربر، ایمیل و نقش‌ها است. --- ### ۲. متد `GetUserId` csharp public static long? GetUserId(ClaimsPrincipal User) #### شرح عملکرد: 1. ورودی: - یک شیء
ClaimsPrincipal
که اطلاعات کاربر احراز هویت شده را نگهداری می‌کند. 2. منطق کاری: - تلاش می‌کند مقدار ClaimTypes.NameIdentifier را که معمولاً شامل شناسه کاربر است، پیدا کند. - اگر یافت شود، مقدار آن به
long
تبدیل می‌شود و بازگردانده می‌شود. 3. مدیریت خطا: - اگر هیچ Claim با نوع
NameIdentifier
پیدا نشود یا خطایی رخ دهد، مقدار
null
بازگردانده می‌شود. #### مثال استفاده: csharp long? userId = ClaimUtility.GetUserId(User); if (userId != null) { Console.WriteLine($"شناسه کاربر: {userId}"); } --- ### ۳. متد `GetUserEmail` csharp public static string GetUserEmail(ClaimsPrincipal User) #### شرح عملکرد: 1. ورودی: - یک شیء
ClaimsPrincipal
که شامل اطلاعات Claims است. 2. منطق کاری: - تلاش می‌کند مقدار ClaimTypes.Email (ایمیل کاربر) را پیدا و بازگرداند. 3. مدیریت خطا: - اگر خطایی رخ دهد یا Claim مربوط به ایمیل وجود نداشته باشد، مقدار
null
بازگردانده می‌شود. #### مثال استفاده: csharp string email = ClaimUtility.GetUserEmail(User); if (!string.IsNullOrEmpty(email)) { Console.WriteLine($"ایمیل کاربر: {email}"); } --- ### ۴. متد `GetRolse` csharp public static List<string> GetRolse(ClaimsPrincipal User) #### شرح عملکرد: 1. ورودی: - یک شیء
ClaimsPrincipal
. 2. منطق کاری: - تمامی Claims که نوع آن‌ها به "role" ختم می‌شود، استخراج شده و مقادیر آن‌ها به صورت لیستی از رشته‌ها بازگردانده می‌شوند. - این Claims معمولاً نشان‌دهنده نقش‌های کاربر در سیستم هستند. 3. مدیریت خطا: - اگر خطایی رخ دهد، مقدار
null
بازگردانده می‌شود. #### مثال استفاده: csharp List<string> roles = ClaimUtility.GetRolse(User); foreach (var role in roles) { Console.WriteLine($"نقش: {role}"); } --- ### ۵. نقاط قوت کد 1. ساده و کاربردی: - متدها به صورت جداگانه مسئول استخراج اطلاعات خاص از Claims هستند. 2. مدیریت خطا: - هر متد با استفاده از بلوک
try-catch
خطاهای احتمالی را مدیریت می‌کند و برنامه از کرش شدن جلوگیری می‌شود. 3. استفاده از LINQ: - برای جستجوی نقش‌ها از LINQ استفاده شده است که کد را خواناتر کرده است. --- ### ۶. پیشنهادات بهبود 1. اصلاح نام متد `GetRolse`: - نام متد باید
GetRoles
باشد تا اشتباه تایپی (
Rolse
) اصلاح شود و خوانایی کد افزایش یابد. csharp public static List<string> GetRoles(ClaimsPrincipal User) 2. ثبت لاگ در مدیریت خطا: - به جای بازگشت `null`، می‌توان خطاها را در سیستم لاگ ثبت کرد: csharp catch (Exception ex) { // ثبت خطا در سیستم لاگ Console.WriteLine($"خطا: {ex.Message}"); return null; } 3. بررسی مقادیر Claims پیش از استفاده: - در متد
GetUserEmail`، بهتر است بررسی شود که آیا `FindFirst
مقدار
null
بازگردانده است یا خیر: csharp var emailClaim = claimsIdentity.FindFirst(ClaimTypes.Email); return emailClaim != null ? emailClaim.Value : null; 4. ایجاد تست‌های واحد: - برای اطمینان از صحت عملکرد متدها، تست‌های واحد (Unit Tests) برای هر متد ایجاد شود. --- ### ۷. کاربرد عملی این کلاس معمولاً در پروژه‌هایی که از ASP.NET Core Identity یا Cookie Authentication برای مدیریت کاربران استفاده می‌کنند، به کار می‌رود: - بررسی نقش کاربر برای نمایش یا پنهان کردن گزینه‌های منو. - دریافت شناسه یا ایمیل کاربر احراز هویت شده برای استفاده در عملیات پایگاه داده. - تأمین امنیت بخش‌های خاص برنامه بر اساس نقش کاربر. --- ### جمع‌بندی کلاس
ClaimUtility
یک ابزار ساده و قدرتمند برای مدیریت اطلاعات کاربران احراز هویت شده است. این کلاس امکان استخراج شناسه، ایمیل و نقش‌های کاربر را فراهم می‌کند. با اعمال بهبود‌های پیشنهادی، می‌توان عملکرد و قابلیت نگهداری آن را افزایش داد.
پروژه ASP.Net Core MVC (وب و سی شارپ)
درس آخر فروشگاه مدیریت سفارش فروشگاه و مدیریت پرداخت ها و Authorization و Authentication در ادمین
این کد مربوط به یک کنترلر در بخش مدیریت (Admin) یک سایت است که وظیفه مدیریت دسته‌بندی‌ها را بر عهده دارد. این کنترلر شامل عملیات‌هایی برای نمایش لیست دسته‌بندی‌ها، اضافه کردن دسته‌بندی جدید و مدیریت دسته‌بندی‌ها است. در ادامه بخش‌های مختلف این کد را توضیح می‌دهیم: --- ۱. مشخصات کلی کنترلر ویژگی
[Area("Admin")]
: csharp [Area("Admin")] - این ویژگی نشان‌دهنده این است که کنترلر مربوط به بخش مدیریت سایت است. - مسیر دسترسی به کنترلر شامل نام بخش خواهد بود (مثلاً
/Admin/Categories
). ویژگی
[Authorize(Roles = "Admin,Operator")]
: csharp [Authorize(Roles = "Admin,Operator")] - این ویژگی دسترسی به کنترلر را محدود به کاربران با نقش‌های
Admin
یا
Operator
می‌کند. - اگر کاربر وارد نشده باشد یا نقش مناسبی نداشته باشد، نمی‌تواند به این کنترلر دسترسی داشته باشد. --- ۲. وابستگی‌ها و سازنده کنترلر تعریف وابستگی: csharp private readonly IProductFacad _productFacad; -
IProductFacad
: این وابستگی به یک الگوی Facade اشاره دارد که عملیات مربوط به محصولات و دسته‌بندی‌ها را مدیریت می‌کند. تزریق وابستگی: csharp public CategoriesController(IProductFacad productFacad) { _productFacad = productFacad; } - وابستگی
IProductFacad
از طریق سازنده کنترلر تزریق می‌شود. - این روش باعث افزایش تست‌پذیری و انعطاف‌پذیری کنترلر می‌شود. --- ۳. اکشن
Index
(نمایش لیست دسته‌بندی‌ها) تعریف اکشن: csharp public IActionResult Index(long? parentId) { return View(_productFacad.GetCategoriesService.Execute(parentId).Data); } عملکرد: 1. ورودی: -
parentId
: یک شناسه اختیاری برای نمایش زیرشاخه‌های دسته‌بندی. - اگر
parentId
مقدار داشته باشد، زیرشاخه‌های دسته‌بندی مربوطه نمایش داده می‌شوند. 2. فراخوانی سرویس: - از متد
Execute
در
GetCategoriesService
وابسته به Facade استفاده می‌شود تا دسته‌بندی‌های مرتبط بازیابی شوند. 3. خروجی: - داده‌های بازیابی‌شده به View ارسال می‌شوند تا لیست دسته‌بندی‌ها نمایش داده شود. مثال استفاده: - نمایش تمامی دسته‌بندی‌های اصلی: /Admin/Categories/Index - نمایش زیرشاخه‌های یک دسته‌بندی: /Admin/Categories/Index?parentId=5 --- ۴. اکشن
AddNewCategory
(افزودن دسته‌بندی جدید) نمایش فرم افزودن دسته‌بندی: csharp [HttpGet] public IActionResult AddNewCategory(long? parentId) { ViewBag.parentId = parentId; return View(); } - این اکشن با روش
GET
فرم افزودن دسته‌بندی را نمایش می‌دهد. - مقدار
parentId
به View ارسال می‌شود تا در صورت نیاز، دسته‌بندی والد مشخص شود. --- ثبت دسته‌بندی جدید: csharp [HttpPost] public IActionResult AddNewCategory(long? ParentId, string Name) { var result = _productFacad.AddNewCategoryService.Execute(ParentId, Name); return Json(result); } شرح عملکرد: 1. ورودی: -
ParentId
: شناسه والد دسته‌بندی (اختیاری). -
Name
: نام دسته‌بندی جدید. 2. فراخوانی سرویس: - متد
Execute
از
AddNewCategoryService
فراخوانی می‌شود تا دسته‌بندی جدید ایجاد شود. 3. خروجی: - نتیجه عملیات به صورت JSON بازگردانده می‌شود. مثال استفاده: - افزودن یک دسته‌بندی اصلی: json { "ParentId": null, "Name": "دسته‌بندی جدید" } - افزودن یک زیرشاخه: json { "ParentId": 5, "Name": "زیرشاخه جدید" } --- ۵. الگوی Facade و وابستگی‌ها این کنترلر به
IProductFacad
وابسته است.
IProductFacad
احتمالاً شامل چندین سرویس است که عملیات مرتبط با دسته‌بندی‌ها و محصولات را مدیریت می‌کنند. سرویس‌های مورد استفاده: -
GetCategoriesService
: برای بازیابی لیست دسته‌بندی‌ها. -
AddNewCategoryService
: برای ایجاد دسته‌بندی جدید. --- ۶. نقاط قوت کد 1. کنترل دسترسی: محدود کردن دسترسی به کاربران مجاز با استفاده از
[Authorize(Roles = "Admin,Operator")]
. 2. استفاده از الگوی Facade: سرویس‌ها از طریق یک نقطه ورود (Facade) مدیریت می‌شوند، که کد را خواناتر و قابل نگهداری‌تر می‌کند. 3. تعامل ساده با Viewها: داده‌ها به صورت مستقیم به View ارسال می‌شوند. 4. پشتیبانی از دسته‌بندی‌های تو در تو: امکان ایجاد دسته‌بندی‌های والد و زیرشاخه‌ها به خوبی مدیریت شده است. --- ۷. پیشنهادات بهبود 1. اعتبارسنجی داده‌های ورودی: - بررسی کنید که
Name
خالی یا خیلی کوتاه نباشد: csharp if (string.IsNullOrWhiteSpace(Name)) { return Json(new { IsSuccess = false, Message = "نام دسته‌بندی نمی‌تواند خالی باشد" }); }
پروژه ASP.Net Core MVC (وب و سی شارپ)
درس آخر فروشگاه مدیریت سفارش فروشگاه و مدیریت پرداخت ها و Authorization و Authentication در ادمین
2. مدیریت خطاها: - در صورت بروز خطا در سرویس یا بازگشت نتیجه ناموفق، پیام مناسب به کاربر نمایش داده شود. 3. ثبت عملیات در لاگ: - ثبت لاگ برای عملیات اضافه کردن دسته‌بندی یا خطاهای احتمالی می‌تواند مفید باشد. --- جمع‌بندی این کنترلر به خوبی مدیریت عملیات مرتبط با دسته‌بندی‌ها را انجام می‌دهد و از اصول طراحی مناسب مانند تزریق وابستگی و استفاده از الگوی Facade بهره می‌برد. قابلیت‌هایی مانند نمایش دسته‌بندی‌ها، اضافه کردن زیرشاخه‌ها و محدود کردن دسترسی با استفاده از نقش‌ها، کد را امن و کاربردی کرده‌اند.
پروژه ASP.Net Core MVC (وب و سی شارپ)
درس آخر فروشگاه مدیریت سفارش فروشگاه و مدیریت پرداخت ها و Authorization و Authentication در ادمین
این بخش از کد مربوط به ناوبری (Navigation) در بخش مدیریت (
Admin Layout
) است و بر اساس نقش‌های کاربری (
Admin
و
Operator
) مشخص می‌کند که آیا بخش "دسته‌بندی‌ها" در منوی مدیریت نمایش داده شود یا خیر. در ادامه توضیحات کامل ارائه شده است: --- ۱. نقش‌ها و بررسی دسترسی csharp @if (ClaimUtility.GetRolse(User).Where(p => p == "Admin" || p == "Operator").Count() >= 1) شرح عملکرد: - متد ClaimUtility.GetRolse(User) لیستی از نقش‌های کاربر وارد‌شده را برمی‌گرداند. - از شرط
Where(p => p == "Admin" || p == "Operator")
استفاده می‌شود تا بررسی کند آیا کاربر نقش
Admin
یا
Operator
دارد. - اگر تعداد نقش‌ها بیشتر از 0 باشد (
Count() >= 1
)، منوی دسته‌بندی‌ها نمایش داده می‌شود. - این شرط تضمین می‌کند که فقط کاربران با نقش‌های مجاز به این بخش دسترسی داشته باشند. --- ۲. طراحی منوی "دسته‌بندی‌ها" html <li class="nav-item has-treeview "> <a href="#" class="nav-link active"> <i class="fa fa-tag"></i> <p> دسته بندی ها <i class="right fa fa-angle-left"></i> </p> </a> <ul class="nav nav-treeview"> <li class="nav-item"> <a href="~/admin/categories/" class="nav-link active"> <i class="fa fa-bookmark-o"></i> <p>دسته بندی ها </p> </a> </li> <li class="nav-item"> <a href="~/admin/categories/addnewcategory" class="nav-link active"> <i class="fa fa-plus nav-icon"></i> <p>افزودن دسته بندی جدید </p> </a> </li> </ul> </li> شرح طراحی: 1. مجموعه منو (
has-treeview
): - کلاس
nav-item has-treeview
نشان‌دهنده این است که این گزینه دارای زیرمنو است. 2. لینک اصلی منو (
nav-link active
): - لینک اصلی منو به‌صورت فعال (
active
) نشان داده شده است. -
fa fa-tag
: یک آیکون برای دسته‌بندی‌ها نمایش داده می‌شود. - متن "دسته بندی ها" و فلش کنار آن (
fa fa-angle-left
) نمایش داده می‌شود. 3. زیرمنوها (
nav nav-treeview
): - شامل دو گزینه است: - مشاهده دسته‌بندی‌ها: لینک به
~/admin/categories/
برای نمایش دسته‌بندی‌ها. - افزودن دسته‌بندی جدید: لینک به
~/admin/categories/addnewcategory
برای ایجاد دسته‌بندی جدید. --- ۳. نقاط قوت کد 1. کنترل دسترسی: - استفاده از نقش‌های کاربری برای کنترل نمایش منو باعث افزایش امنیت و بهبود تجربه کاربری شده است. 2. طراحی خوانا و ساده: - ساختار HTML منو به خوبی طراحی شده و از کلاس‌های Bootstrap برای استایل‌دهی استفاده شده است. 3. انعطاف‌پذیری: - به راحتی می‌توان گزینه‌های بیشتری به زیرمنو اضافه کرد یا نقش‌های کاربری دیگری را به شرط دسترسی افزود. --- ۴. پیشنهادات بهبود 1. استفاده از
Any
به جای
Where
و
Count
: - شرط می‌تواند به این شکل ساده‌تر شود: csharp @if (ClaimUtility.GetRolse(User).Any(p => p == "Admin" || p == "Operator")) 2. نمایش منوی غیرفعال برای کاربران غیرمجاز: - به جای حذف منو برای کاربران غیرمجاز، می‌توان منوی غیرفعال نمایش داد: html <li class="nav-item has-treeview disabled"> <a href="#" class="nav-link"> <i class="fa fa-tag"></i> <p>دسته بندی ها</p> </a> </li> 3. پیاده‌سازی سیاست‌های دسترسی پیشرفته: - می‌توانید از سیستم
Policy-Based Authorization
در ASP.NET Core برای مدیریت دقیق‌تر دسترسی‌ها استفاده کنید. --- جمع‌بندی این کد به خوبی نمایش منوی "دسته‌بندی‌ها" را بر اساس نقش‌های کاربری مدیریت می‌کند. طراحی ساده و استفاده از کلاس‌های CSS و Bootstrap باعث بهبود خوانایی و کارایی شده است. با بهبودهای پیشنهادی، می‌توانید این کد را مؤثرتر و منعطف‌تر کنید.
پروژه ASP.Net Core MVC (وب و سی شارپ)
درس آخر فروشگاه مدیریت سفارش فروشگاه و مدیریت پرداخت ها و Authorization و Authentication در ادمین
این کد مربوط به پیکربندی احراز هویت (Authentication) و مجوزها (Authorization) در پروژه ASP.NET Core است. این تنظیمات در فایل `Program.cs`استفاده می‌شوند تا مکانیزم امنیتی برای مدیریت کاربران و دسترسی‌ها فعال شود. بیایید هر بخش از کد را بررسی کنیم: --- ### ۱. تنظیم مجوزها (Authorization) #### بخش `AddAuthorization`: csharp builder.Services.AddAuthorization(options => { options.AddPolicy(UserRoles.Admin, policy => policy.RequireRole(UserRoles.Admin)); options.AddPolicy(UserRoles.Customer, policy => policy.RequireRole(UserRoles.Customer)); options.AddPolicy(UserRoles.Operator, policy => policy.RequireRole(UserRoles.Operator)); }); #### عملکرد: - افزودن سیاست‌های دسترسی: - در این بخش، سه سیاست دسترسی بر اساس نقش‌های
Admin`، `Customer
و
Operator
تعریف شده‌اند. - `AddPolicy`: برای تعریف سیاست‌های دسترسی استفاده می‌شود. - `RequireRole`: مشخص می‌کند که کاربر باید دارای نقش خاصی باشد تا بتواند از این سیاست استفاده کند. #### مثال: - اگر بخواهید دسترسی به یک اکشن را محدود به کاربران با نقش
Admin
کنید، از سیاست تعریف‌شده استفاده می‌کنید: csharp [Authorize(Policy = UserRoles.Admin)] public IActionResult AdminOnly() { return View(); } #### کاربرد سیاست‌ها: - سیاست‌ها به صورت انعطاف‌پذیر به اکشن‌ها یا کنترلرها اعمال می‌شوند. - می‌توانید سیاست‌های پیچیده‌تر تعریف کنید (مثلاً بررسی شرایط مختلف). --- ### ۲. تنظیم احراز هویت (Authentication) #### بخش `AddAuthentication`: csharp builder.Services.AddAuthentication(options => { options.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme; options.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme; options.DefaultChallengeScheme = CookieAuthenticationDefaults.AuthenticationScheme; }); #### عملکرد: - افزودن سیستم احراز هویت: - این بخش مکانیزم احراز هویت را فعال می‌کند. - `DefaultSignInScheme`: مشخص می‌کند که از کوکی‌ها برای ورود کاربر استفاده شود. - `DefaultAuthenticateScheme`: تنظیمات مربوط به احراز هویت را مشخص می‌کند. - `DefaultChallengeScheme`: مشخص می‌کند که هنگام درخواست ورود، از کدام سیستم استفاده شود. --- ### ۳. تنظیمات کوکی‌ها #### بخش `AddCookie`: csharp .AddCookie(options => { options.LoginPath = new PathString("/Authentication/Signin"); options.ExpireTimeSpan = TimeSpan.FromMinutes(5.0); options.AccessDeniedPath = new PathString("/Authentication/Signin"); }); #### عملکرد: - پیکربندی سیستم کوکی‌ها: - `LoginPath`: مسیر نمایش صفحه ورود کاربر. اگر کاربر احراز هویت نشده باشد و به مسیری که نیاز به ورود دارد دسترسی پیدا کند، به این مسیر هدایت می‌شود. - مثال:
/Authentication/Signin
. - `ExpireTimeSpan`: مدت زمان انقضای کوکی‌ها. در اینجا کوکی پس از 5 دقیقه منقضی می‌شود. - `AccessDeniedPath`: مسیر نمایش صفحه دسترسی غیرمجاز. اگر کاربر احراز هویت شده اما دسترسی به مسیر خاصی ندارد، به این مسیر هدایت می‌شود. --- ### ۴. فرآیند کلی کار 1. تعریف نقش‌ها و سیاست‌ها: - در بخش `AddAuthorization`، سیاست‌های مبتنی بر نقش‌ها تعریف می‌شوند. - این سیاست‌ها در کنترلرها و اکشن‌ها برای محدود کردن دسترسی استفاده می‌شوند. 2. احراز هویت و کوکی‌ها: - سیستم احراز هویت بر اساس کوکی‌ها پیکربندی شده است. - مسیر ورود و دسترسی غیرمجاز مشخص شده‌اند. --- ### ۵. نکات بهبود و بهترین روش‌ها 1. مدت زمان انقضای کوکی: - اگر سیستم برای استفاده طولانی‌مدت طراحی شده است، مدت زمان انقضای کوکی‌ها را افزایش دهید. - یا قابلیت
Remember Me
اضافه کنید. 2. اضافه کردن صفحه دسترسی غیرمجاز: - صفحه‌ای مخصوص برای نمایش پیام "دسترسی غیرمجاز" ایجاد کنید و در
AccessDeniedPath
استفاده کنید: csharp options.AccessDeniedPath = new PathString("/Authentication/AccessDenied"); 3. مدیریت نقش‌ها در دیتابیس: - تعریف نقش‌ها در کد (Hardcoded) ممکن است محدود باشد. به جای آن، نقش‌ها را در پایگاه داده مدیریت کنید و از سیستم
RoleManager
استفاده کنید. --- ### جمع‌بندی این کد تنظیمات اساسی برای مدیریت احراز هویت و دسترسی‌ها در یک پروژه ASP.NET Core فراهم می‌کند. از کوکی‌ها برای مدیریت وضعیت ورود کاربران استفاده می‌شود و سیاست‌های مبتنی بر نقش‌ها برای کنترل دسترسی تعریف شده‌اند. این رویکرد ساده و مؤثر است و می‌تواند به راحتی گسترش یابد.
سلام به همه دوستان من آموزش ها را در سایت باگتو دنبال کردم و پروژه من با دات نت 8 نوشتم و در کانالم به اشتراک گذاشتم شما برای یاد گیری اگر نیاز به آموزش ویدئو داشتید وارد سایت باگتو شوید و ویدئو های رایگان را دانلود کنید و آموزش ها را طبق پروژه من دنبال کند به خطا نخورید https://bugeto.net/courses/free-introductory-asp-dot-net-core-training-course