eitaa logo
پروژه ASP.Net Core MVC (وب و سی شارپ)
121 دنبال‌کننده
168 عکس
38 ویدیو
376 فایل
❁﷽❁ آموزش 📖 برنامه نویسی ASP.Net Core MVC (وب و سی شارپ) Admin: @alialirezapanahi برنامه نویسی برنامه نویسی سی شارپ eitaa.com/sisharpapp برنامه نویسی وب eitaa.com/aspdatnet ویراستی virasty.com/alialirezapanahi آپارات aparat.com/alialirezapanahi
مشاهده در ایتا
دانلود
این یک سوال مهم و حیاتی در مدیریت داده‌ها است. بسته به قوانین حفظ حریم خصوصی و نیازهای تجاری، روش‌های مختلفی برای مدیریت درخواست‌های حذف اطلاعات وجود دارد. بیایید به هر دو روش حذف و غیر فعال کردن اطلاعات و همچنین مدیریت بکاپ‌های داده‌ها بپردازیم: 1. حذف اطلاعات از دیتابیس مزایا: داده‌ها به طور کامل حذف می‌شوند و هیچ اثری از آن‌ها باقی نمی‌ماند، که می‌تواند از نظر امنیتی و حفظ حریم خصوصی مزیت باشد. معایب: ممکن است اطلاعات مورد نیاز برای گزارش‌های تاریخی یا بازگشت از مشکلات به طور کامل از دست برود. مثال: csharp public void DeleteCustomer(long customerId) { var customer = _context.Customers.Find(customerId); if (customer != null) { _context.Customers.Remove(customer); _context.SaveChanges(); } } 2. غیر فعال کردن اطلاعات (Soft Delete) مزایا: اطلاعات به طور فیزیکی از دیتابیس حذف نمی‌شوند، اما به طور منطقی غیر فعال می‌شوند، که به شما امکان می‌دهد در صورت نیاز دوباره به آن‌ها دسترسی داشته باشید. امکان نگهداری تاریخچه و گزارش‌های تاریخی. معایب: ممکن است حجم دیتابیس افزایش یابد و نیاز به فضای بیشتری برای ذخیره‌سازی داده‌های غیر فعال باشد. مثال: csharp public void DeactivateCustomer(long customerId) { var customer = _context.Customers.Find(customerId); if (customer != null) { customer.IsActive = false; // فرض کنید ستون IsActive برای نشانه‌گذاری مشتری‌های غیرفعال وجود دارد _context.SaveChanges(); } } 3. مدیریت بکاپ‌ها بکاپ‌های دیتابیس معمولاً برای بازیابی اطلاعات در صورت بروز مشکلات استفاده می‌شوند. اما در هنگام درخواست‌های حذف داده‌ها، باید این موارد را در نظر بگیرید: حذف اطلاعات از بکاپ‌ها: این ممکن است پیچیده و زمان‌بر باشد و در بیشتر موارد عملی نیست. نگهداری بکاپ‌ها: برخی از قوانین ممکن است الزام کنند که بکاپ‌ها باید تا مدت معینی نگهداری شوند. اطلاع‌رسانی به کاربران: کاربران را مطلع کنید که اطلاعات آن‌ها ممکن است تا مدت معینی در بکاپ‌ها نگهداری شود. راهکار پیشنهادی استفاده از Soft Delete: استفاده از روش غیر فعال کردن اطلاعات (Soft Delete) برای حفظ تاریخچه و مدیریت آسان‌تر داده‌ها. بازنگری بکاپ‌ها: بررسی قوانین و نیازهای کسب‌وکار برای تعیین مدت زمان نگهداری بکاپ‌ها. اطلاع‌رسانی شفاف: اطلاع‌رسانی به کاربران درباره روش‌های مدیریت اطلاعات و مدت زمان نگهداری داده‌ها در بکاپ‌ها. نتیجه‌گیری با انتخاب روش مناسب برای مدیریت درخواست‌های حذف اطلاعات و مدیریت صحیح بکاپ‌ها، می‌توانید از حفظ حریم خصوصی کاربران و رعایت قوانین اطمینان حاصل کنید. هر دو روش حذف فیزیکی و غیر فعال کردن اطلاعات مزایا و معایب خود را دارند، بنابراین باید با توجه به نیازهای خاص پروژه و قوانین مرتبط، بهترین روش را انتخاب کنید.
ساختار درختی کتگوری (Category Tree Structure) در بسیاری از سیستم‌های مدیریت محتوا و دیتابیس‌ها استفاده می‌شود تا دسته‌بندی‌ها و زیر دسته‌بندی‌ها را به صورت سلسله‌مراتبی مدیریت کند. این نوع ساختار به کاربران کمک می‌کند تا به راحتی به دسته‌ها و زیردسته‌ها دسترسی پیدا کنند و اطلاعات را به صورت سازمان‌دهی‌شده نمایش دهند. تعریف ساختار درختی کتگوری ساختار درختی کتگوری شامل یک ریشه (root) و مجموعه‌ای از گره‌ها (nodes) است که هر گره می‌تواند صفر یا چند فرزند (children) داشته باشد. هر گره نمایانگر یک دسته (category) یا زیردسته (subcategory) است. بیایید یک مثال عملی از این ساختار را بررسی کنیم. ساختار دیتابیس برای دسته‌ها و زیر دسته‌ها برای ایجاد این ساختار در یک دیتابیس رابطه‌ای، معمولاً یک جدول واحد با رابطه‌های خودی (self-referencing) استفاده می‌شود. این جدول می‌تواند به شکل زیر تعریف شود: sql CREATE TABLE Categories ( Id INT PRIMARY KEY, Name NVARCHAR(100) NOT NULL, ParentId INT NULL, FOREIGN KEY (ParentId) REFERENCES Categories(Id) ); نمونه داده‌ها برای نمایش ساختار درختی، می‌توانید داده‌های زیر را به جدول اضافه کنید: sql INSERT INTO Categories (Id, Name, ParentId) VALUES (1, 'Electronics', NULL); INSERT INTO Categories (Id, Name, ParentId) VALUES (2, 'Computers', 1); INSERT INTO Categories (Id, Name, ParentId) VALUES (3, 'Laptops', 2); INSERT INTO Categories (Id, Name, ParentId) VALUES (4, 'Smartphones', 1); INSERT INTO Categories (Id, Name, ParentId) VALUES (5, 'Home Appliances', NULL); INSERT INTO Categories (Id, Name, ParentId) VALUES (6, 'Refrigerators', 5); نمایش ساختار درختی با استفاده از این داده‌ها، ساختار درختی به صورت زیر نمایش داده می‌شود: Electronics |-- Computers | |-- Laptops |-- Smartphones Home Appliances |-- Refrigerators پیاده‌سازی در کد در زبان‌های برنامه‌نویسی مختلف، می‌توانید این ساختار را به راحتی پیاده‌سازی کنید. به عنوان مثال، در C# می‌توانید از کلاس‌های زیر استفاده کنید: csharp public class Category { public int Id { get; set; } public string Name { get; set; } public int? ParentId { get; set; } public List<Category> SubCategories { get; set; } public Category() { SubCategories = new List<Category>(); } } public class CategoryTree { public List<Category> Categories { get; set; } public CategoryTree() { Categories = new List<Category>(); } public void AddCategory(Category category) { if (category.ParentId == null) { Categories.Add(category); } else { var parentCategory = FindCategoryById(category.ParentId.Value, Categories); parentCategory?.SubCategories.Add(category); } } private Category FindCategoryById(int id, List<Category> categories) { foreach (var category in categories) { if (category.Id == id) { return category; } var subCategory = FindCategoryById(id, category.SubCategories); if (subCategory != null) { return subCategory; } } return null; } } نتیجه‌گیری ساختار درختی کتگوری به شما اجازه می‌دهد تا دسته‌بندی‌ها و زیردسته‌ها را به صورت سازمان‌دهی‌شده و سلسله‌مراتبی مدیریت کنید. این ساختار به کاربران کمک می‌کند تا به راحتی به دسته‌ها و زیردسته‌ها دسترسی پیدا کنند و اطلاعات را به شکل منظمی نمایش دهند.
استفاده از بلوک‌های Try-Catch در مدیریت خطا یکی از ابزارهای حیاتی در توسعه نرم‌افزار است. با این حال، استفاده نادرست یا بیش از حد از آن‌ها می‌تواند مشکلاتی به وجود آورد. در اینجا دلایلی آورده شده که چرا باید با احتیاط از Try-Catch استفاده کنیم و بهترین شیوه‌های مدیریت خطا را به کار ببریم: مشکلات استفاده نادرست از Try-Catch پنهان کردن خطاها: استفاده نادرست از Try-Catch می‌تواند منجر به پنهان کردن خطاها شود، به طوری که خطاهای واقعی شناسایی و رفع نشوند. این مسئله می‌تواند مشکلات بیشتری در کد به وجود آورد. کاهش کارایی: استفاده زیاد از Try-Catch می‌تواند باعث کاهش کارایی برنامه شود، زیرا مدیریت استثناها هزینه بالایی دارد. پیچیدگی کد: استفاده بیش از حد از Try-Catch می‌تواند کد را پیچیده و ناخوانا کند، که باعث کاهش قابلیت نگهداری و درک آن می‌شود. بهترین شیوه‌های مدیریت خطا استفاده محدود از Try-Catch: بلوک‌های Try-Catch را در جاهایی استفاده کنید که واقعاً نیاز است. مثلا در مواقعی که کد با منابع خارجی مانند فایل‌ها، شبکه، یا پایگاه داده در تعامل است. ثبت و گزارش خطاها: زمانی که خطایی رخ می‌دهد، آن را ثبت کنید تا بتوانید بعداً آن را بررسی و رفع کنید. استفاده از لاگ‌گیری (logging) ابزارهای مفیدی مانند NLog، Serilog یا Log4Net می‌تواند بسیار مفید باشد. csharp try { // کد حساس به خطا } catch (Exception ex) { // ثبت خطا logger.LogError(ex, "An error occurred"); throw; // برای دوباره پرتاب کردن خطا تا در سطح بالاتر مدیریت شود } مدیریت خطاهای خاص: بهتر است به جای گرفتن خطاهای عمومی (Exception)، خطاهای خاص را بگیرید و مدیریت کنید. csharp try { // کد حساس به خطا } catch (FileNotFoundException ex) { // مدیریت خطای فایل logger.LogError(ex, "File not found"); } catch (IOException ex) { // مدیریت خطاهای ورودی/خروجی logger.LogError(ex, "IO error occurred"); } catch (Exception ex) { // مدیریت سایر خطاها logger.LogError(ex, "An unexpected error occurred"); throw; } استفاده از الگوهای طراحی مناسب: استفاده از الگوهای طراحی مانند الگوی Retry یا الگوی Circuit Breaker می‌تواند به مدیریت خطاها در سیستم‌های توزیع‌شده کمک کند. نمایش پیام‌های خطای مناسب به کاربران: پیام‌های خطا باید برای کاربران قابل فهم باشند و اطلاعاتی که بتوانند از آن برای رفع مشکل استفاده کنند ارائه دهند. اما نباید جزئیات فنی را نمایش دهند که ممکن است امنیت سیستم را به خطر بیاندازند. نتیجه‌گیری استفاده از Try-Catch برای مدیریت خطا در برنامه‌ها ضروری است، اما باید به صورت منطقی و با احتیاط از آن‌ها استفاده شود. با پیروی از بهترین شیوه‌های مدیریت خطا، می‌توانید کد خود را پایدارتر، قابل نگهداری‌تر و کارآمدتر کنید.
انتخاب نام‌های مناسب برای پروژه‌ها و اجزاء مختلف آن، به ویژه در پروژه‌های بزرگ، می‌تواند چالش‌برانگیز باشد. استفاده از یک الگوی نام‌گذاری واضح و ثابت می‌تواند به شما کمک کند تا پروژه‌ها را به سادگی مدیریت کنید و اجزاء مختلف را به راحتی پیدا کنید. در اینجا چند راهنمایی برای نام‌گذاری پروژه‌ها و اجزاء مختلف آن آورده شده است: راهنمایی‌های کلی برای نام‌گذاری نام‌های معنادار: همیشه نام‌هایی را انتخاب کنید که واضح و معنادار باشند. این نام‌ها باید به طور دقیق توضیح دهند که کد یا فایل چه کاری انجام می‌دهد. عدم استفاده از اختصارات نامفهوم: از اختصاراتی که برای دیگران مبهم هستند، اجتناب کنید. اگر لازم است از اختصارات استفاده کنید، مطمئن شوید که آن‌ها برای همه اعضای تیم قابل فهم هستند. ثبات در نام‌گذاری: از یک الگوی نام‌گذاری ثابت در سراسر پروژه استفاده کنید تا کد خواناتر و قابل نگهداری‌تر شود. الگوهای نام‌گذاری متداول پروژه‌ها نام شرکت یا تیم + نام پروژه: به عنوان مثال، MyCompany.ProjectX یا TeamA.TaskManager. محیط توسعه: اگر پروژه‌ها به محیط‌های مختلف (توسعه، تست، تولید) متصل هستند، می‌توانید این مورد را نیز در نام‌گذاری لحاظ کنید. مثلاً، ProjectX.Dev, ProjectX.Test, ProjectX.Prod. پوشه‌ها و فایل‌ها ماژول‌ها و ویژگی‌ها: پوشه‌ها و فایل‌ها را بر اساس ماژول‌ها یا ویژگی‌های پروژه نام‌گذاری کنید. به عنوان مثال، Authentication, UserManagement, Billing. الگوی نام‌گذاری کلاس‌ها: از الگوهای نام‌گذاری مناسب برای کلاس‌ها استفاده کنید. به عنوان مثال، CustomerService, OrderController, PaymentRepository. توابع و متدها افعال واضح و معنادار: نام توابع و متدها باید افعالی باشند که عملکرد آن‌ها را توضیح دهند. به عنوان مثال، GetCustomerById, UpdateOrderStatus, ProcessPayment. متغیرها معنادار و توصیفی: نام متغیرها باید معنادار و توصیفی باشند. به عنوان مثال، customerName, orderTotal, paymentStatus. ابزارها و روش‌های کمکی تولید مستندات: استفاده از ابزارهای مستند‌سازی مانند Swagger یا XML Documentation در .NET می‌تواند به شما کمک کند تا نام‌ها و عملکردها را توضیح دهید و مستندات پروژه را بهبود بخشید. نرم‌افزارهای مدیریت پروژه: استفاده از نرم‌افزارهای مدیریت پروژه مانند JIRA یا Trello می‌تواند به شما کمک کند تا پروژه‌های خود را سازماندهی کنید و اجزاء مختلف را به راحتی پیدا کنید. بازنگری کد: انجام بازنگری‌های منظم کد (Code Review) می‌تواند به بهبود نام‌گذاری‌ها و اطمینان از استفاده از الگوهای ثابت کمک کند. نتیجه‌گیری با استفاده از این راهنمایی‌ها و الگوهای نام‌گذاری، می‌توانید پروژه‌های خود را به طور موثرتر مدیریت کنید و اطمینان حاصل کنید که نام‌ها معنادار و قابل درک هستند. این کار به شما کمک می‌کند تا بهره‌وری خود و تیم‌تان را افزایش دهید و مشکلات مربوط به یافتن اجزاء مختلف پروژه را کاهش دهید.
کوکی‌ها (Cookies) فایل‌های کوچکی هستند که در مرورگر کاربران ذخیره می‌شوند و به وب‌سایت‌ها اجازه می‌دهند تا اطلاعاتی مانند تنظیمات کاربر، سشن‌ها، و اطلاعات دیگر را نگهداری کنند. در پروژه‌های ASP.NET Core، کوکی‌ها به طور گسترده برای مدیریت سشن‌ها، احراز هویت، و نگهداری اطلاعات تنظیمات کاربر استفاده می‌شوند. استفاده از کوکی‌ها در ASP.NET Core بیایید با جزئیات بیشتری به نحوه استفاده از کوکی‌ها در ASP.NET Core بپردازیم: 1. ذخیره‌سازی کوکی برای ذخیره‌سازی کوکی در ASP.NET Core، می‌توانید از متد HttpContext.Response.Cookies.Append استفاده کنید. مثال: csharp public IActionResult SetCookie() { // ایجاد و ذخیره‌سازی کوکی HttpContext.Response.Cookies.Append("MyCookie", "CookieValue", new CookieOptions { Expires = DateTime.Now.AddDays(7) // تنظیم تاریخ انقضا }); return Ok("Cookie has been set"); } 2. خواندن کوکی برای خواندن کوکی از درخواست کاربر، می‌توانید از متد HttpContext.Request.Cookies استفاده کنید. مثال: csharp public IActionResult GetCookie() { // خواندن کوکی if (HttpContext.Request.Cookies.TryGetValue("MyCookie", out string cookieValue)) { return Ok($"Cookie Value: {cookieValue}"); } return NotFound("Cookie not found"); } 3. حذف کوکی برای حذف کوکی، می‌توانید از متد HttpContext.Response.Cookies.Delete استفاده کنید. مثال: csharp public IActionResult DeleteCookie() { // حذف کوکی HttpContext.Response.Cookies.Delete("MyCookie"); return Ok("Cookie has been deleted"); } استفاده از کوکی‌ها برای احراز هویت ASP.NET Core از کوکی‌ها برای مدیریت احراز هویت کاربران استفاده می‌کند. شما می‌توانید از سرویس‌های Identity و Authentication برای مدیریت این کار استفاده کنید. پیکربندی احراز هویت کوکی ابتدا باید سرویس احراز هویت کوکی را در متد ConfigureServices در Startup.cs پیکربندی کنید. مثال: csharp public void ConfigureServices(IServiceCollection services) { services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme) .AddCookie(options => { options.LoginPath = "/Account/Login"; options.LogoutPath = "/Account/Logout"; options.AccessDeniedPath = "/Account/AccessDenied"; }); services.AddControllersWithViews(); } استفاده از احراز هویت کوکی سپس می‌توانید از احراز هویت کوکی برای لاگین و لاگ‌آوت کاربران استفاده کنید. مثال لاگین: csharp public async Task<IActionResult> Login(LoginViewModel model) { if (ModelState.IsValid) { var claims = new List<Claim> { new Claim(ClaimTypes.Name, model.Username), new Claim("FullName", model.FullName), new Claim(ClaimTypes.Role, "Administrator") }; var claimsIdentity = new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme); var authProperties = new AuthenticationProperties { IsPersistent = model.RememberMe }; await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, new ClaimsPrincipal(claimsIdentity), authProperties); return RedirectToAction("Index", "Home"); } return View(model); } مثال لاگ‌آوت: csharp public async Task<IActionResult> Logout() { await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme); return RedirectToAction("Index", "Home"); } نتیجه‌گیری کوکی‌ها ابزار قدرتمندی برای مدیریت سشن‌ها، احراز هویت و نگهداری اطلاعات کاربر در وب‌سایت‌ها هستند. با استفاده از ASP.NET Core می‌توانید به راحتی کوکی‌ها را ذخیره، خواندن، و حذف کنید و همچنین از آن‌ها برای احراز هویت کاربران استفاده کنید.
تحلیل کد csharp public IActionResult Index() { Response.Cookies.Append("Message", "welcome", new CookieOptions { HttpOnly = true, Secure = Request.IsHttps, Path = Request.PathBase.HasValue ? Request.PathBase.ToString() : "/", Expires = DateTime.Now.AddDays(5), }); return View(); } توضیحات خط به خط کد: public IActionResult Index(): این متد یک اکشن در کنترلر است که زمانی که درخواست به مسیر مربوطه (مثلاً /Home/Index) ارسال می‌شود، اجرا می‌شود. Response.Cookies.Append("Message", "welcome", new CookieOptions { ... }): این خط یک کوکی جدید به نام Message با مقدار welcome ایجاد و به پاسخ (Response) اضافه می‌کند. CookieOptions: HttpOnly = true: این گزینه تعیین می‌کند که کوکی فقط از طریق HTTP قابل دسترسی است و از طریق جاوااسکریپت قابل دسترسی نیست. این ویژگی به افزایش امنیت کوکی کمک می‌کند. Secure = Request.IsHttps: این گزینه تعیین می‌کند که کوکی فقط در ارتباطات امن (HTTPS) ارسال شود. اگر درخواست (Request) از طریق HTTPS باشد، این مقدار true خواهد بود. Path = Request.PathBase.HasValue ? Request.PathBase.ToString() : "/": این گزینه مسیر کوکی را تعیین می‌کند. اگر PathBase موجود باشد، از آن استفاده می‌شود؛ در غیر این صورت مسیر ریشه (/) استفاده می‌شود. Expires = DateTime.Now.AddDays(5): این گزینه تعیین می‌کند که کوکی تا پنج روز معتبر باشد. پس از پنج روز، کوکی منقضی می‌شود. return View(): این خط تعیین می‌کند که اکشن به نمای (View) مربوطه پاسخ دهد و صفحه وب مورد نظر نمایش داده شود. قسمت بازرسی (Inspect) در مرورگر - بخش Storage برای مشاهده و بررسی کوکی‌ها در مرورگر، می‌توانید از ابزارهای توسعه‌دهنده (Developer Tools) استفاده کنید. در زیر به توضیحات بخش‌های مختلف مربوط به کوکی‌ها در قسمت Storage می‌پردازیم: Name: نام کوکی، در اینجا Message. Value: مقدار کوکی، در اینجا welcome. Domain: دامنه‌ای که کوکی برای آن تنظیم شده است. به طور پیش‌فرض، دامنه سایت فعلی است. Path: مسیری که کوکی برای آن تنظیم شده است. در این مثال، مسیر تعیین شده بر اساس Request.PathBase یا ریشه / است. Expires / Max-Age: تاریخ انقضای کوکی، که در اینجا پنج روز پس از زمان فعلی تنظیم شده است. Size: اندازه کوکی بر حسب بایت. HttpOnly: نشان‌دهنده این است که کوکی فقط از طریق HTTP قابل دسترسی است و از طریق جاوااسکریپت قابل دسترسی نیست. Secure: نشان‌دهنده این است که کوکی فقط در ارتباطات امن (HTTPS) ارسال می‌شود. SameSite: تعیین می‌کند که آیا کوکی تنها در درخواست‌های یکسان ارسال شود یا خیر. در این مثال، این ویژگی تنظیم نشده است.
در مورد کوکی‌ها و Session در وب‌سایت‌ها، باید بدانید که کوکی‌ها برای ذخیره اطلاعات در سمت کلاینت (مرورگر) استفاده می‌شوند، در حالی که Sessionها برای ذخیره اطلاعات در سمت سرور استفاده می‌شوند. در این مورد، کوکی‌های مربوط به Session برای نگهداری شناسه Session استفاده می‌شوند که به سرور اجازه می‌دهد تا اطلاعات مرتبط با کاربر را بازیابی کند. نحوه ایجاد و تنظیم زمان انقضای کوکی در ASP.NET Core برای ایجاد و تنظیم زمان انقضای کوکی در ASP.NET Core می‌توانید از کد زیر استفاده کنید: csharp public IActionResult Index() { Response.Cookies.Append("SessionCookie", "SessionValue", new CookieOptions { HttpOnly = true, // تعیین این که کوکی فقط از طریق HTTP قابل دسترسی باشد Secure = Request.IsHttps, // تنظیم این که کوکی فقط در ارتباطات HTTPS ارسال شود Path = Request.PathBase.HasValue ? Request.PathBase.ToString() : "/", // تعیین مسیر کوکی Expires = DateTime.Now.AddMinutes(30) // تنظیم تاریخ انقضا برای 30 دقیقه }); return View(); } توضیحات در مورد کد نام کوکی (SessionCookie): نام کوکی که برای نگهداری شناسه Session یا اطلاعات دیگر استفاده می‌شود. مقدار کوکی (SessionValue): مقداری که در کوکی ذخیره می‌شود. HttpOnly: این گزینه تعیین می‌کند که کوکی فقط از طریق HTTP قابل دسترسی باشد و از طریق جاوااسکریپت قابل دسترسی نباشد، که این ویژگی به افزایش امنیت کوکی کمک می‌کند. Secure: این گزینه تعیین می‌کند که کوکی فقط در ارتباطات امن (HTTPS) ارسال شود. اگر درخواست (Request) از طریق HTTPS باشد، این مقدار true خواهد بود. Path: این گزینه مسیر کوکی را تعیین می‌کند. اگر PathBase موجود باشد، از آن استفاده می‌شود؛ در غیر این صورت مسیر ریشه (/) استفاده می‌شود. Expires: این گزینه تعیین می‌کند که کوکی تا 30 دقیقه معتبر باشد. پس از 30 دقیقه، کوکی منقضی می‌شود. مشاهده کوکی‌ها در بخش Storage برای مشاهده کوکی‌ها در مرورگر، می‌توانید از ابزارهای توسعه‌دهنده (Developer Tools) استفاده کنید. مراحل به شرح زیر است: باز کردن ابزارهای توسعه‌دهنده: در مرورگر (مثلاً Google Chrome)، کلیدهای F12 یا Ctrl+Shift+I را فشار دهید تا ابزارهای توسعه‌دهنده باز شوند. بخش Application: در پنجره ابزارهای توسعه‌دهنده، به تب Application بروید. بخش Storage: در پنل سمت چپ، به بخش Storage بروید و گزینه Cookies را باز کنید. سپس دامنه سایت خود را انتخاب کنید. مشاهده کوکی‌ها: در اینجا می‌توانید کوکی‌های ذخیره شده را مشاهده کنید. ستون‌های مختلفی مانند Name, Value, Domain, Path, Expires, Size, HttpOnly, Secure و SameSite وجود دارند که اطلاعات مربوط به هر کوکی را نمایش می‌دهند. این ابزارها به شما کمک می‌کنند تا کوکی‌ها را به راحتی مدیریت و بررسی کنید.
بیایید این کد را به طور دقیق بررسی کنیم و توضیح دهیم که هر بخش چه کاری انجام می‌دهد: csharp public IActionResult Read() { string cookieValue; if (Request.Cookies.TryGetValue("Message1", out cookieValue)) { // اگر کوکی با نام "Message1" پیدا شود، مقدار آن در متغیر cookieValue ذخیره می‌شود } else { // اگر کوکی با نام "Message1" پیدا نشود، مقدار "کوکی یافت نشد" در متغیر cookieValue قرار می‌گیرد cookieValue = "کوکی یافت نشد"; } return Ok(cookieValue); // نتیجه به صورت یک پاسخ HTTP با وضعیت OK برگردانده می‌شود که شامل مقدار کوکی یا پیغام "کوکی یافت نشد" است } توضیحات: public IActionResult Read(): این خط متد Read را تعریف می‌کند که یک اکشن در کنترلر است و وقتی فراخوانی شود، مقدار کوکی را بررسی و بازمی‌گرداند. string cookieValue;: این خط یک متغیر رشته‌ای به نام cookieValue تعریف می‌کند که مقدار کوکی را ذخیره خواهد کرد. if (Request.Cookies.TryGetValue("Message1", out cookieValue)): این شرط بررسی می‌کند که آیا کوکی با نام "Message1" در درخواست فعلی وجود دارد یا خیر. Request.Cookies.TryGetValue("Message1", out cookieValue): اگر کوکی با نام "Message1" پیدا شود، مقدار آن در متغیر cookieValue ذخیره می‌شود و شرط if به true ارزیابی می‌شود. اگر کوکی با نام "Message1" پیدا نشود، شرط if به false ارزیابی می‌شود. else: اگر شرط if به false ارزیابی شود (کوکی با نام "Message1" پیدا نشود)، بخش else اجرا می‌شود. cookieValue = "کوکی یافت نشد";: اگر کوکی پیدا نشود، مقدار "کوکی یافت نشد" به متغیر cookieValue اختصاص داده می‌شود. return Ok(cookieValue);: متد مقدار cookieValue را به صورت یک پاسخ HTTP با وضعیت OK برمی‌گرداند. این پاسخ می‌تواند شامل مقدار کوکی یا پیغام "کوکی یافت نشد" باشد. نتیجه‌گیری این کد بررسی می‌کند که آیا کوکی با نام "Message1" در درخواست فعلی وجود دارد یا خیر. اگر کوکی وجود داشته باشد، مقدار آن را بازمی‌گرداند؛ در غیر این صورت، پیغام "کوکی یافت نشد" را بازمی‌گرداند. این کد برای نمایش مقدار کوکی به کاربر یا اطلاع‌رسانی در مورد عدم وجود کوکی مفید است.
اضافه کردن سبد خرید به پروژه یکی از ویژگی‌های بسیار متداول و مهم در فروشگاه‌های آنلاین است. ذخیره‌سازی سبد خرید در سمت کلاینت و سپس انتقال آن به سرور هنگام تکمیل خرید یک روش موثر برای کاهش بار سرور و افزایش کارایی برنامه است. بیایید یک روش ساده برای پیاده‌سازی این فرآیند را بررسی کنیم. مرحله 1: ذخیره‌سازی سبد خرید در سمت کلاینت می‌توانید از کوکی‌ها یا Local Storage برای ذخیره‌سازی سبد خرید در سمت کلاینت استفاده کنید. Local Storage برای داده‌های بیشتری نسبت به کوکی‌ها مناسب‌تر است. مثال با استفاده از Local Storage: javascript // افزودن آیتم به سبد خرید function addToCart(product) { let cart = JSON.parse(localStorage.getItem('shoppingCart')) || []; cart.push(product); localStorage.setItem('shoppingCart', JSON.stringify(cart)); } // دریافت سبد خرید function getCart() { return JSON.parse(localStorage.getItem('shoppingCart')) || []; } // حذف آیتم از سبد خرید function removeFromCart(productId) { let cart = JSON.parse(localStorage.getItem('shoppingCart')) || []; cart = cart.filter(item => item.id !== productId); localStorage.setItem('shoppingCart', JSON.stringify(cart)); } مرحله 2: نمایش سبد خرید در سمت کلاینت می‌توانید از جاوااسکریپت برای نمایش سبد خرید در صفحه وب استفاده کنید. مثال: javascript function displayCart() { let cart = getCart(); let cartHtml = ''; cart.forEach(item => { cartHtml +=
<div>${item.name} - ${item.price}</div>
; }); document.getElementById('cart').innerHTML = cartHtml; } // فراخوانی تابع نمایش سبد خرید هنگام بارگذاری صفحه window.onload = displayCart; مرحله 3: ارسال سبد خرید به سرور هنگام تکمیل خرید وقتی کاربر خرید خود را کامل کرد، سبد خرید را به سرور ارسال کنید تا در پایگاه داده ذخیره شود. مثال با استفاده از Fetch API: javascript async function completePurchase() { let cart = getCart(); let response = await fetch('/api/completePurchase', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(cart) }); if (response.ok) { // خرید با موفقیت انجام شد localStorage.removeItem('shoppingCart'); // پاک کردن سبد خرید } else { // مدیریت خطا console.error('Error completing purchase'); } } مرحله 4: دریافت و ذخیره‌سازی سبد خرید در سرور (ASP.NET Core) سمت سرور باید یک اکشن برای دریافت و ذخیره‌سازی سبد خرید فراهم کند. مثال در ASP.NET Core: csharp [HttpPost] [Route("api/completePurchase")] public IActionResult CompletePurchase([FromBody] List<Product> cart) { // ذخیره‌سازی سبد خرید در پایگاه داده // این قسمت به صورت تمثیلی است و بستگی به نیازهای پروژه شما دارد foreach (var product in cart) { _context.Orders.Add(new Order { ProductId = product.Id, Quantity = product.Quantity, Price = product.Price, OrderDate = DateTime.Now }); } _context.SaveChanges(); return Ok("Purchase completed successfully"); } نتیجه‌گیری این روش به شما امکان می‌دهد تا سبد خرید را در سمت کلاینت نگه دارید و بار سرور را کاهش دهید. وقتی کاربر خرید خود را تکمیل کرد، سبد خرید به سرور ارسال می‌شود تا در پایگاه داده ذخیره شود. این روش کارایی و عملکرد برنامه را بهبود می‌بخشد.
رمزگذاری پسوردها در برنامه‌های وب بسیار مهم است تا از امنیت کاربران و اطلاعات آن‌ها محافظت شود. استفاده از الگوریتم‌های رمزنگاری مطمئن به جلوگیری از دسترسی غیرمجاز به پسوردها کمک می‌کند. در ASP.NET Core، می‌توانید از کتابخانه‌های استاندارد برای رمزگذاری پسوردها استفاده کنید. بیایید یک روش ساده برای انجام این کار را بررسی کنیم. 1. استفاده از ASP.NET Core Identity ASP.NET Core Identity شامل ابزارها و سرویس‌هایی برای مدیریت کاربران و رمزگذاری پسوردها است. در اینجا نحوه پیکربندی و استفاده از آن آورده شده است. نصب ASP.NET Core Identity: ابتدا باید بسته‌های مورد نیاز را به پروژه خود اضافه کنید. می‌توانید این کار را از طریق NuGet Package Manager انجام دهید: Install-Package Microsoft.AspNetCore.Identity.EntityFrameworkCore Install-Package Microsoft.EntityFrameworkCore.SqlServer پیکربندی ASP.NET Core Identity: سپس باید Identity را در متد ConfigureServices در Startup.cs پیکربندی کنید: csharp public void ConfigureServices(IServiceCollection services) { services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"))); services.AddIdentity<IdentityUser, IdentityRole>() .AddEntityFrameworkStores<ApplicationDbContext>() .AddDefaultTokenProviders(); services.AddControllersWithViews(); } 2. ایجاد مدل کاربر و دیتابیس ایجاد مدل کاربر و دیتابیس با استفاده از Entity Framework Core و ASP.NET Core Identity. csharp public class ApplicationDbContext : IdentityDbContext<IdentityUser> { public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options) { } } 3. استفاده از UserManager برای مدیریت کاربران و رمزگذاری پسوردها استفاده از UserManager برای ایجاد کاربران و رمزگذاری پسوردها. ایجاد کاربر جدید: csharp public async Task<IActionResult> Register(string username, string password) { var user = new IdentityUser { UserName = username }; var result = await _userManager.CreateAsync(user, password); if (result.Succeeded) { return Ok("User created successfully"); } else { return BadRequest("Failed to create user"); } } 4. استفاده از PasswordHasher به صورت مستقل اگر نمی‌خواهید از ASP.NET Core Identity استفاده کنید، می‌توانید از PasswordHasher به صورت مستقل برای رمزگذاری پسوردها استفاده کنید. مثال مستقل: csharp public class PasswordService { private readonly IPasswordHasher<IdentityUser> _passwordHasher; public PasswordService() { _passwordHasher = new PasswordHasher<IdentityUser>(); } public string HashPassword(string password) { var user = new IdentityUser(); return _passwordHasher.HashPassword(user, password); } public bool VerifyPassword(string hashedPassword, string providedPassword) { var user = new IdentityUser(); var result = _passwordHasher.VerifyHashedPassword(user, hashedPassword, providedPassword); return result == PasswordVerificationResult.Success; } } // استفاده از PasswordService برای رمزگذاری و اعتبارسنجی پسوردها var passwordService = new PasswordService(); string hashedPassword = passwordService.HashPassword("MySecurePassword"); bool isPasswordValid = passwordService.VerifyPassword(hashedPassword, "MySecurePassword"); نتیجه‌گیری رمزگذاری پسوردها و ذخیره آن‌ها در دیتابیس به امنیت کاربران و اطلاعات آن‌ها کمک می‌کند. ASP.NET Core Identity ابزارهای قدرتمندی برای مدیریت کاربران و رمزگذاری پسوردها فراهم می‌کند، اما شما می‌توانید از PasswordHasher به صورت مستقل نیز استفاده کنید.
ذخیره اطلاعات لاگین در کوکی مرورگر یکی از روش‌های معمول برای مدیریت سشن‌های کاربر است. با این حال، باید با احتیاط این کار را انجام دهید تا امنیت اطلاعات کاربر حفظ شود. بیایید به نحوه انجام این کار در ASP.NET Core بپردازیم. مرحله 1: ایجاد و ذخیره‌سازی کوکی لاگین می‌توانید اطلاعات لاگین کاربر را پس از احراز هویت در کوکی مرورگر ذخیره کنید. برای این کار می‌توانید از متد SignInAsync استفاده کنید. مثال: csharp public async Task<IActionResult> Login(string username, string password) { // اعتبارسنجی کاربر var user = await _userManager.FindByNameAsync(username); if (user != null && await _userManager.CheckPasswordAsync(user, password)) { // ایجاد لیست کلایم‌ها (Claims) var claims = new List<Claim> { new Claim(ClaimTypes.Name, user.UserName), new Claim(ClaimTypes.NameIdentifier, user.Id), }; // ایجاد هویت کلایم (ClaimsIdentity) var claimsIdentity = new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme); // گزینه‌های احراز هویت var authProperties = new AuthenticationProperties { IsPersistent = true, // کوکی پایدار باشد ExpiresUtc = DateTimeOffset.UtcNow.AddMinutes(30) // تنظیم تاریخ انقضای کوکی }; // ورود به سیستم و ایجاد کوکی await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, new ClaimsPrincipal(claimsIdentity), authProperties); return RedirectToAction("Index", "Home"); } // بازگشت به صفحه لاگین در صورت عدم موفقیت در احراز هویت return View("Login"); } مرحله 2: پیکربندی احراز هویت کوکی در Startup.cs باید احراز هویت کوکی را در متدهای ConfigureServices و Configure پیکربندی کنید. ConfigureServices: csharp public void ConfigureServices(IServiceCollection services) { services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme) .AddCookie(options => { options.LoginPath = "/Account/Login"; // مسیر صفحه لاگین options.LogoutPath = "/Account/Logout"; // مسیر صفحه لاگ‌آوت options.AccessDeniedPath = "/Account/AccessDenied"; // مسیر صفحه دسترسی ممنوع }); services.AddControllersWithViews(); } Configure: csharp public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } else { app.UseExceptionHandler("/Home/Error"); app.UseHsts(); } app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseRouting(); app.UseAuthentication(); // استفاده از میان‌افزار احراز هویت app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); }); } مرحله 3: مدیریت لاگ‌آوت برای حذف کوکی و خروج کاربر از سیستم، می‌توانید از متد SignOutAsync استفاده کنید. مثال لاگ‌آوت: csharp public async Task<IActionResult> Logout() { await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme); return RedirectToAction("Index", "Home"); } امنیت کوکی برای اطمینان از امنیت کوکی‌ها، مطمئن شوید که از گزینه‌های زیر استفاده می‌کنید: HttpOnly: کوکی‌ها را به گونه‌ای تنظیم کنید که فقط از طریق HTTP قابل دسترسی باشند و جاوااسکریپت نتواند به آن‌ها دسترسی پیدا کند. Secure: کوکی‌ها را به گونه‌ای تنظیم کنید که فقط در ارتباطات HTTPS ارسال شوند. SameSite: از ویژگی SameSite برای جلوگیری از ارسال کوکی‌ها در درخواست‌های متقاطع استفاده کنید. نتیجه‌گیری با استفاده از روش‌های بالا، می‌توانید اطلاعات لاگین کاربران را به صورت امن در کوکی مرورگر ذخیره و مدیریت کنید. این کار به شما کمک می‌کند تا سشن‌های کاربران را مدیریت کرده و تجربه کاربری بهتری فراهم کنید.