پروژه ASP.Net Core MVC (وب و سی شارپ)
درس آخر فروشگاه مدیریت سفارش فروشگاه و مدیریت پرداخت ها و Authorization و Authentication در ادمین
این کد مربوط به کنترلر
RequestPayControllerدر ناحیه مدیریت (Admin Area) است و برای مدیریت درخواستهای پرداخت کاربران طراحی شده است. این کنترلر اطلاعات درخواستهای پرداخت را از سرویس دریافت کرده و آنها را به View ارسال میکند. در ادامه توضیح کامل هر بخش از کد ارائه شده است: --- ۱. ویژگیهای کلیدی کنترلر
RequestPayController[Area("Admin")]: csharp [Area("Admin")] - این ویژگی مشخص میکند که این کنترلر متعلق به ناحیه
Adminاست. - مسیر دسترسی به این کنترلر چیزی شبیه به
/Admin/RequestPay/Indexخواهد بود. --- ۲. تزریق وابستگی (Dependency Injection) سازنده کنترلر: csharp private readonly IGetRequestPayForAdminService _getRequestPayForAdminService; public RequestPayController(IGetRequestPayForAdminService getRequestPayForAdminService) { _getRequestPayForAdminService = getRequestPayForAdminService; } توضیحات: 1. تزریق سرویس: - وابستگی به سرویس
IGetRequestPayForAdminServiceاز طریق سازنده کنترلر تزریق میشود. - این سرویس وظیفه بازیابی درخواستهای پرداخت از پایگاه داده را بر عهده دارد. 2. مزایای تزریق وابستگی: - کد قابل تستتر و انعطافپذیرتر میشود. - امکان جایگزینی سرویسها با Mock یا پیادهسازیهای دیگر برای تست فراهم میشود. --- ۳. متد
Indexcsharp public IActionResult Index() { return View(_getRequestPayForAdminService.Execute().Data); } شرح عملکرد: 1. فراخوانی سرویس: - متد
Executeاز سرویس
IGetRequestPayForAdminServiceفراخوانی میشود تا لیست درخواستهای پرداخت بازیابی شود. 2. ارسال دادهها به View: - دادههای بازیابی شده از سرویس به View ارسال میشوند. -
Dataشامل لیستی از
RequestPayDtoاست که حاوی اطلاعات پرداختها میباشد. 3. خروجی: - خروجی این متد یک View است که دادههای دریافتشده را نمایش میدهد. --- ۴. تعامل با سرویس سرویسی که در این کنترلر استفاده شده است (
IGetRequestPayForAdminService) وظیفه دارد دادههای درخواستهای پرداخت را از پایگاه داده بازیابی کند. این سرویس قبلاً توضیح داده شده و شامل ویژگیهایی مانند: - بازیابی اطلاعات کاربر مرتبط با پرداخت. - فیلدهای مهمی مانند مقدار پرداخت، وضعیت پرداخت، شناسه پرداخت و تاریخ پرداخت. --- ۵. موارد قابل بهبود 1. اضافه کردن مدیریت خطا: اگر سرویس دادهای را بازنگرداند یا به دلایلی اجرای آن موفق نباشد، باید خطا مدیریت شود: csharp public IActionResult Index() { var result = _getRequestPayForAdminService.Execute(); if (!result.IsSuccess || result.Data == null) { // نمایش صفحه خطا return View("Error", "در دریافت اطلاعات مشکلی پیش آمده است."); } return View(result.Data); } 2. افزودن صفحهبندی (Paging): - اگر تعداد درخواستهای پرداخت زیاد باشد، میتوانید قابلیت صفحهبندی اضافه کنید تا فقط تعداد مشخصی از دادهها در هر صفحه نمایش داده شوند. 3. فیلترهای پیشرفته: - اضافه کردن امکان جستجو یا فیلتر بر اساس تاریخ پرداخت، وضعیت پرداخت (
IsPay) یا کاربر. 4. نمایش پیام موفقیت یا خطا در عملیات: - اگر قرار است عملیات خاصی (مثل تأیید یا لغو پرداختها) اضافه شود، میتوانید از
TempDataبرای نمایش پیامهای موفقیت یا خطا استفاده کنید. --- جمعبندی کنترلر
RequestPayControllerیک کنترلر ساده و خواناست که درخواستهای پرداخت را از سرویس دریافت کرده و آنها را به View ارسال میکند. ساختار کنونی برای نمایش لیست درخواستها مناسب است، اما میتوان قابلیتهایی مثل مدیریت خطا، صفحهبندی و فیلتر پیشرفته را برای بهبود تجربه کاربری و عملکرد اضافه کرد.
پروژه ASP.Net Core MVC (وب و سی شارپ)
درس آخر فروشگاه مدیریت سفارش فروشگاه و مدیریت پرداخت ها و Authorization و Authentication در ادمین
این کد مربوط به View نمایش لیست فاکتورهای درخواستهای پرداخت در بخش مدیریت فروشگاه است و دادهها را از کنترلر
RequestPayControllerدریافت میکند. این View دادههای مالی کاربران، وضعیت پرداخت و اطلاعات مربوط به فاکتورها را به صورت جدول ارائه میدهد. بیایید بخشهای مختلف آن را بررسی کنیم: --- ۱. تنظیمات اولیه View استفاده از @using و @model: csharp @using Test_Store.Application.Services.Fainances.Queries.GetRequestPayForAdmin; @model List<RequestPayDto> - @using: فضای نام مربوط به سرویسها و DTOهای درخواست پرداخت وارد شده است. - @model: مدل دادهای که توسط کنترلر ارسال شده (
List<RequestPayDto) در این View استفاده میشود. این مدل لیستی از فاکتورها و جزئیات پرداخت را ارائه میدهد. تنظیمات عنوان و قالببندی: csharp @{ ViewData["Title"] = "Index"; Layout = "~/Areas/Admin/Views/Shared/_Adminlayout.cshtml"; } -
ViewData["Title"]: عنوان صفحه برای نمایش تنظیم شده است. -
Layout: قالب اصلی (
_Adminlayout.cshtml) برای طراحی ظاهر کلی View استفاده میشود. --- ### ۲. بخش جستجو html <form method="get" class="col-xl-4 col-lg-6 col-md-12 mb-1"> <fieldset class="form-group"> <input type="text" class="form-control" name="serchkey"> <button class="btn btn-success">جستجو</button> </fieldset> </form> #### عملکرد: - این فرم به مدیر اجازه میدهد بر اساس یک کلید جستجو (مانند شماره فاکتور یا نام کاربر) فاکتورها را فیلتر کند. - روش ارسال: از
method="get"استفاده شده است، که دادهها در URL ارسال میشوند و قابلیت اشتراکگذاری لینک فراهم میشود. --- ### ۳. نمایش جدول فاکتورها html <table class="table table-striped table-bordered zero-configuration dataTable" id="DataTables_Table_0" role="grid" aria-describedby="DataTables_Table_0_info"> <thead> <tr role="row"> <th>شماره فاکتور</th> <th>مبلغ</th> <th>کاربر</th> <th>پرداخت شده؟</th> <th>تاریخ پرداخت</th> <th>RefId</th> <th>Authority</th> <th></th> </tr> </thead> <tbody> @foreach (var item in Model) { <tr role="row" class="odd"> <td>@item.Id</td> <td>@item.Amount.ToString("n0")</td> <td>@item.UserName</td> <td>@item.IsPay</td> <td>@item.PayDate</td> <td>@item.RefId</td> <td>@item.Authority</td> <td> </td> </tr> } </tbody> </table> #### شرح بخشها: 1. سربرگ جدول (
thead): - ستونهای اصلی شامل: - شماره فاکتور - مبلغ پرداختی - نام کاربر - وضعیت پرداخت (پرداخت شده/نشده) - تاریخ پرداخت - شناسه مرجع تراکنش (
RefId) - کد مرجع (
Authority) 2. دادههای جدول (
tbody): - دادههای هر فاکتور با استفاده از حلقه
foreachاز مدل
RequestPayDtoبارگذاری میشوند. - مقادیر مهم فاکتورها مانند مبلغ و تاریخ پرداخت نمایش داده میشوند. 3. قالببندی مبلغ: - از
ToString("n0") برای نمایش مبلغ به صورت قالب عددی (مثلاً 1,000,000) استفاده شده است.
4. وضعیت پرداخت (IsPay): - وضعیت پرداخت به صورت مقدار
trueیا
falseنمایش داده میشود. 5. دکمههای عملیاتی (فیلد
tdخالی): - هنوز هیچ دکمه عملیاتی مانند "مشاهده جزئیات" یا "ویرایش فاکتور" اضافه نشده است. --- ### ۴. بخش صفحهبندی html <div class="dataTables_paginate paging_simple_numbers" id="DataTables_Table_0_paginate"> <ul class="pagination"> <li class="paginate_button page-item previous disabled"><a href="#" class="page-link">قبلی</a></li> <li class="paginate_button page-item active"><a href="#" class="page-link">1</a></li> <li class="paginate_button page-item"><a href="#" class="page-link">2</a></li> <li class="paginate_button page-item next"><a href="#" class="page-link">بعدی</a></li> </ul> </div> #### عملکرد: - قابلیت صفحهبندی جدول اضافه شده است. - از کلاسهای Bootstrap برای طراحی و زیبایی صفحهبندی استفاده شده است. ---
پروژه ASP.Net Core MVC (وب و سی شارپ)
درس آخر فروشگاه مدیریت سفارش فروشگاه و مدیریت پرداخت ها و Authorization و Authentication در ادمین
### ۵. نقاط قوت کد
1. قابلیت جستجو و فیلتر کردن: مدیر میتواند فاکتورهای مورد نظر را بر اساس کلید جستجو پیدا کند.
2. طراحی خوانا و مرتب: جدول با استفاده از کلاسهای CSS و Bootstrap طراحی شده است.
3. قابلیت صفحهبندی: برای مدیریت تعداد زیاد فاکتورها بسیار کاربردی است.
---
### ۶. پیشنهادات بهبود
1. افزودن دکمههای عملیاتی:
- میتوانید گزینههایی مانند "مشاهده جزئیات" یا "ویرایش فاکتور" در ستون آخر اضافه کنید.
html
<td>
<a href="/Admin/RequestPay/Details/@item.Id" class="btn btn-info btn-sm">مشاهده جزئیات</a>
<a href="/Admin/RequestPay/Edit/@item.Id" class="btn btn-warning btn-sm">ویرایش</a>
</td>
2. بهبود نمایش وضعیت پرداخت:
- به جای نمایش
trueیا `false`، از مقدار نمایشی مانند "پرداخت شده" یا "پرداخت نشده" استفاده کنید. 3. نمایش مقدار `PayDate` در قالب مناسب: - تاریخ پرداخت را به فرمت قابل خواندن نمایش دهید: csharp <td>@item.PayDate?.ToString("yyyy/MM/dd")</td> 4. مدیریت خطاها: - بررسی کنید که آیا مدل داده خالی (
null) است یا نه، سپس پیام مناسب نمایش دهید. --- ### جمعبندی این View به خوبی طراحی شده و قابلیت نمایش لیست فاکتورها، جستجو و صفحهبندی را فراهم میکند. با افزودن پیشنهادات بهبود، میتوانید تجربه کاربری و قابلیتهای این صفحه را افزایش دهید.
پروژه ASP.Net Core MVC (وب و سی شارپ)
درس آخر فروشگاه مدیریت سفارش فروشگاه و مدیریت پرداخت ها و Authorization و Authentication در ادمین
این کد مربوط به سرویس ایجاد سفارش جدید در سیستم فروشگاه آنلاین است. این سرویس از اطلاعات سبد خرید کاربر (Cart) و درخواست پرداخت (RequestPay) برای ایجاد سفارش (Order) استفاده میکند. در ادامه توضیح بخشهای مختلف کد ارائه شده است:
---
### ۱. اینترفیس `IAddNewOrderService`
csharp
public interface IAddNewOrderService
{
ResultDto Execute(RequestAddNewOrderSericeDto request);
}
- هدف: تعریف متدی برای ایجاد سفارش جدید.
- متد `Execute`:
- ورودی: یک شیء از نوع
RequestAddNewOrderSericeDtoکه شامل اطلاعات مورد نیاز برای ایجاد سفارش است (مانند شناسه سبد خرید، شناسه درخواست پرداخت، شناسه کاربر و...). - خروجی: یک شیء
ResultDtoکه نشاندهنده وضعیت موفقیت یا شکست عملیات و یک پیام است. --- ### ۲. کلاس `AddNewOrderService` این کلاس پیادهسازی اینترفیس
IAddNewOrderServiceاست و منطق اصلی برای ایجاد سفارش را مدیریت میکند. #### سازنده (`Constructor`): csharp public AddNewOrderService(IDataBaseContext context) { _context = context; } - تزریق وابستگی: کلاس از طریق
IDataBaseContextبه پایگاه داده متصل میشود تا به جدولهای مورد نیاز (مانند کاربران، درخواستهای پرداخت و سبد خرید) دسترسی داشته باشد. #### متد `Execute`: csharp public ResultDto Execute(RequestAddNewOrderSericeDto request) این متد شامل مراحل زیر است: --- ### ۳. مراحل ایجاد سفارش جدید #### (۱) بازیابی اطلاعات مرتبط از پایگاه داده csharp var user = _context.Users.Find(request.UserId); var requestPay = _context.RequestPays.Find(request.RequestPayId); var cart = _context.Carts.Include(p => p.CartItems) .ThenInclude(p => p.Product) .Where(p => p.Id == request.CartId).FirstOrDefault(); - اطلاعات کاربر از جدول
Usersبازیابی میشود. - اطلاعات درخواست پرداخت از جدول
RequestPaysدریافت میشود. - سبد خرید کاربر به همراه آیتمها (
CartItems) و اطلاعات محصولات آن (
Product) بازیابی میشود. --- #### (۲) بهروزرسانی وضعیت پرداخت csharp requestPay.IsPay = true; requestPay.PayDate = DateTime.Now; requestPay.RefId = request.RefId; requestPay.Authority = requestPay.Authority; - وضعیت پرداخت (
IsPay) به
trueتغییر میکند. - تاریخ پرداخت (
PayDate) با تاریخ جاری تنظیم میشود. - شناسه مرجع (
RefId) و کد مرجع (
Authority) بهروزرسانی میشوند. --- #### (۳) تکمیل وضعیت سبد خرید csharp cart.Finished = true; - وضعیت سبد خرید به
Finishedتغییر میکند تا نشان دهد این سبد خرید تکمیل شده و به سفارش تبدیل شده است. --- #### (۴) ایجاد سفارش csharp Order order = new Order() { Address = "", OrderState = OrderState.Processing, RequestPay = requestPay, User = user, }; _context.Orders.Add(order); - یک شیء جدید از نوع
Orderایجاد میشود که شامل اطلاعات کاربر، وضعیت پرداخت و وضعیت سفارش (
OrderState) است. - وضعیت سفارش به صورت پیشفرض
Processing(در حال پردازش) تنظیم میشود. - سفارش به جدول
Ordersاضافه میشود. --- #### (۵) ایجاد جزئیات سفارش (OrderDetails) csharp List<OrderDetail> orderDetails = new List<OrderDetail>(); foreach (var item in cart.CartItems) { OrderDetail orderDetail = new OrderDetail() { Count = item.Count, Order = order, Price = item.Product.Price, Product = item.Product, }; orderDetails.Add(orderDetail); } _context.OrderDetails.AddRange(orderDetails); - برای هر آیتم موجود در سبد خرید، یک شیء از نوع
OrderDetailایجاد میشود که شامل: - تعداد محصول (
Count). - قیمت محصول (
Price). - ارتباط با سفارش (
Order) و محصول (
Product). - جزئیات سفارش به جدول
OrderDetailsاضافه میشوند. --- #### (۶) ذخیره تغییرات در پایگاه داده csharp _context.SaveChanges(); - تمامی تغییرات (ایجاد سفارش، جزئیات سفارش، بهروزرسانی پرداخت و سبد خرید) ذخیره میشوند. --- ### ۴. مدل `RequestAddNewOrderSericeDto` csharp public class RequestAddNewOrderSericeDto { public long CartId { get; set; } public long RequestPayId { get; set; } public long UserId { get; set; } public string Authority { get; set; } public long RefId { get; set; } = 0; } - این مدل دادههای ورودی مورد نیاز برای ایجاد سفارش را شامل میشود: - `CartId`: شناسه سبد خرید. - `RequestPayId`: شناسه درخواست پرداخت. - `UserId`: شناسه کاربر. - `Authority`: کد مرجع پرداخت. - `RefId`: شناسه مرجع پرداخت. ---
پروژه ASP.Net Core MVC (وب و سی شارپ)
درس آخر فروشگاه مدیریت سفارش فروشگاه و مدیریت پرداخت ها و Authorization و Authentication در ادمین
### ۵. خروجی `ResultDto`
csharp
return new ResultDto()
{
IsSuccess = true,
Message = "",
};
- خروجی سرویس نشاندهنده موفقیت عملیات و یک پیام توضیحی (در اینجا خالی) است.
---
### ۶. نقاط قوت کد
1. طراحی ماژولار: تمامی مراحل به صورت گام به گام و قابل فهم طراحی شدهاند.
2. مدیریت ارتباطات: استفاده از ارتباطات مستقیم بین سبد خرید، پرداخت و سفارشها.
3. انعطافپذیری: قابلیت استفاده مجدد از این سرویس در بخشهای مختلف سیستم.
---
### ۷. پیشنهادات بهبود
1. افزودن مدیریت خطا:
- بررسی کنید که آیا موجودیتهای بازیابی شده (
user,
cart,
requestPay) خالی (
null) هستند یا نه. csharp if (user == null || cart == null || requestPay == null) { return new ResultDto { IsSuccess = false, Message = "اطلاعات ناقص است." }; } 2. اعتبارسنجی دادههای ورودی: - بررسی کنید که شناسههای ورودی (
CartId,
RequestPayId,
UserId) مقادیر معتبر داشته باشند. 3. بهبود خوانایی: - جداسازی منطق به متدهای کوچکتر برای افزایش خوانایی و نگهداری کد. 4. ثبت لاگ عملیات: - برای ردیابی عملیات، ثبت لاگ در صورت موفقیت یا خطا مفید خواهد بود. --- ### جمعبندی این کد با طراحی مناسب، منطق مربوط به ایجاد سفارش جدید را پیادهسازی کرده است. با اعمال پیشنهادات بهبود، میتوانید قابلیت اطمینان، امنیت و خوانایی کد را افزایش دهید.
پروژه ASP.Net Core MVC (وب و سی شارپ)
درس آخر فروشگاه مدیریت سفارش فروشگاه و مدیریت پرداخت ها و Authorization و Authentication در ادمین
این کد مربوط به کنترلر
AuthenticationControllerاست که مدیریت ثبتنام، ورود و خروج کاربران را در یک فروشگاه آنلاین انجام میدهد. این کنترلر از ویژگیهای ASP.NET Core برای احراز هویت (Authentication) و مدیریت کاربران استفاده میکند. در ادامه توضیحات کامل درباره بخشهای مختلف این کد ارائه شده است: --- ### ۱. وابستگیها و تزریق سرویسها #### تزریق وابستگی: csharp private readonly IRegisterUserService _registerUserService; private readonly IUserLoginService _userLoginService; public AuthenticationController(IRegisterUserService registerUserService, IUserLoginService userLoginService) { _registerUserService = registerUserService; _userLoginService = userLoginService; } - دو سرویس زیر تزریق شدهاند: -
IRegisterUserService: برای مدیریت ثبتنام کاربران استفاده میشود. -
IUserLoginService: برای احراز هویت کاربران هنگام ورود استفاده میشود. - مزیت: استفاده از تزریق وابستگی کد را قابل تست و منعطف میکند. --- ### ۲. اکشن
Signup(ثبتنام کاربر) #### [HttpGet] Signup csharp [HttpGet] public IActionResult Signup() { return View(); } - یک اکشن ساده برای نمایش صفحه ثبتنام. - درخواست از نوع
GETاست و فقط View مربوط به ثبتنام را باز میگرداند. #### [HttpPost] Signup csharp [HttpPost] public IActionResult Signup(SignupViewModel request) - این اکشن وظیفه مدیریت ثبتنام کاربران را بر عهده دارد. - دادههای واردشده توسط کاربر در قالب
SignupViewModelدریافت میشوند. ##### مراحل ثبتنام: 1. اعتبارسنجی اولیه: - اطمینان از ارسال تمامی فیلدهای اجباری (
FullName,
Password,
RePassword). - بررسی برابر بودن رمز عبور و تکرار رمز عبور. - بررسی حداقل طول رمز عبور. - بررسی صحت فرمت ایمیل با استفاده از Regular Expression. 2. بررسی وضعیت ورود: - اگر کاربر از قبل وارد شده باشد، اجازه ثبتنام مجدد داده نمیشود. 3. فراخوانی سرویس ثبتنام: - دادهها به سرویس
RegisterUserServiceارسال میشوند: csharp var signeupResult = _registerUserService.Execute(new RequestRegisterUserDto { ... }); 4. ایجاد Claims برای کاربر: - پس از موفقیت ثبتنام، اطلاعات کاربر در قالب
Claimsایجاد میشود که برای مدیریت احراز هویت استفاده میشود. - نمونه Claims: csharp var claims = new List<Claim>() { new Claim(ClaimTypes.NameIdentifier, signeupResult.Data.UserId.ToString()), new Claim(ClaimTypes.Email, request.Email), new Claim(ClaimTypes.Name, request.FullName), new Claim(ClaimTypes.Role, "Customer"), }; 5. ذخیره احراز هویت: - اطلاعات Claims با استفاده از کوکیها (Cookies) در سیستم ذخیره میشوند: csharp var identity = new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme); HttpContext.SignInAsync(principal, properties); --- ### ۳. اکشن
Signin(ورود کاربر) #### [HttpGet] Signin csharp public IActionResult Signin(string ReturnUrl = "/") { ViewBag.url = ReturnUrl; return View(); } - نمایش فرم ورود. - پارامتر
ReturnUrlبرای نگهداری مسیر بازگشت کاربر پس از ورود استفاده میشود. #### [HttpPost] Signin csharp [HttpPost] public IActionResult Signin(string Email, string Password, string url = "/") - وظیفه احراز هویت کاربر با استفاده از ایمیل و رمز عبور. ##### مراحل ورود: 1. فراخوانی سرویس ورود: - اطلاعات ایمیل و رمز عبور برای اعتبارسنجی به سرویس
UserLoginServiceارسال میشوند: csharp var signupResult = _userLoginService.Execute(Email, Password); 2. ایجاد Claims برای کاربر: - اطلاعات کاربر شامل شناسه، ایمیل، و نقشها در قالب Claims ایجاد میشود: csharp foreach (var item in signupResult.Data.Roles) { claims.Add(new Claim(ClaimTypes.Role, item)); } 3. ذخیره اطلاعات ورود: - اطلاعات Claims با استفاده از کوکی ذخیره میشوند و زمان انقضای کوکی تنظیم میشود: csharp var properties = new AuthenticationProperties() { IsPersistent = true, ExpiresUtc = DateTime.Now.AddDays(5), }; ---
پروژه ASP.Net Core MVC (وب و سی شارپ)
درس آخر فروشگاه مدیریت سفارش فروشگاه و مدیریت پرداخت ها و Authorization و Authentication در ادمین
۴. اکشن
SignOut(خروج کاربر) خروج از حساب کاربری: csharp public IActionResult SignOut() { HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme); return RedirectToAction("Index", "Home"); } - کاربر را از سیستم خارج میکند. - تمامی کوکیهای مربوط به احراز هویت حذف میشوند. --- ### ۵. اعتبارسنجی و امنیت - اعتبارسنجی رمز عبور: - بررسی طول و مطابقت رمز عبور. - اعتبارسنجی ایمیل: - استفاده از Regex برای بررسی فرمت ایمیل. - جلوگیری از ثبتنام مکرر: - بررسی وضعیت ورود کاربر پیش از ثبتنام. --- ### ۶. نقاط قوت کد 1. جداسازی وظایف: ثبتنام، ورود و خروج هر کدام در اکشنهای جداگانه مدیریت میشوند. 2. استفاده از Claims: برای مدیریت نقشها و اطلاعات کاربری در سیستم احراز هویت استفاده میشود. 3. اعتبارسنجی اولیه: بررسی دادههای ورودی پیش از ارسال به سرویسها انجام شده است. --- ### ۷. پیشنهادات بهبود 1. اضافه کردن پیامهای مناسبتر: - پیامهای کاربرپسندتر در هنگام خطا (مثلاً فرمت ایمیل اشتباه). 2. پیادهسازی کلمات عبور قویتر: - بررسی شرایط پیچیدگی رمز عبور (مانند حداقل یک حرف بزرگ و یک عدد). 3. پشتیبانی از قابلیت Remember Me: - اضافه کردن گزینه برای ذخیره وضعیت ورود کاربر به مدت طولانیتر. --- ### جمعبندی این کنترلر عملکرد خوبی برای مدیریت عملیات احراز هویت (Authentication) کاربران ارائه میدهد. با استفاده از ابزارهای امنیتی مانند Claims و کوکیها، امنیت سیستم افزایش پیدا کرده است. همچنین، اعتبارسنجی دادهها در مراحل مختلف، کد را امنتر و مطمئنتر کرده است.
پروژه 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 فراهم میکند. از کوکیها برای مدیریت وضعیت ورود کاربران استفاده میشود و سیاستهای مبتنی بر نقشها برای کنترل دسترسی تعریف شدهاند. این رویکرد ساده و مؤثر است و میتواند به راحتی گسترش یابد.