بررسی مفهوم Cross-Origin Resource Sharing یا CORS

بررسی مفهوم Cross-Origin Resource Sharing یا CORS

مثلا فرض کنید وب سرویسی نوشته اید که بر اساس Request (درخواست) وارده، اطلاعاتی را در پاسخ بر میگرداند.
حال در سایت خودتان(مثلا site1.com) از این وب سرویس استفاده میکنید و اشکالی هم ندارد. مشکل آنجاست که سایت رقیب (مثلا site2.com) نیز میتواند بدون اجازه وبسرویس شما را در سایت خود استفاده کند.

اینجاست که CORS به کمک ما می آید.
این یک قرارداد پذیرفته شده از طرف کنسرسیوم جهانی وب (W3C) می باشد که امکان استفاده از منابع سایتتان را فقط در مرز های دامین خودتان فراهم میکند. یعنی سایت های دیگر نمیتوانند منابع شما(ادرس های سایت شما- تصاویر و فایل های استاتیک و…) را در سایت خود استفاده کنند. زیرا دامین انها با دامین سایت شما متفاوت است.

در این حالت اگر درخواستی از طرف یک دامین دیگر به وبسرویس مان زده شود. وب سرویس کارش را به درستی انجام میدهد و Response (پاسخ مربوطه) را به مرورگر باز میگرداند. ولی مرورگر خطا می دهد و (Response – پاسخ برگشتی) را به شخص نشان نمیدهد.
پس این خطا صرفا در سمت مرورگر اتفاق میافتد و نه در سمت سرور ما (وب سرویس ما)

و اما چگونه جلوی درخواست های وارده از دامین های دیگر را بگیریم؟!
عملا سایت ما نمیفهمد که Request وارده از طرف دامین خودمان(site1.com) است یا دامین های دیگر، ولی میتواند مشخص کند که منابع من باید فقط در دامین خودم (site1.com) مورد استفاده قرار گیرد و نه در دامین های دیگر

چگونه؟
اگر Header یک Response (پاسخ برگشتی) از سمت سرور شامل مقدار زیر باشد

Access-Control-Allow-Origin: http://www.site1.com

یعنی این پاسخ فقط میتواند در دامین site1.com مورد استفاده قرار گیرد و در غیر این صورت یعنی از طرف دامین غیر مجازی درخواست شده. پس مرورگر جلوی آنرا خواهد گرفت و خروجی را نمایش نمیدهد.
ولی اگر header یک response شامل مقدار زیر باشد
Access-Control-Allow-Origin: *
یعنی این پاسخ در همه دامین ها مجاز بوده و میتواند نمایش داده شود (حتی اگر دامین شخص بنده نباشد)

و اما قوانین دیگری را نیز توسط CORS میتواند برای مرورگر ها مشخص کرد. از جمله:
چه نوع درخواست هایی مجاز است ؟ get یا post و یا …
چه مقادیری در header درخواست مجاز است؟
و…. که لیست کامل به همراه اطلاعات بیشتر را میتوانید در آدرس زیر مشاهده کنید

https://en.wikipedia.org/wiki/Cross-origin_resource_sharing

ا WebApi به صورت پیشفرض امکان استفاده از Api ها از طرف دامین های دیگر را نمیدهد و این موضوع میتواند بعضی مواقع برای خودمان نیز دردسر ساز شود.
و اما برای رفع این مشکل باید سرویس دهنده(وب سرویس) توی response ایی که به مرورگر میفرستد
مقداری را داخل header هایش قرار دهد که مشخص میکند ” ای مرورگر گیر نده، اشکالی نداره از دامین های دیگه به من درخواست بزنن”
برای اعمال این موضوع در سطح یک Action یا همان Api میتوانیم کد زیر را در بدنه تابع بنویسیم.

Response.AppendHeader(“Access-Control-Allow-Origin”, “*”);

و یا برای اعمال این موضوع در سطح Controller (که در نتیجه روی تمام اکشن های داخل آن نیز اعمال میشود) باید به صورت زیر عمل کنیم.

[EnableCors(origins: “http://example.com”, headers: “*”, methods: “*”)] public class TestController : ApiController
{
}

و یا برای اعمال در سطح کل سیستم (تمام Controller ها و Action ها) باید در کلاس Configuration داخل متد Register کد زیر را وارد کنیم.

public static void Register(HttpConfiguration config)
{
config.EnableCors();
}
و یا میتوانید در فایل Web.Config تگ های زیر را وارد کنید
<system.webServer>
<httpProtocol>
<customHeaders>
<clear />
<add name=”Access-Control-Allow-Origin” value=”*” />
<add name=”Access-Control-Allow-Headers” value=”Content-Type”/>
</customHeaders>
</httpProtocol>
</system.webServer>

جهت اطلاعات بیشتر میتوانید به سایت enable-cors.org مراجعه کنید و یا مثال مختص Asp.Net آن را در آدرس زیر ببینید
http://enable-cors.org/server_aspnet.html
*مثال و آموزش رسمی سایت Asp.Net
http://goo.gl/E5y6pa
*این هم یک روش جالب دیگه که با استفاده از Action Filter ها انجام داده
http://goo.gl/qqXb0y
*اینم جالب کار کرده
http://goo.gl/QWbCT6

Asp.net mvc