۲۹ شهریور ۱۴۰۳

Techboy

اخبار و اطلاعات روز تکنولوژی

نحوه استفاده از کلیدهای API برای ایمن سازی API های وب در ASP.NET Core

از احراز هویت کلید API برای کنترل دسترسی برنامه ها و خدمات به API های وب خود در ASP.NET Core استفاده کنید.

از احراز هویت کلید API برای کنترل دسترسی برنامه ها و خدمات به API های وب خود در ASP.NET Core استفاده کنید.

راه‌های مختلفی برای ایمن‌سازی APIهای شما در ASP.NET Core 7 وجود دارد. می‌توانید از مکانیزم احراز هویت کاربر مانند توکن‌های JWT، شناسه هسته ASP.NET، توکن‌های حامل، OpenID Connect یا یک ارائه دهنده هویت OAuth 2.0، به نام چند. احراز هویت کلید API روش دیگری است که می توانید برای کمک به ایمن سازی API های خود اتخاذ کنید.

توجه داشته باشید که احراز هویت کلید API کاربر را شناسایی یا احراز هویت نمی کند. در عوض، احراز هویت کلید API از کلیدهای API برای تأیید اعتبار برنامه‌ها یا سرویس‌هایی که به APIهای شما دسترسی دارند، استفاده می‌کند. یک کلید API یک نشانه یا شناسه منحصربه‌فرد است که از طریق هدر درخواست، کوکی یا رشته پرس و جو به یک API ارسال می‌شود.

کلیدهای API را می‌توان برای کنترل اینکه کدام برنامه‌ها می‌توانند به API شما دسترسی داشته باشند، الگوهای استفاده آنها را ردیابی کنند یا روش‌های API را که می‌توانند استفاده کنند محدود کنند. با این حال، کلیدهای API برای مجوز امن کافی نیستند. برای آن، شما همچنین باید احراز هویت کاربر را پیاده سازی کنید.

در این مقاله، نحوه اجرای احراز هویت کلید API در ASP.NET Core 7 را بررسی خواهیم کرد. برای استفاده از نمونه کدهای ارائه شده در زیر، باید Visual Studio 2022 را در سیستم خود نصب کنید. اگر قبلاً نسخه‌ای ندارید، می‌توانید Visual Studio 2022 را از اینجا بارگیری کنید.

یک پروژه ASP.NET Core Web API در Visual Studio 2022 ایجاد کنید

ابتدا، اجازه دهید یک پروژه ASP.NET Core 7 Web API در Visual Studio 2022 ایجاد کنیم. این مراحل را دنبال کنید:

  1. Visual Studio 2022 IDE را راه اندازی کنید.
  2. روی “ایجاد پروژه جدید” کلیک کنید.
  3. در پنجره “ایجاد پروژه جدید”، “ASP.NET Core Web API” را از لیست الگوهای نمایش داده شده انتخاب کنید.
  4. بعدی را کلیک کنید.
  5. در پنجره “پیکربندی پروژه جدید خود”، نام و مکان پروژه جدید را مشخص کنید.
  6. به صورت اختیاری، بسته به تنظیمات برگزیده خود، کادر انتخاب «قرار دادن راه حل و پروژه در یک فهرست راهنمای» را علامت بزنید.
  7. بعدی را کلیک کنید.
  8. در پنجره «اطلاعات اضافی» که در ادامه نشان داده شده است، کادر «استفاده از کنترل‌کننده‌ها (برای استفاده از حداقل API‌ها علامت آن را بردارید» را علامت بزنید، زیرا ما از حداقل API در این پروژه استفاده نخواهیم کرد. تنظیم «نوع احراز هویت» را روی «هیچ» (پیش‌فرض) بگذارید.
  9. مطمئن شوید که چک باکس‌های «فعال کردن پشتیبانی از API باز کردن»، «پیکربندی برای HTTPS» و «فعال کردن داکر» علامت نخورده باقی می‌مانند زیرا ما از این ویژگی‌ها در اینجا استفاده نمی‌کنیم.
  10. روی ایجاد کلیک کنید.
نشانه فرهنگ مهندسی سالم

ما از این پروژه ASP.NET Core 7 Web API برای کار با احراز هویت کلید API در بخش‌های زیر استفاده خواهیم کرد.

احراز هویت کلید API را با استفاده از میان افزار اجرا کنید

اساساً، شما می توانید احراز هویت کلید API را در ASP.NET Core به دو روش مختلف پیاده سازی کنید: با استفاده از ویژگی های سفارشی یا استفاده از میان افزار. ما هر دوی این رویکردها را بررسی خواهیم کرد، از میان افزار شروع می کنیم.

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

یک فایل .cs جدید با نام CustomApiKeyMiddleware در پروژه Web API که قبلا ایجاد کردیم ایجاد کنید. میان افزار سفارشی شما باید سازنده ای داشته باشد که آرگومان هایی از نوع RequestDelegate را همانطور که در قطعه کد زیر نشان داده شده است، بپذیرد.

public class CustomApiKeyMiddleware
{
    private readonly RequestDelegate _next;
    const string API_KEY = "Api_Key";
    public CustomApiKeyMiddleware(RequestDelegate next)
    {
        _next = next;
    }
}

از آنجایی که برای خواندن رشته Api_Key از فایل AppSettings.json باید به نمونه ای از نوع IConfiguration دسترسی داشته باشید، باید مطابق شکل زیر یک مرجع از نوع IConfiguration را به عنوان پارامتر در سازنده ارسال کنید.

public class CustomApiKeyMiddleware
{
    private readonly IConfiguration Configuration;
    private readonly RequestDelegate _next;
    const string API_KEY = "Api_Key";
    public CustomApiKeyMiddleware(RequestDelegate next, IConfiguration configuration)
    {
        _next = next;
        Configuration = configuration;
    } 
}

میان‌افزار سفارشی شما باید Api_Key خوانده‌شده از فایل AppSettings.json را با کلیدی که در سرصفحه درخواست ارسال می‌شود، هنگام فراخوانی نقطه پایانی مقایسه کند. اگر این دو مطابقت داشته باشند، برنامه به نقطه پایانی دسترسی می دهد، در غیر این صورت، یک پیام خطای مناسب در پاسخ برگردانده می شود.

وب 3.0 نیازی به انقلاب بلاک چین ندارد

کد منبع کامل کلاس CustomApiKeyMiddleware برای مرجع در زیر آورده شده است:

public class CustomApiKeyMiddleware
{
    private readonly IConfiguration Configuration;
    private readonly RequestDelegate _next;
    const string API_KEY = "Api_Key";
    public CustomApiKeyMiddleware(RequestDelegate next,
    IConfiguration configuration)
    {
        _next = next;
        Configuration = configuration;
    }
    public async Task Invoke(HttpContext httpContext)
    {
        bool success = httpContext.Request.Headers.TryGetValue
        (API_KEY, out var apiKeyFromHttpHeader);
        if (!success)
        {
            httpContext.Response.StatusCode = 401;
            await httpContext.Response.WriteAsync("The Api Key for
            accessing this endpoint is not available");
            return;
        }
        string api_key_From_Configuration = Configuration[API_KEY];
        if (!api_key_From_Configuration.Equals(apiKeyFromHttpHeader))
        {
            httpContext.Response.StatusCode = 401;
            await httpContext.Response.WriteAsync("The authentication
            key is incorrect : Unauthorized access");
            return;
        }
        await _next(httpContext);
    }
}

برای استفاده از میان افزار، باید آن را با قرار دادن کد زیر در فایل Program.cs به خط لوله پردازش درخواست اضافه کنید.

app.UseMiddleware<CustomApiKeyMiddleware>();

اکنون، اجازه دهید برنامه را اجرا کنیم و به نقطه پایانی WeatherForecast در Postman برویم. توجه داشته باشید که اگر یک رشته Api_Key را در فایل AppSettings.json خود مشخص نکنید، پیام مناسب را همانطور که در شکل ۱ در زیر نشان داده شده است مشاهده خواهید کرد.

api key authentication 01

شکل ۱. احراز هویت ناموفق است زیرا هیچ مقدار Api_Key در سرصفحه درخواست ارسال نشده است.

وقتی مقدار Api_Key را در سرصفحه درخواست با استفاده از Postman ارسال می‌کنید، نقطه پایانی داده‌ها را با موفقیت برمی‌گرداند همانطور که در شکل ۲ نشان داده شده است.

api key authentication 02

شکل ۲. مقدار Api_Key با موفقیت ارسال شد و داده ها برگردانده شدند.

احراز هویت کلید API را با استفاده از ویژگی های سفارشی پیاده سازی کنید

اکنون بیایید نحوه اجرای احراز هویت کلید API را با استفاده از ویژگی های سفارشی بررسی کنیم. یک ویژگی درست مانند هر کلاس دیگری است که کلاس System.Attribute را گسترش می دهد. یک فایل .cs جدید با نام CustomApiKeyAttribute ایجاد کنید و کد زیر را در آنجا وارد کنید.

public class CustomApiKeyAttribute : Attribute, IAsyncActionFilter
{
    private const string API_KEY = "Api_Key";
    public async Task OnActionExecutionAsync
           (ActionExecutingContext context, ActionExecutionDelegate next)
    {
        bool success = context.HttpContext.Request.Headers.TryGetValue
            (API_KEY, out var apiKeyFromHttpHeader);
        if (!success)
        {
            context.Result = new ContentResult()
            {
                StatusCode = 401,
                Content = "The Api Key for accessing this endpoint is not available"
            };
            return;
        }
        IConfigurationBuilder configurationBuilder = new ConfigurationBuilder();
        configurationBuilder.AddJsonFile("AppSettings.json");
        IConfiguration Configuration = configurationBuilder.Build();
        string api_key_From_Configuration = Configuration[API_KEY];
        if (!api_key_From_Configuration.Equals(apiKeyFromHttpHeader))
        {
            context.Result = new ContentResult()
            {
                StatusCode = 401,
                Content = "The Api key is incorrect : Unauthorized access"
            };
            return;
        }
        await next();
    }
}

اکنون می توانید همانطور که در قطعه کد زیر نشان داده شده است، ویژگی را در کلاس کنترلر خود اعمال کنید.

[CustomApiKey]
[ApiController]
[Route("[controller]")]
public class WeatherForecastController : ControllerBase
{
    //Code omitted for brevity
}

اکنون، دوباره برنامه را اجرا کنید و یک Api_Key اشتباه را با استفاده از Postman مشخص کنید. همانطور که در شکل ۳ نشان داده شده است، باید پیام خطای مناسب را مشاهده کنید.

Google Project IDX شبیه سازهای اندروید و iOS را اضافه می کند

api key authentication 03

شکل ۳. ارسال یک مقدار Api_Key نادرست از طریق Postman منجر به درخواست غیرمجاز می شود و هیچ داده ای برگردانده نمی شود.

نتیجه گیری

توجه داشته باشید که احراز هویت کلید API برای اعتبارسنجی تماس‌ها با APIهای ما استفاده می‌شود، نه کاربر. به عبارت دیگر، کلیدهای API برای احراز هویت برنامه‌هایی که درخواست‌ها را به APIهای ما ارسال می‌کنند، استفاده می‌شود. کلیدهای API برای شناسایی برنامه‌ها و سرویس‌هایی که از API شما استفاده می‌کنند، کنترل یا محدود کردن دسترسی آن‌ها به روش‌های API شما، و نظارت بر الگوهای استفاده از آن‌ها مفید هستند، اما نمی‌توان از آنها برای شناسایی تک تک کاربران استفاده کرد.

تأیید هویت کلید API هیچ ارتباطی با احراز هویت کاربر ندارد، یعنی اعتبارسنجی کاربر برنامه ای که درخواست را انجام می دهد. برای مجوز واقعا ایمن، باید از نوعی مکانیزم احراز هویت کاربر استفاده کنید.