کد app.UseAuthentication(); بخشی از پیکربندی پایپلاین درخواستهای HTTP در برنامه ASP.NET Core شما است.
توضیحات کد:
کاربرد اصلی:
این خط کد میانافزار (Middleware) احراز هویت را به پایپلاین درخواستهای HTTP اضافه میکند. این میانافزار مسئول مدیریت احراز هویت کاربران در درخواستهای ورودی به برنامه شما است.
نحوه عملکرد:
وقتی که درخواست به برنامه شما وارد میشود، این میانافزار بررسی میکند که آیا کاربر احراز هویت شده است یا خیر. اگر کاربر احراز هویت نشده باشد و به منابع محافظت شده دسترسی داشته باشد، به صفحه ورود یا هر مسیر تعیین شده دیگر هدایت میشود.
محل قرارگیری:
این خط کد باید قبل از app.UseAuthorization(); قرار گیرد. به این ترتیب، ابتدا احراز هویت کاربر انجام میشود و سپس مجوزهای دسترسی بررسی میشوند.
مثال:
در این مثال، app.UseAuthentication(); به عنوان بخشی از پیکربندی پایپلاین درخواستهای HTTP قرار دارد:
csharp
var app = builder.Build();
// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Home/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthentication(); // فعالسازی میانافزار احراز هویت
app.UseAuthorization(); // فعالسازی میانافزار مجوزها
app.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
app.Run();
نتیجهگیری:
این خط کد به برنامه شما کمک میکند تا کاربران را احراز هویت کند و اطمینان حاصل شود که تنها کاربران احراز هویت شده به منابع محافظت شده دسترسی دارند.
بیایید این بخش از کد را که مربوط به پیکربندی سرویسهای احراز هویت در ASP.NET Core است بررسی کنیم.
توضیحات کد:
افزودن سرویس احراز هویت:
csharp
builder.Services.AddAuthentication(options =>
{
options.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
options.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = CookieAuthenticationDefaults.AuthenticationScheme;
})
AddAuthentication:
این متد، احراز هویت را به کانتینر سرویسها اضافه میکند.
options.DefaultSignInScheme:
تعیین طرح پیشفرض برای ورود به سیستم (sign-in). در اینجا از کوکیها استفاده شده است.
options.DefaultAuthenticateScheme:
تعیین طرح پیشفرض برای احراز هویت.
options.DefaultChallengeScheme:
تعیین طرح پیشفرض برای چالشهای احراز هویت.
پیکربندی تنظیمات کوکی:
csharp
.AddCookie(options =>
{
options.LoginPath = new PathString("/");
options.ExpireTimeSpan = TimeSpan.FromMinutes(5.0);
});
AddCookie:
این متد پیکربندی احراز هویت با کوکی را به احراز هویت اضافه میکند.
options.LoginPath:
مسیر ورود به سیستم را تعیین میکند. در اینجا مسیر ریشه (/) تعیین شده است.
options.ExpireTimeSpan:
زمان انقضای کوکیها را تعیین میکند. در اینجا 5 دقیقه تنظیم شده است.
نتیجهگیری:
این کد احراز هویت با کوکی را در برنامه ASP.NET Core شما پیکربندی میکند. با تنظیم گزینههای مختلف مانند طرحهای پیشفرض برای ورود، احراز هویت و چالشهای احراز هویت، و همچنین پیکربندی تنظیمات کوکی مانند مسیر ورود و زمان انقضا، این کد به شما اطمینان میدهد که کاربران به درستی احراز هویت میشوند و دسترسی به منابع محافظت شده کنترل میشود.
پروژه ASP.Net Core MVC (وب و سی شارپ)
مدیریت دسته بندی ها
ادامه کدهای user قسمت سوم هست و این دفعه فقط Controller و Views اضافه شدند و تغیرات در AdminLayout و Layout اعمال شده است که کدها را توضیح می دهیم
بیایید این کدها را که در فایل AdminLayout استفاده شدهاند توضیح دهیم. این کدها مربوط به رندر کردن بخشهای اختیاری Scripts و Modals هستند.
توضیحات کد:
@RenderSection("Scripts", false):
این خط کد بخش Scripts را رندر میکند.
false به این معنی است که این بخش اختیاری است و اگر در صفحه ویو (View) تعریف نشده باشد، هیچ خطایی ایجاد نمیشود.
این بخش معمولاً برای درج فایلهای جاوا اسکریپت مورد استفاده قرار میگیرد که به صورت خاص برای یک صفحه نیاز هستند.
@RenderSection("Modals", false):
این خط کد بخش Modals را رندر میکند.
false به این معنی است که این بخش نیز اختیاری است و اگر در صفحه ویو تعریف نشده باشد، هیچ خطایی ایجاد نمیشود.
این بخش معمولاً برای درج مودالها (پنجرههای پاپ آپ) که به صورت خاص برای یک صفحه نیاز هستند استفاده میشود.
مثال کاربرد:
فرض کنید شما یک صفحه ویو دارید که نیاز به برخی فایلهای جاوا اسکریپت و یک مودال دارد. در این صفحه ویو میتوانید این بخشها را تعریف کنید:
csharp
@section Scripts
{
<script src="~/js/custom-script.js"></script>
}
@section Modals
{
<div class="modal" id="myModal">
<!-- Modal content -->
</div>
}
نتیجهگیری:
استفاده از @RenderSection("Scripts", false) و @RenderSection("Modals", false) به شما این امکان را میدهد که بخشهای اختیاری را به صفحات خود اضافه کنید. این کار باعث میشود که صفحات شما انعطافپذیرتر شوند و بتوانید به راحتی فایلهای جاوا اسکریپت و مودالهای مورد نیاز هر صفحه را مدیریت کنید.
EndPoint.Site => Areas => Admin => Views => Categories => Index.cshtml
بیایید کد صفحه نمایشی دستهبندیها را که در فایل ویو Index استفاده شده است بررسی کنیم.
توضیحات کد:
Imports و مدل:
csharp
@using Test_Store.Application.Services.Products.Queries.GetCategories
@model List<CategoriesDto>
@using
برای استفاده از فضای نام سرویسهای مورد نیاز برای دریافت دستهبندیها.
@model
برای تعریف مدل دادهای که به ویو ارسال میشود. در اینجا یک لیست از CategoriesDto.
ViewData و Layout:
csharp
@{
ViewData["Title"] = "Index";
Layout = "~/Areas/Admin/Views/Shared/_AdminLayout.cshtml";
}
ViewData["Title"]:
عنوان صفحه را به "Index" تنظیم میکند.
Layout:
از Layout مشخص شده برای این صفحه استفاده میکند.
ساختار HTML:
بخشهای مختلف صفحه شامل هدر، بدنه، و جدول برای نمایش دستهبندیها.
بخش اصلی نمایش جدول دستهبندیها:
html
<section id="configuration">
<div class="row">
<div class="col-12">
<div class="card">
<div class="card-header">
<div class="card-title-wrap bar-success">
<h4 class="card-title">لیست دسته بندی ها</h4>
</div>
</div>
<div class="card-body collapse show">
<div class="card-block card-dashboard">
<p class="card-text">دسته بندی محصولات فروشگاه </p>
<a href="~/admin/categories/addnewcategory" class="btn btn-success">افزودن دسته بندی جدید</a>
<div id="DataTables_Table_0_wrapper" class="dataTables_wrapper container-fluid dt-bootstrap4">
<div class="col-sm-12">
<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 class="sorting_asc" tabindex="0" aria-controls="DataTables_Table_0" rowspan="1" colspan="1" aria-sort="ascending" aria-label="دسته بندی: activate to sort column descending" style="width: 222px;">دسته بندی</th>
<th class="sorting_asc" tabindex="0" aria-controls="DataTables_Table_0" rowspan="1" colspan="1" aria-sort="ascending" aria-label="پدر: activate to sort column descending" style="width: 222px;">پدر</th>
<th class="sorting_asc" tabindex="0" aria-controls="DataTables_Table_0" rowspan="1" colspan="1" aria-sort="ascending" aria-label=": activate to sort column descending" style="width: 222px;"></th>
</tr>
</thead>
<tbody>
@foreach (var item in Model)
{
<tr role="row" class="odd">
<td class="sorting_1">@item.Name</td>
<td>
@{
string parent = item.Parent != null ? item.Parent.name : "-";
}
<text> @parent </text>
</td>
<td>
@if (item.Parent == null)
{
<a href="~/admin/categories/addnewcategory?ParentId=@item.Id" class="btn btn-success">افزودن فرزند</a>
}
@if (item.HasChild == true)
{
<a href="~/admin/categories/index?ParentId=@item.Id" class="btn btn-info">مشاهده لیست فرزند ها </a>
}
</td>
</tr>
}
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</section>
جدول نمایش دستهبندیها:
ستونهای دسته بندی، پدر و گزینههای مدیریت دستهبندیها (افزودن فرزند، مشاهده لیست فرزندان).
از foreach برای پیمایش مدل (لیست دستهبندیها) و نمایش اطلاعات هر دستهبندی استفاده شده است.
نتیجهگیری:
این کد به شما امکان میدهد تا لیست دستهبندیهای محصولات را به صورت جدولی نمایش دهید. هر ردیف شامل نام دستهبندی، پدر (در صورت وجود) و دکمههای افزودن فرزند و مشاهده لیست فرزندان است. از foreach برای پیمایش لیست دستهبندیها استفاده میشود و اطلاعات در جدول به صورت پویا نمایش داده میشود.
EndPoint.Site => Areas => Admin => Views => Categories => AddNewCategory.cshtml
بیایید کد صفحهی AddNewCategory را که برای اضافه کردن دستهبندی جدید به محصولات استفاده میشود بررسی کنیم.
توضیحات کد:
ViewData و Layout:
csharp
@{
ViewData["Title"] = "AddNewCategory";
Layout = "~/Areas/Admin/Views/Shared/_AdminLayout.cshtml";
}
ViewData["Title"]: عنوان صفحه را به "AddNewCategory" تنظیم میکند.
Layout: از Layout مشخص شده برای این صفحه استفاده میکند.
ساختار اصلی HTML:
استفاده از تگ section برای تعریف بخش اصلی صفحه.
در اینجا از کلاسهای Bootstrap برای تنظیمات واکنشگرا استفاده شده است.
بخش اصلی فرم اضافه کردن دستهبندی:
html
<section class="basic-elements">
<div class="row">
<div class="col-md-12">
<div class="card">
<div class="card-header">
<div class="card-title-wrap bar-success">
<h4 class="card-title mb-0">اضافه کردن دسته بندی جدید برای محصولات</h4>
</div>
</div>
<div class="card-body">
<div class="px-3">
<div class="form">
<div class="form-body">
<div class="row">
<div class="col-xl-4 col-lg-6 col-md-12 mb-1">
<fieldset class="form-group">
<input type="hidden" id="parentId" value="@ViewBag.parentId" />
<label for="basicInput">نام دسته بندی</label>
<input type="text" class="form-control" id="Name">
</fieldset>
</div>
<div class="col-xl-12 col-lg-12 col-md-12 mb-1">
<fieldset class="form-group">
<br />
<a onclick="AddNewCategory()" class="btn btn-success col-md-12">اضافه کردن به لیست</a>
</fieldset>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</section>
فرم اصلی شامل یک فیلد ورودی برای نام دستهبندی و یک دکمه برای اضافه کردن دستهبندی است.
از ViewBag.parentId برای تنظیم مقدار parentId استفاده میشود.
بخش اسکریپت:
csharp
@section Scripts
{
<link href="~/Sweetalert2/sweetalert2.min.css" rel="stylesheet" />
<script src="~/Sweetalert2/sweetalert2.min.js"></script>
<script>
function AddNewCategory() {
swal.fire({
title: 'دسته بندی جدید',
text: "آیا میخواهید دسته بندی جدید به لیست دسته بندی ها اضافه شود؟",
icon: 'info',
showCancelButton: true,
confirmButtonColor: '#3085d6',
cancelButtonColor: '#d33',
confirmButtonText: 'بله، اضافه شود',
cancelButtonText: 'خیر'
}).then((result) => {
if (result.value) {
var Name = $("#Name").val();
var parentId = $("#parentId").val();
var postData = {
'Name': Name,
'parentId': parentId,
};
$.ajax({
contentType: 'application/x-www-form-urlencoded',
dataType: 'json',
type: "POST",
url: "AddNewCategory",
data: postData,
success: function (data) {
if (data.isSuccess == true) {
swal.fire(
'موفق!',
data.message,
'success'
).then(function (isConfirm) {
location.reload();
});
} else {
swal.fire(
'هشدار!',
data.message,
'warning'
);
}
},
error: function (request, status, error) {
swal.fire(
'هشدار!',
request.responseText,
'warning'
);
}
});
}
})
}
</script>
}
استفاده از SweetAlert2 برای نمایش پیامهای تایید و هشدار.
تابع AddNewCategory برای ارسال درخواست AJAX به سرور و اضافه کردن دستهبندی جدید.
بررسی صحت ورود اطلاعات و نمایش پیامهای مناسب بر اساس پاسخ سرور.
نتیجهگیری:
این کد به شما امکان میدهد تا یک صفحهی کاربرپسند برای اضافه کردن دستهبندی جدید به محصولات خود ایجاد کنید. از SweetAlert2 برای نمایش پیامهای تایید و هشدار استفاده میشود و درخواستهای AJAX برای ارسال دادهها به سرور استفاده میشوند.
EndPoint.Site => Areas => Admin => Controllers CategoriesController.cs
بیایید کد CategoriesController را بررسی کنیم. این کنترلر برای مدیریت عملیاتهای مربوط به دستهبندیها در قسمت مدیرت (Admin) استفاده میشود.
توضیحات کد:
Namespace و Imports:
csharp
using Microsoft.AspNetCore.Mvc;
using Test_Store.Application.Interfaces.FacadPatterns;
namespace EndPoint.Site.Areas.Admin.Controllers:
نامفضا برای سازماندهی کدهای مرتبط با کنترلرهای قسمت مدیریت.
using ها
برای ایمپورت کردن کلاسها و اینترفیسهای مورد نیاز.
تعریف کنترلر:
csharp
[Area("Admin")]
public class CategoriesController : Controller
{
private readonly IProductFacad _productFacad;
public CategoriesController(IProductFacad productFacad)
{
_productFacad = productFacad;
}
}
[Area("Admin")]:
مشخص میکند که این کنترلر متعلق به ناحیه (Area) "Admin" است.
private readonly IProductFacad _productFacad;:
تعریف یک فیلد خصوصی برای فاساد محصولات.
سازنده کنترلر که وابستگی به IProductFacad را از طریق تزریق وابستگی دریافت میکند.
متد Index:
csharp
public IActionResult Index(long? parentId)
{
return View(_productFacad.GetCategoriesService.Execute(parentId).Data);
}
این متد دادههای دستهبندیها را از سرویس GetCategoriesService میگیرد و به ویو ارسال میکند.
parentId
به عنوان پارامتر ورودی برای فیلتر کردن دستهبندیها استفاده میشود.
متد AddNewCategory (HttpGet):
csharp
[HttpGet]
public IActionResult AddNewCategory(long? parentId)
{
ViewBag.parentId = parentId;
return View();
}
این متد ویو AddNewCategory را نمایش میدهد و parentId را به ViewBag اختصاص میدهد تا در ویو استفاده شود.
متد AddNewCategory (HttpPost):
csharp
[HttpPost]
public IActionResult AddNewCategory(long? ParentId, string Name)
{
var result = _productFacad.AddNewCategoryService.Execute(ParentId, Name);
return Json(result);
}
این متد دادههای ارسال شده توسط کاربر را دریافت میکند و به سرویس AddNewCategoryService ارسال میکند.
سپس نتیجه را به صورت JSON بازمیگرداند.
نتیجهگیری:
این کنترلر CategoriesController به شما امکان میدهد تا عملیاتهای مربوط به مدیریت دستهبندیها را انجام دهید. شامل متدهای Index برای نمایش لیست دستهبندیها، AddNewCategory برای نمایش فرم اضافه کردن دستهبندی جدید (با متد GET) و پردازش فرم اضافه کردن دستهبندی جدید (با متد POST) است.
Test_Store 8.zip
حجم:
53.6M
افزودن محصولات جدید و لیست محصولات با جزئیات
بیایید کد IDataBaseContext را بررسی کنیم. این اینترفیس به منظور تعریف قراردادهای مورد نیاز برای ارتباط با دیتابیس در لایهی دادهای (Data Layer) استفاده میشود.
توضیحات کد:
تعریف اینترفیس:
csharp
public interface IDataBaseContext
{
// ...
}
این کد یک اینترفیس به نام IDataBaseContext تعریف میکند که شامل قراردادهای مورد نیاز برای کار با دیتابیس است.
DbSet ویژگیها:
این بخش شامل تعریف جداول مختلف دیتابیس به صورت DbSet است که نمایشی از جداول در دیتابیس را ارائه میدهد.
DbSet<T> کلاسهایی هستند که از طرف Entity Framework برای کار با جداول دیتابیس استفاده میشوند.
csharp
DbSet<User> Users { get; set; }
DbSet<Role> Roles { get; set; }
DbSet<UserInRole> UserInRoles { get; set; }
DbSet<Category> Categories { get; set; }
DbSet<Product> Products { get; set; }
DbSet<ProductImages> ProductImages { get; set; }
DbSet<ProductFeatures> ProductFeatures { get; set; }
هر یک از این DbSet ها به ترتیب برای کار با جداول User, Role, UserInRole, Category, Product, ProductImages, و ProductFeatures استفاده میشوند.
متدهای SaveChanges:
این بخش شامل تعریف متدهای مختلف برای ذخیره تغییرات در دیتابیس است.
csharp
int SaveChanges(bool acceptAllChangesOnSuccess);
int SaveChanges();
Task<int> SaveChangesAsync(bool acceptAllChangesOnSuccess, CancellationToken cancellationToken = new CancellationToken());
Task<int> SaveChangesAsync(CancellationToken cancellationToken = new CancellationToken());
int SaveChanges(bool acceptAllChangesOnSuccess):
این متد تغییرات را در دیتابیس ذخیره میکند و پارامتر acceptAllChangesOnSuccess
تعیین میکند که آیا همه تغییرات در صورت موفقیت ذخیره شوند یا خیر.
int SaveChanges():
این متد تغییرات را در دیتابیس ذخیره میکند.
Task<int> SaveChangesAsync(bool acceptAllChangesOnSuccess, CancellationToken cancellationToken = new CancellationToken()):
این متد به صورت غیر همزمان (asynchronous) تغییرات را در دیتابیس ذخیره میکند.
Task<int> SaveChangesAsync(CancellationToken cancellationToken = new CancellationToken()):
این متد به صورت غیر همزمان تغییرات را در دیتابیس ذخیره میکند.
نتیجهگیری:
این اینترفیس IDataBaseContext به شما امکان میدهد تا جداول مختلف دیتابیس را تعریف کنید و متدهای مختلف برای ذخیره تغییرات در دیتابیس را ارائه میدهد. این طراحی کمک میکند تا ارتباط با دیتابیس به صورت انعطافپذیر و قابل تست باشد.