خانه / Programing / CORS و راه حل مواجه با اون

CORS و راه حل مواجه با اون

#اندکی_تامل
#CORS
☑️☑️☑️☑️☑️☑️☑️☑️
Cross-origin resource sharing (CORS)
CORS# یا Cross-Origin Resource Sharing
مکانیزمی هست که بصورت پیش فرض توی اکثر پلت فرم های دات نتی و غیر دات نتی بصورت پیش فرض فعال هست و این یک Practice# توصیه شده است. که هدف این مکانیزم اعمال محدودیت در دسترسی به resource های دامین جاری از خارج از دامین فعلی هست. به زبان بهتر باید گفت دسترسی secure شده به منابع از جمله(فونت ها و cssهاو غیره) در دامین جاری. CORS مکانیزمی رو مهیا می کنه که browser و server در یک تعامل با هم می تونن Safe بودن یا نبودن یک cross-origin request رو مشخص کنن.
CORS با افزودن HTTP Headerهای جدید به سرور اجازه میده که مجموعه ای از originهایی که دسترسی به اون resourceها رو از طریق web browser دارن کار می کنه.
هر چند غیر فعال کردن کامل!!!! یا دست کاری های سمت سرور جهت از بین بردن این مورد یک bad practice هست و به هیچ وجه توصیه نمیشه؛ راه حلی رو با افزودن یک لایبری به اسم Microsoft.AspNet.WebApi.Cors و استفاده از این پکیچ و دستور زیر
var cors = new EnableCorsAttribute(“*”, “*”, “*”);
config.EnableCors(cors);
کلا این مکانیزم CORS رو غیر فعال کرد اما باید توجه داشت که این مکانیزم برای wep api هست و برای mvc جواب نمیده. راه حل بهتر استفاده از مکانیزم های built in و دستکاری توی pipeline درخواست http توسط web api و mvc هست که من دو راه حل زیر رو پیشنهاد می کنم که امیدوارم مفید باشه.
😏😏😏😏
راه حل اول استفاده از action filter request هست که می تونید یک کلاس بنویسید که از ActionFilterAttribute ارث بری کنه و بعد متد OnActionExecuting اون رو override کنید در این متد می تونید به request مربوطه http response مناسب رو اضافه کنید که مرورگر از این درخواست جلوگیری نکنه به کمک دستور زیر filterContext.RequestContext.HttpContext.Response.AddHeader(“Access-Control-Allow-Origin”, “*”);
البته باز بهتره که دامین request مورد نظر چک بشه و فقط برای دامین های خاص این مورد افزوده بشه و نه برای تمام دامین ها؛ مثلا بصورت زیر می توانید اینکارو انجام بدید:
filterContext.RequestContext.HttpContext.Request.UrlReferrer.Host
فراموش نشه که این action filter باید در application_strat افزوده بشه:
GlobalFilters.Filters.Add(new MyActionFilterAttribute());
🙏🙏
و همچنین میشه مثلا همین مکانیزم رو با استفاده از یک Custom HTTP Message Handlers و افزودن یک delegate دیگه به delegating handler patternای که mvc و api دنبال می کنه اینکار رو انجام داد. که برای اینکار باید یه کلاس ایجاد کرد که از DelegatingHandler ارث بری می کنه و بعد متد
protected async override Task<HttpResponseMessage> SendAsync(
HttpRequestMessage request, CancellationToken cancellationToken)
اون رو override کرد. در نهایت توی app_start این http handler رو باید به config.MessageHandlers اضافه کرد

فراموش نشه که این راه حل راه حل مناسبی نیست و حتما و بدون شک توی بخش امنیت وب حتما همچین درخواست هایی رو ازشون جلوگیری می کنه!!

درباره ی masoud@admin

همچنین ببینید

Service Registration in Microservice

Service Registry در پست قبلی در باره ی یکی از جنبه های مهم معماری های …

مقایسه سه Pattern مهم مشتق شده از MV* بنام MVC و MVP و MVVM

مقایسه سه Pattern مهم مشتق شده از MV* بنام MVC و MVP و MVVM MVC …

2 دیدگاه

  1. سلام.مطالب سایت عالیه.ممنون از سایت مفید شما.به امید توفیق روزافزون.

پاسخ دهید

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

در تلگرام هم همراه شما هستم

اگر علاقمند به معماری نرم افزار و مبحث محبوب مایکروسرویس هستید؛ در کانال با ما همراه باشید. اطلاعات مفید زیادی در این کانال انتظار شما را می کشند. فقط کافیست دکمه ی پیوستن را بفشارید.

پیوستن بستن