021-88881776

آموزش توسعه وب با ASP.NET Core در .NET

آموزش .NET از مفاهیم پایه شروع می‌شود و ASP.NET Core به‌عنوان بخشی از این اکوسیستم، ابزارهایی برای ساخت برنامه‌های وب مدرن ارائه می‌دهد. قبل از هر چیز، باید بدانیم که ASP.NET Core چیست و چرا اهمیت دارد.ASP.NET Core یک فریم‌ورک قدرتمند و متن‌باز از مایکروسافت است که برای توسعه وب‌سایت‌ها، اپلیکیشن‌ها و APIها به کار می‌رود. این ابزار در اکوسیستم .NET قرار دارد و به دلیل انعطاف‌پذیری، عملکرد بالا و پشتیبانی از پلتفرم‌های مختلف (ویندوز، مک و لینوکس) بین توسعه‌دهندگان محبوبیت زیادی پیدا کرده است. در این مقاله، شما را با تمامی جنبه‌های توسعه وب با ASP.NET Core در .NET از سطح مبتدی تا پیشرفته آشنا می‌کنیم. هدف ما این است که با زبانی ساده و مثال‌های عملی، این مسیر را برای شما روشن کنیم.

مفاهیم پایه ASP.NET Core

در این بخش، به‌طور کامل به مفاهیم پایه‌ای که برای شروع توسعه وب با ASP.NET Core در .NET نیاز دارید، می‌پردازیم. اگر تازه‌کار هستید، نگران نباشید؛ این توضیحات با زبانی ساده و همراه با جزئیات و مثال‌های عملی ارائه می‌شود تا درک عمیقی از این فریم‌ورک به دست آورید.

ASP.NET Core چیست؟

ASP.NET Core یک فریم‌ورک متن‌باز و مدرن است که توسط مایکروسافت توسعه داده شده و بخشی از اکوسیستم .NET محسوب می‌شود. این نسخه، جایگزینی برای ASP.NET قدیمی است که در گذشته فقط روی ویندوز کار می‌کرد و محدودیت‌هایی داشت. ASP.NET Core از ابتدا بازنویسی شده تا سریع‌تر، انعطاف‌پذیرتر و سازگار با نیازهای امروزی باشد.

ماژولار بودن:

یکی از ویژگی‌های کلیدی ASP.NET Core این است که ماژولار طراحی شده است. به این معنی که شما فقط از بخش‌هایی از فریم‌ورک که به آن نیاز دارید استفاده می‌کنید. مثلاً اگر فقط بخواهید یک API بسازید، لازم نیست ابزارهای مربوط به صفحات وب را بارگذاری کنید. این ویژگی باعث کاهش حجم برنامه و افزایش سرعت آن می‌شود.

چندپلتفرمی:

برخلاف نسخه‌های قدیمی‌تر، ASP.NET Core روی سیستم‌عامل‌های مختلف مثل ویندوز، لینوکس و مک اجرا می‌شود. این امکان به لطف .NET Core (و حالا .NET) فراهم شده که یک پلتفرم یکپارچه و قابل‌حمل است.

هدف اصلی:

این فریم‌ورک برای ساخت انواع برنامه‌های وب، از وب‌سایت‌های ساده گرفته تا APIهای پیچیده و برنامه‌های بلادرنگ (مثل چت) طراحی شده است. به عبارت دیگر، هر چیزی که در دنیای وب نیاز دارید، با ASP.NET Core قابل پیاده‌سازی است.

مزایا

ASP.NET Core به دلایل متعددی در میان توسعه‌دهندگان محبوب است. بیایید نگاهی دقیق‌تر به مزایای آن بیندازیم:

عملکرد بالا:

ASP.NET Core یکی از سریع‌ترین فریم‌ورک‌های وب موجود است. مایکروسافت آن را بهینه کرده تا درخواست‌ها را با سرعت بیشتری پردازش کند و بتواند در مقیاس بزرگ (مثلاً وب‌سایت‌هایی با میلیون‌ها کاربر) به‌خوبی عمل کند. مثلاً، در مقایسه با فریم‌ورک‌های دیگر مثل Node.js یا Django، در بنچمارک‌ها معمولاً عملکرد بهتری دارد.

چندپلتفرمی:

فرض کنید یک توسعه‌دهنده هستید که روی مک کار می‌کنید، اما سرور شما لینوکس است. با ASP.NET Core، می‌توانید برنامه خود را روی مک توسعه دهید، تست کنید و سپس بدون تغییر روی لینوکس اجرا کنید. این قابلیت هزینه‌ها را کاهش می‌دهد و انعطاف‌پذیری را بالا می‌برد.

پشتیبانی از ابزارهای مدرن:

ASP.NET Core ابزارهای پیشرفته‌ای در اختیار شما قرار می‌دهد:
Razor: یک زبان نشانه‌گذاری است که به شما امکان می‌دهد کد C# را با HTML ترکیب کنید و صفحات وب پویا بسازید.
SignalR: برای برنامه‌هایی که نیاز به ارتباط بلادرنگ دارند (مثل چت یا اعلان‌ها) استفاده می‌شود.
Entity Framework Core: ابزاری برای کار با پایگاه داده به‌صورت ساده و شیءگرا.

جامعه و اکوسیستم قوی:

چون ASP.NET Core متن‌باز است، جامعه بزرگی از توسعه‌دهندگان در سراسر جهان به بهبود آن کمک می‌کنند. همچنین، مستندات رسمی مایکروسافت و بسته‌های NuGet (کتابخانه‌های آماده) کار شما را آسان‌تر می‌کنند.

پیش‌نیازها برای شروع

قبل از اینکه دست به کار شوید، به چند ابزار نیاز دارید:

Visual Studio یا Visual Studio Code: Visual Studio محیط توسعه پیشنهادی برای ویندوز و مک است، اما اگر سبک‌تر می‌خواهید، VS Code هم انتخاب خوبی است.
SDK .NET: باید نسخه مناسب .NET (مثلاً .NET 8 در سال 2025) را نصب کنید. این SDK شامل همه چیزهایی است که برای اجرای ASP.NET Core لازم دارید.
دانش اولیه C#: چون ASP.NET Core با زبان C# نوشته می‌شود، آشنایی با این زبان کمک بزرگی به شما می‌کند.

مثال ساده

بیایید با یک مثال عملی شروع کنیم تا ببینید شروع کار با توسعه وب با ASP.NET Core در .NET چقدر آسان است. فرض کنید می‌خواهید یک وب‌سایت ساده بسازید که فقط یک پیام نمایش دهد.

نصب و راه‌اندازی:

Visual Studio را باز کنید، یک پروژه جدید از نوع “ASP.NET Core Web App” بسازید و نامش را مثلاً “MyFirstApp” بگذارید.

بررسی فایل Program.cs:

وقتی پروژه را ایجاد می‌کنید، فایل Program.cs به‌صورت پیش‌فرض چیزی شبیه این خواهد بود:

var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();

app.MapGet("/", () => "سلام دنیا!");
app.Run();

توضیح کد:
WebApplication.CreateBuilder(args): یک نمونه از اپلیکیشن وب را آماده می‌کند.
app.MapGet(“/”, …): مشخص می‌کند که وقتی کاربر به آدرس اصلی (مثلاً http://localhost:5000) سر می‌زند، چه اتفاقی بیفتد. در اینجا، پیام “سلام دنیا!” برگردانده می‌شود.
app.Run(): سرور را راه‌اندازی می‌کند تا درخواست‌ها را گوش کند.

اجرا و تست:

پروژه را اجرا کنید (کلید F5 در Visual Studio). مرورگر باز می‌شود و عبارت “سلام دنیا!” را می‌بینید. به همین سادگی یک وب‌سرور ساختید!

ساختار پروژه

وقتی یک پروژه ASP.NET Core می‌سازید، چند پوشه و فایل کلیدی می‌بینید:

Program.cs: نقطه شروع برنامه شماست.
appsettings.json: فایل تنظیمات است که اطلاعاتی مثل اتصال به دیتابیس یا تنظیمات سرور را نگه می‌دارد.
wwwroot: جایی که فایل‌های استاتیک (مثل CSS، JavaScript و تصاویر) قرار می‌گیرند.
Startup.cs (در نسخه‌های قدیمی‌تر): برای تنظیم سرویس‌ها و middlewareها استفاده می‌شد، اما در نسخه‌های جدیدتر (مثل .NET 6 و بعد) این کار در Program.cs انجام می‌شود.

مفاهیم کلیدی دیگر

Middleware:

Middlewareها مثل فیلترهایی هستند که درخواست‌های HTTP را پردازش می‌کنند. مثلاً، می‌توانید یک middleware بنویسید که هر درخواست را لاگ کند:

app.Use(async (context, next) =>
{
    Console.WriteLine("درخواست دریافت شد!");
    await next.Invoke();
});

Dependency Injection (DI):

ASP.NET Core از DI به‌صورت داخلی پشتیبانی می‌کند. این یعنی می‌توانید سرویس‌ها (مثل اتصال به دیتابیس) را تعریف کنید و در هر جای برنامه به‌راحتی استفاده کنید. مثال:

builder.Services.AddScoped<IMyService, MyService>();

چرا ASP.NET Core را انتخاب کنیم؟

اگر هنوز مطمئن نیستید که چرا باید از ASP.NET Core استفاده کنید، بیایید یک سناریو واقعی را بررسی کنیم: فرض کنید می‌خواهید یک وب‌سایت فروشگاهی بسازید که هم روی سرور ارزان لینوکس کار کند، هم سریع باشد و هم از ابزارهای مدرن مثل چت زنده پشتیبانی کند. ASP.NET Core همه این نیازها را با یک فریم‌ورک یکپارچه برآورده می‌کند.

در نهایت، مفاهیم پایه‌ای که در این بخش یاد گرفتید، زیربنای هر چیزی هستند که در توسعه وب با ASP.NET Core در .NET انجام خواهید داد. در بخش‌های بعدی، این مفاهیم را با مثال‌های پیشرفته‌تر مثل MVC و APIها گسترش می‌دهیم.

ایجاد وب‌اپلیکیشن‌های MVC

یکی از قدرتمندترین و محبوب‌ترین روش‌ها برای توسعه وب با ASP.NET Core در .NET، استفاده از الگوی طراحی MVC (Model-View-Controller) است. این الگو به شما کمک می‌کند تا برنامه‌های وب خود را به‌صورت سازمان‌یافته، قابل‌نگهداری و مقیاس‌پذیر بسازید. در این بخش، به‌طور کامل به جزئیات این الگو، نحوه کار آن، اجزای تشکیل‌دهنده‌اش و چگونگی پیاده‌سازی آن در ASP.NET Core می‌پردازیم. هدف این است که با زبانی ساده و مثال‌های عملی، این مفهوم را برای افراد مبتدی و حرفه‌ای روشن کنیم.

الگوی MVC چیست؟

MVC یک الگوی معماری است که برنامه شما را به سه بخش اصلی تقسیم می‌کند: Model، View و Controller. این تقسیم‌بندی باعث می‌شود کد شما منظم‌تر باشد و هر بخش وظیفه خاص خودش را داشته باشد. بیایید این ایده را با یک مثال روزمره درک کنیم: فرض کنید یک رستوران دارید.

Model مثل آشپزخانه است که مواد اولیه (داده‌ها) را آماده می‌کند.
View مثل پیشخدمت است که غذا را به مشتری (کاربر) نشان می‌دهد.
Controller مثل مدیر رستوران است که سفارش‌ها را می‌گیرد و بین آشپزخانه و پیشخدمت هماهنگی ایجاد می‌کند.
در توسعه وب با ASP.NET Core در .NET، این الگو به شما کمک می‌کند تا پروژه‌های پیچیده را به بخش‌های ساده‌تر بشکنید و مدیریت آن‌ها را آسان‌تر کنید.

اجزای MVC

حالا بیایید هر کدام از این اجزا را با جزئیات بیشتری بررسی کنیم:

Model:

Model قلب داده‌ها و منطق اصلی برنامه شماست. این بخش مسئول ذخیره و مدیریت اطلاعات (مثلاً اطلاعات یک محصول در یک فروشگاه آنلاین) و همچنین قوانین کسب‌وکار (مثلاً محاسبه تخفیف) است.
ویژگی‌ها: معمولاً شامل کلاس‌هایی با ویژگی‌ها (Properties) است که داده‌ها را نشان می‌دهند.

مثال: اگر بخواهید یک محصول را مدل کنید، ممکن است به این شکل باشد:

public class Product
{
    public int Id { get; set; }
    public string Name { get; set; }
    public decimal Price { get; set; }
}

View:

View لایه‌ای است که کاربر با آن تعامل دارد. این بخش رابط کاربری را نمایش می‌دهد و داده‌های Model را به شکلی که برای کاربر قابل‌فهم باشد، ارائه می‌کند. در ASP.NET Core، Viewها معمولاً با Razor نوشته می‌شوند، یک زبان نشانه‌گذاری که کد C# را با HTML ترکیب می‌کند.
ویژگی‌ها: پویا بودن (Dynamic) و قابلیت استفاده مجدد.

مثال: یک View برای نمایش لیست محصولات می‌تواند این‌گونه باشد:

@model List<Product>
<h1>محصولات</h1>
<ul>
    @foreach (var product in Model)
    {
        <li>@product.Name - @product.Price تومان</li>
    }
</ul>

Controller:

Controller مثل مغز برنامه عمل می‌کند. این بخش درخواست‌های کاربر (مثلاً کلیک روی یک دکمه یا باز کردن یک صفحه) را دریافت می‌کند، با Model کار می‌کند تا داده‌های لازم را تهیه کند و سپس تصمیم می‌گیرد که کدام View باید نمایش داده شود.
ویژگی‌ها: پردازش منطق درخواست‌ها و ارسال پاسخ مناسب.

مثال: یک Controller ساده برای مدیریت محصولات:

public class ProductController : Controller
{
    public IActionResult Index()
    {
        var products = new List<Product>
        {
            new Product { Id = 1, Name = "کتاب", Price = 50000 }
        };
        return View(products);
    }
}

چگونه MVC در ASP.NET Core کار می‌کند؟

وقتی کاربر در مرورگر خود آدرس یک صفحه (مثلاً /Products) را وارد می‌کند، این مراحل طی می‌شود:

درخواست به Controller می‌رسد: ASP.NET Core با استفاده از سیستم مسیریابی (Routing)، درخواست را به Controller مناسب (مثلاً ProductController) هدایت می‌کند.
Controller داده‌ها را آماده می‌کند: Controller با Model تعامل می‌کند تا داده‌های موردنیاز (مثلاً لیست محصولات) را بگیرد.
View نمایش داده می‌شود: Controller داده‌ها را به یک View می‌فرستد تا رابط کاربری ساخته شود و به کاربر نشان داده شود.

مثال عملی: ساخت یک وب‌سایت فروشگاهی ساده

بیایید با یک پروژه واقعی‌تر این مفاهیم را پیاده کنیم. فرض کنید می‌خواهید یک صفحه وب بسازید که لیست محصولات یک فروشگاه را نشان دهد.

ایجاد Model:

ابتدا یک کلاس برای محصول تعریف می‌کنیم:

public class Product
{
    public int Id { get; set; }
    public string Name { get; set; }
    public decimal Price { get; set; }
}

ساخت Controller:

حالا یک Controller می‌نویسیم که داده‌ها را آماده کند:

public class ProductController : Controller
{
    private readonly List<Product> _products = new List<Product>
    {
        new Product { Id = 1, Name = "کتاب", Price = 50000 },
        new Product { Id = 2, Name = "لپ‌تاپ", Price = 20000000 }
    };

    public IActionResult Index()
    {
        return View(_products);
    }

    public IActionResult Details(int id)
    {
        var product = _products.FirstOrDefault(p => p.Id == id);
        if (product == null) return NotFound();
        return View(product);
    }
}

Index: لیست همه محصولات را نشان می‌دهد.
Details: جزئیات یک محصول خاص را بر اساس شناسه (ID) نمایش می‌دهد.

ایجاد Viewها:

View برای Index (فایل Views/Product/Index.cshtml):

@model List<Product>
<h1>لیست محصولات</h1>
<table>
    <thead>
        <tr>
            <th>شناسه</th>
            <th>نام</th>
            <th>قیمت</th>
        </tr>
    </thead>
    <tbody>
        @foreach (var product in Model)
        {
            <tr>
                <td>@product.Id</td>
                <td>@product.Name</td>
                <td>@product.Price تومان</td>
            </tr>
        }
    </tbody>
</table>

View برای Details (فایل Views/Product/Details.cshtml):

@model Product
<h1>جزئیات محصول</h1>
<p>شناسه: @Model.Id</p>
<p>نام: @Model.Name</p>
<p>قیمت: @Model.Price تومان</p>

تنظیم مسیریابی:

در فایل Program.cs، مطمئن شوید که مسیریابی MVC فعال باشد:

var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllersWithViews(); // اضافه کردن MVC
var app = builder.Build();

app.UseRouting();
app.UseEndpoints(endpoints =>
{
    endpoints.MapControllerRoute(
        name: "default",
        pattern: "{controller=Product}/{action=Index}/{id?}");
});

app.Run();

اجرا و نتیجه:

وقتی پروژه را اجرا کنید:

آدرس /Product لیست محصولات را نشان می‌دهد.
آدرس /Product/Details/1 جزئیات محصول با شناسه 1 را نمایش می‌دهد.

مزایای استفاده از MVC در ASP.NET Core

سازمان‌دهی بهتر:

با جدا کردن داده‌ها (Model)، رابط کاربری (View) و منطق (Controller)، کد شما خواناتر و قابل‌مدیریت‌تر می‌شود.

قابلیت تست:

چون هر بخش مستقل است، می‌توانید Controllerها یا Modelها را به‌راحتی با ابزارهای تست واحد (Unit Testing) بررسی کنید.

انعطاف‌پذیری:

مثلاً اگر بخواهید رابط کاربری را تغییر دهید (مثلاً از HTML به یک اپلیکیشن موبایل)، کافی است View را عوض کنید بدون اینکه به Controller یا Model دست بزنید.

پشتیبانی از Razor:

زبان Razor در توسعه وب با ASP.NET Core در .NET به شما اجازه می‌دهد کدهای سمت سرور را با HTML ترکیب کنید و صفحات پویا بسازید.

نکات پیشرفته‌تر

استفاده از دیتابیس:

به‌جای لیست ثابت در Controller، می‌توانید از Entity Framework Core برای اتصال به دیتابیس استفاده کنید. مثلاً:

public class ProductController : Controller
{
    private readonly AppDbContext _context;

    public ProductController(AppDbContext context)
    {
        _context = context;
    }

    public IActionResult Index()
    {
        var products = _context.Products.ToList();
        return View(products);
    }
}

فیلترها (Filters):

می‌توانید از فیلترها برای کارهایی مثل احراز هویت یا لاگ کردن استفاده کنید:

[Authorize] // فقط کاربران واردشده
public IActionResult Index()
{
    // ...
}

ایجاد وب‌اپلیکیشن‌های MVC با ASP.NET Core راهی عالی برای شروع توسعه وب با ASP.NET Core در .NET است. این الگو به شما نظم، انعطاف‌پذیری و ابزارهای مدرن می‌دهد تا پروژه‌های کوچک و بزرگ را به‌راحتی بسازید. با تمرین مثال‌های بالا و گسترش آن‌ها (مثلاً اضافه کردن فرم برای ثبت محصول جدید)، می‌توانید مهارت خود را در این زمینه تقویت کنید.

ساخت APIهای RESTful

در دنیای مدرن توسعه وب، APIها (Application Programming Interfaces) نقش مهمی در اتصال برنامه‌ها به یکدیگر دارند. اگر بخواهید برنامه‌ای بسازید که با اپلیکیشن‌های موبایل، وب‌سایت‌های دیگر یا حتی دستگاه‌های هوشمند ارتباط برقرار کند، ساخت APIهای RESTful با توسعه وب با ASP.NET Core در .NET یکی از بهترین گزینه‌هاست. ASP.NET Core ابزارهای قدرتمند و انعطاف‌پذیری برای این کار ارائه می‌دهد که هم برای پروژه‌های کوچک و هم برای سیستم‌های بزرگ مناسب است. در این بخش، به‌طور کامل به مفهوم REST، نحوه ساخت APIها، ابزارهای مرتبط و مثال‌های عملی می‌پردازیم تا این موضوع را به‌خوبی درک کنید.

REST چیست؟

REST (Representational State Transfer) یک سبک معماری برای طراحی APIهاست که از پروتکل HTTP به‌عنوان پایه استفاده می‌کند. ایده اصلی REST این است که شما منابع (Resources) را در برنامه خود تعریف کنید (مثلاً محصولات، کاربران یا سفارش‌ها) و از متدهای استاندارد HTTP برای تعامل با آن‌ها استفاده کنید.

متدهای اصلی HTTP در REST:

GET: برای گرفتن داده‌ها (مثلاً لیست محصولات).
POST: برای ایجاد داده جدید (مثلاً افزودن یک محصول).
PUT: برای به‌روزرسانی داده موجود (مثلاً تغییر قیمت یک محصول).
DELETE: برای حذف داده (مثلاً حذف یک محصول).

ویژگی‌های REST:

بدون حالت (Stateless): هر درخواست به سرور مستقل است و اطلاعات قبلی را نگه نمی‌دارد.
استفاده از URLها: هر منبع با یک آدرس مشخص (مثلاً /api/products) شناسایی می‌شود.
فرمت داده: معمولاً داده‌ها به‌صورت JSON یا XML ارسال و دریافت می‌شوند (JSON رایج‌تر است).

مثال ساده:

فرض کنید یک اپلیکیشن موبایل دارید که باید لیست محصولات را از سرور بگیرد. با یک درخواست GET به آدرس /api/products، سرور داده‌ها را به‌صورت JSON برمی‌گرداند:

[
    {"id": 1, "name": "لپ‌تاپ", "price": 20000000}
]

چرا از APIهای RESTful در ASP.NET Core استفاده کنیم؟

ASP.NET Core به‌طور خاص برای ساخت APIهای RESTful طراحی شده و مزایای زیادی دارد:

سبک و سریع: به دلیل ماژولار بودن، فقط امکانات موردنیاز را بارگذاری می‌کند.
پشتیبانی داخلی: ابزارهایی مثل Swagger و Attribute Routing کار را ساده‌تر می‌کنند.
انعطاف‌پذیری: می‌توانید API را برای هر نوع کلاینت (موبایل، وب، دسکتاپ) تنظیم کنید.
در توسعه وب با ASP.NET Core در .NET، این قابلیت به شما اجازه می‌دهد برنامه‌های مقیاس‌پذیر و مدرن بسازید که با فناوری‌های مختلف سازگار باشند.

مثال عملی: ساخت یک API ساده برای مدیریت محصولات

بیایید یک API RESTful برای مدیریت محصولات بسازیم. این API امکان گرفتن لیست محصولات، اضافه کردن محصول جدید، به‌روزرسانی و حذف را فراهم می‌کند.

تعریف Model:

ابتدا یک کلاس ساده برای محصول تعریف می‌کنیم:

public class Product
{
    public int Id { get; set; }
    public string Name { get; set; }
    public decimal Price { get; set; }
}

ایجاد Controller:

حالا یک API Controller می‌سازیم که منطق اصلی را مدیریت کند:

[Route("api/[controller]")] // مسیر پایه: /api/products
[ApiController] // بهینه‌سازی برای API
public class ProductsController : ControllerBase
{
    private static List<Product> _products = new List<Product>
    {
        new Product { Id = 1, Name = "لپ‌تاپ", Price = 20000000 }
    };

    // GET: گرفتن همه محصولات
    [HttpGet]
    public IActionResult GetAll()
    {
        return Ok(_products); // کد 200 و لیست محصولات
    }

    // GET: گرفتن یک محصول خاص
    [HttpGet("{id}")]
    public IActionResult GetById(int id)
    {
        var product = _products.FirstOrDefault(p => p.Id == id);
        if (product == null) return NotFound(); // کد 404
        return Ok(product);
    }

    // POST: افزودن محصول جدید
    [HttpPost]
    public IActionResult Add([FromBody] Product product)
    {
        product.Id = _products.Max(p => p.Id) + 1; // تولید ID جدید
        _products.Add(product);
        return CreatedAtAction(nameof(GetById), new { id = product.Id }, product); // کد 201
    }

    // PUT: به‌روزرسانی محصول
    [HttpPut("{id}")]
    public IActionResult Update(int id, [FromBody] Product updatedProduct)
    {
        var product = _products.FirstOrDefault(p => p.Id == id);
        if (product == null) return NotFound();
        product.Name = updatedProduct.Name;
        product.Price = updatedProduct.Price;
        return NoContent(); // کد 204
    }

    // DELETE: حذف محصول
    [HttpDelete("{id}")]
    public IActionResult Delete(int id)
    {
        var product = _products.FirstOrDefault(p => p.Id == id);
        if (product == null) return NotFound();
        _products.Remove(product);
        return NoContent(); // کد 204
    }
}

تنظیمات پروژه:

در فایل Program.cs، مطمئن شوید که سرویس‌های لازم فعال باشند:

var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers(); // اضافه کردن پشتیبانی از API
var app = builder.Build();

app.UseRouting();
app.UseEndpoints(endpoints =>
{
    endpoints.MapControllers();
});

app.Run();

تست با Postman:

GET /api/products: لیست محصولات را برمی‌گرداند.
GET /api/products/1: محصول با ID=1 را نشان می‌دهد.
POST /api/products: با ارسال JSON مثل {“name”: “کتاب”, “price”: 50000} یک محصول اضافه می‌کند.
PUT /api/products/1: با ارسال JSON، محصول را به‌روزرسانی می‌کند.
DELETE /api/products/1: محصول را حذف می‌کند.

ابزارهای کمکی در ASP.NET Core

Swagger (Swashbuckle):

ASP.NET Core به‌صورت پیش‌فرض از Swagger پشتیبانی می‌کند که یک رابط کاربری گرافیکی برای تست و مستندسازی API شما فراهم می‌کند. برای فعال‌سازی:

بسته Swashbuckle.AspNetCore را از NuGet نصب کنید.
در Program.cs اضافه کنید:

builder.Services.AddSwaggerGen();
app.UseSwagger();
app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "My API V1"));

حالا با اجرای برنامه، به آدرس /swagger بروید و API خود را تست کنید.

Attribute Routing:

با استفاده از [Route] و [HttpGet] و غیره، مسیرها و متدها را دقیقاً تعریف می‌کنید.

پاسخ‌های استاندارد:

متدهای IActionResult مثل Ok()، NotFound() و CreatedAtAction() به شما کمک می‌کنند تا کدهای وضعیت HTTP (مثل 200، 404، 201) را به‌طور استاندارد برگردانید.

نکات پیشرفته‌تر

اتصال به دیتابیس:

به‌جای لیست ثابت، می‌توانید از Entity Framework Core برای کار با دیتابیس استفاده کنید:

public class ProductsController : ControllerBase
{
    private readonly AppDbContext _context;

    public ProductsController(AppDbContext context)
    {
        _context = context;
    }

    [HttpGet]
    public IActionResult GetAll()
    {
        return Ok(_context.Products.ToList());
    }
}

احراز هویت:

می‌توانید با [Authorize] و JWT توکن‌ها، API را امن کنید:

[Authorize]
[HttpGet]
public IActionResult GetAll()
{
    return Ok(_products);
}

نسخه‌بندی (Versioning):

برای پشتیبانی از نسخه‌های مختلف API:

[ApiVersion("1.0")]
[Route("api/v{version:apiVersion}/[controller]")]

عملکرد بالا: بهینه‌سازی شده برای درخواست‌های زیاد.
مستندات خودکار: با Swagger، نیازی به نوشتن مستندات جداگانه ندارید.
انعطاف‌پذیری: از پروژه‌های کوچک تا سیستم‌های پیچیده جواب می‌دهد.

ساخت APIهای RESTful با توسعه وب با ASP.NET Core در .NET راهی قدرتمند برای ایجاد برنامه‌های متصل و مدرن است. با مثال بالا، شما یک API کامل برای مدیریت محصولات ساختید که می‌توانید آن را با دیتابیس، امنیت و ابزارهای پیشرفته گسترش دهید. حالا که اصول اولیه را یاد گرفتید، می‌توانید با اضافه کردن قابلیت‌های جدید، API خود را به سطح حرفه‌ای برسانید!

مدیریت احراز هویت و مجوزها

امنیت در هر برنامه وب، از یک وب‌سایت ساده گرفته تا یک API پیچیده، یکی از مهم‌ترین جنبه‌هاست. بدون امنیت مناسب، داده‌های کاربران، اطلاعات حساس و حتی عملکرد برنامه شما در معرض خطر قرار می‌گیرد. در توسعه وب با ASP.NET Core در .NET، ابزارهای قدرتمندی برای مدیریت احراز هویت (Authentication) و مجوزدهی (Authorization) ارائه شده که به شما کمک می‌کند برنامه‌هایی امن و قابل‌اعتماد بسازید. در این بخش، این مفاهیم را به‌طور کامل توضیح می‌دهیم، تفاوت‌هایشان را روشن می‌کنیم و با مثال‌های عملی نشان می‌دهیم که چگونه می‌توانید آن‌ها را پیاده‌سازی کنید.

احراز هویت (Authentication) چیست؟

احراز هویت فرآیندی است که هویت کاربر را تأیید می‌کند. به زبان ساده، پاسخ به این سؤال است: “آیا این شخص واقعاً همان کسی است که ادعا می‌کند؟” مثلاً وقتی وارد ایمیل خود می‌شوید، با وارد کردن نام کاربری و رمز عبور، سیستم مطمئن می‌شود که شما همان صاحب حساب هستید.

چرا مهم است؟

بدون احراز هویت، هر کسی می‌تواند به‌جای شما به برنامه دسترسی پیدا کند و اطلاعات حساس را ببیند یا تغییر دهد.
روش‌های رایج در ASP.NET Core:
کوکی‌ها: برای وب‌سایت‌ها، که وضعیت ورود کاربر را در مرورگر ذخیره می‌کند.
JWT (JSON Web Tokens): برای APIها، که یک توکن امن برای تأیید هویت ارسال می‌شود.
OAuth و OpenID Connect: برای ورود با حساب‌های خارجی مثل گوگل یا فیسبوک.

پیاده‌سازی احراز هویت با ASP.NET Core Identity

ASP.NET Core Identity یک سیستم آماده و قدرتمند است که مدیریت کاربران، رمزهای عبور، نقش‌ها و ورود/خروج را ساده می‌کند. بیایید با یک مثال عملی آن را بررسی کنیم.

نصب و راه‌اندازی Identity:

ابتدا باید Identity را به پروژه اضافه کنید. در فایل Program.cs سرویس‌ها را تنظیم کنید:

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddDbContext<AppDbContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection")));
builder.Services.AddIdentity<IdentityUser, IdentityRole>()
    .AddEntityFrameworkStores<AppDbContext>()
    .AddDefaultTokenProviders();

builder.Services.AddControllersWithViews();
var app = builder.Build();

app.UseAuthentication(); // فعال کردن احراز هویت
app.UseAuthorization();  // فعال کردن مجوزدهی
app.MapControllers();

app.Run();

توضیح:
AddIdentity: سرویس Identity را با کاربر پیش‌فرض (IdentityUser) و نقش‌ها (IdentityRole) اضافه می‌کند.
AddEntityFrameworkStores: داده‌ها را در دیتابیس (مثلاً SQL Server) ذخیره می‌کند.

مدل ورود کاربر:

یک مدل ساده برای دریافت اطلاعات ورود تعریف می‌کنیم:

public class LoginModel
{
    public string Username { get; set; }
    public string Password { get; set; }
}

کنترلر ورود:

حالا یک API یا کنترلر برای ورود کاربر می‌سازیم:

[Route("api/[controller]")]
[ApiController]
public class AuthController : ControllerBase
{
    private readonly UserManager<IdentityUser> _userManager;
    private readonly SignInManager<IdentityUser> _signInManager;

    public AuthController(UserManager<IdentityUser> userManager, SignInManager<IdentityUser> signInManager)
    {
        _userManager = userManager;
        _signInManager = signInManager;
    }

    [HttpPost("login")]
    public async Task<IActionResult> Login([FromBody] LoginModel model)
    {
        var user = await _userManager.FindByNameAsync(model.Username);
        if (user != null && await _userManager.CheckPasswordAsync(user, model.Password))
        {
            await _signInManager.SignInAsync(user, isPersistent: false); // ورود با کوکی
            return Ok("ورود موفق!");
        }
        return Unauthorized("نام کاربری یا رمز عبور اشتباه است.");
    }
}

توضیح:
FindByNameAsync: کاربر را با نام کاربری پیدا می‌کند.
CheckPasswordAsync: رمز عبور را بررسی می‌کند.
SignInAsync: کاربر را وارد سیستم می‌کند (در اینجا با کوکی).

استفاده از JWT (برای APIها):

اگر API می‌سازید، می‌توانید از توکن JWT استفاده کنید. ابتدا بسته Microsoft.AspNetCore.Authentication.JwtBearer را نصب کنید و در Program.cs تنظیم کنید:

builder.Services.AddAuthentication(options =>
{
    options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
    options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
}).AddJwtBearer(options =>
{
    options.TokenValidationParameters = new TokenValidationParameters
    {
        ValidateIssuer = true,
        ValidateAudience = true,
        ValidateLifetime = true,
        ValidateIssuerSigningKey = true,
        ValidIssuer = "yourIssuer",
        ValidAudience = "yourAudience",
        IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("yourSecretKey"))
    };
});

سپس در کنترلر، توکن تولید کنید:

[HttpPost("login")]
public async Task<IActionResult> Login([FromBody] LoginModel model)
{
    var user = await _userManager.FindByNameAsync(model.Username);
    if (user != null && await _userManager.CheckPasswordAsync(user, model.Password))
    {
        var token = GenerateJwtToken(user);
        return Ok(new { Token = token });
    }
    return Unauthorized();
}

private string GenerateJwtToken(IdentityUser user)
{
    var claims = new[]
    {
        new Claim(JwtRegisteredClaimNames.Sub, user.UserName),
        new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString())
    };
    var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("yourSecretKey"));
    var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);

    var token = new JwtSecurityToken(
        issuer: "yourIssuer",
        audience: "yourAudience",
        claims: claims,
        expires: DateTime.Now.AddMinutes(30),
        signingCredentials: creds);

    return new JwtSecurityTokenHandler().WriteToken(token);
}

نتیجه: کاربر با ارسال نام کاربری و رمز، یک توکن دریافت می‌کند که می‌تواند در درخواست‌های بعدی استفاده کند.

مجوزها (Authorization) چیست؟

مجوزدهی تعیین می‌کند که کاربر پس از ورود چه کارهایی می‌تواند انجام دهد. مثلاً آیا این کاربر می‌تواند یک محصول را حذف کند یا فقط اجازه دیدن محصولات را دارد؟

روش‌های مجوزدهی:

نقش‌ها (Roles): کاربر را به گروهی مثل “Admin” یا “User”割り当て می‌دهد.
سیاست‌ها (Policies): قوانین پیچیده‌تر برای دسترسی (مثلاً “کاربر باید بالای 18 سال باشد”).
ادعاها (Claims): اطلاعات خاص درباره کاربر (مثلاً “ایمیل تأییدشده”).

پیاده‌سازی مجوزها

استفاده از نقش‌ها:

فرض کنید فقط مدیران بتوانند محصولی را حذف کنند:

[Authorize(Roles = "Admin")]
[HttpDelete("{id}")]
public IActionResult Delete(int id)
{
    // کد حذف محصول
    return Ok("محصول حذف شد.");
}

اضافه کردن نقش به کاربر:

هنگام ثبت‌نام یا مدیریت کاربران:

await _userManager.AddToRoleAsync(user, "Admin");

استفاده از سیاست‌ها:

فرض کنید فقط کاربرانی که ایمیلشان تأیید شده می‌توانند عملی را انجام دهند:

builder.Services.AddAuthorization(options =>
{
    options.AddPolicy("EmailVerified", policy =>
        policy.RequireClaim("EmailVerified", "true"));
});

[Authorize(Policy = "EmailVerified")]
[HttpGet]
public IActionResult GetSensitiveData()
{
    return Ok("داده‌های حساس");
}

نکات پیشرفته‌تر

میان‌افزار (Middleware):

می‌توانید احراز هویت و مجوزها را در سطح میان‌افزار بررسی کنید:

app.Use(async (context, next) =>
{
    if (!context.User.Identity.IsAuthenticated)
    {
        context.Response.StatusCode = 401;
        await context.Response.WriteAsync("لطفاً وارد شوید.");
        return;
    }
    await next();
});

 

تأیید دو عاملی (2FA):

Identity از 2FA پشتیبانی می‌کند و می‌توانید با کد QR یا پیامک آن را فعال کنید.

مدیریت رمز عبور:

می‌توانید قوانین رمز عبور (مثلاً حداقل طول یا نیاز به کاراکتر خاص) را تنظیم کنید:

builder.Services.Configure<IdentityOptions>(options =>
{
    options.Password.RequireDigit = true;
    options.Password.RequiredLength = 8;
});

مزایای مدیریت احراز هویت و مجوزها در ASP.NET Core

سادگی: Identity بسیاری از نیازهای امنیتی را به‌صورت آماده ارائه می‌دهد.
انعطاف‌پذیری: از کوکی برای وب‌سایت‌ها تا JWT برای APIها، همه چیز ممکن است.
امنیت بالا: با رمزنگاری قوی و پشتیبانی از استانداردهای مدرن.

مدیریت احراز هویت و مجوزها در توسعه وب با ASP.NET Core در .NET به شما اجازه می‌دهد برنامه‌هایی امن و کاربرپسند بسازید. با استفاده از Identity، JWT یا سیاست‌ها، می‌توانید دسترسی‌ها را دقیقاً کنترل کنید و از داده‌های کاربران محافظت کنید. مثال‌های بالا نقطه شروعی هستند؛ حالا می‌توانید با افزودن قابلیت‌هایی مثل ثبت‌نام، بازیابی رمز عبور یا ورود با شبکه‌های اجتماعی، امنیت برنامه خود را به سطح بالاتری ببرید!

نتیجه‌گیری

توسعه وب با ASP.NET Core در .NET مسیری قدرتمند و منعطف برای ساخت برنامه‌های وب مدرن است. از مفاهیم پایه مثل MVC گرفته تا APIهای RESTful و مدیریت امنیت، این فریم‌ورک همه چیز را برای شما فراهم می‌کند. اگر تازه‌کار هستید، با پروژه‌های کوچک شروع کنید و به‌تدریج به سمت برنامه‌های پیچیده‌تر بروید. با تمرین و استفاده از مثال‌های عملی، به‌راحتی می‌توانید مهارت خود را ارتقا دهید.

آموزش توسعه وب با ASP.NET Core در .NET

دیدگاه های شما

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *