ASP.Net MVC में पहुँच-नियंत्रण-अनुमति-उत्पत्ति सेट करना - सबसे सरल संभव तरीका


206

मेरे पास एक सरल एक्शनमेथोड है, जो कुछ जसन देता है। यह ajax.example.com पर चलता है। मुझे इसे अन्य साइट someothersite.com से एक्सेस करना होगा।

अगर मैं इसे कॉल करने की कोशिश करता हूं, तो मुझे उम्मीद है ...:

Origin http://someothersite.com is not allowed by Access-Control-Allow-Origin.

मुझे इसके चारों ओर जाने के दो तरीके पता हैं: JSONP और हेडर सेट करने के लिए एक कस्टम HttpHandler बनाना।

क्या कोई सरल तरीका नहीं है?

क्या किसी साधारण कार्रवाई के लिए अनुमति दी गई उत्पत्ति की सूची को परिभाषित करना संभव नहीं है - या सरल सभी को अनुमति देता है? शायद एक एक्शन फिल्टर?

इष्टतम होगा ...:

return json(mydata, JsonBehaviour.IDontCareWhoAccessesMe);

1
कृपया यहाँ vNext और MVC6 के लिए एक नज़र: neelbhatt40.wordpress.com/2015/09/10/…
नील

जवाबों:


381

सादे ASP.NET MVC नियंत्रकों के लिए

एक नई विशेषता बनाएँ

public class AllowCrossSiteJsonAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        filterContext.RequestContext.HttpContext.Response.AddHeader("Access-Control-Allow-Origin", "*");
        base.OnActionExecuting(filterContext);
    }
}

अपनी कार्रवाई टैग करें:

[AllowCrossSiteJson]
public ActionResult YourMethod()
{
    return Json("Works better?");
}

ASP.NET वेब API के लिए

using System;
using System.Web.Http.Filters;

public class AllowCrossSiteJsonAttribute : ActionFilterAttribute
{
    public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
    {
        if (actionExecutedContext.Response != null)
            actionExecutedContext.Response.Headers.Add("Access-Control-Allow-Origin", "*");

        base.OnActionExecuted(actionExecutedContext);
    }
}

संपूर्ण API नियंत्रक टैग करें:

[AllowCrossSiteJson]
public class ValuesController : ApiController
{

या व्यक्तिगत एपीआई कॉल:

[AllowCrossSiteJson]
public IEnumerable<PartViewModel> Get()
{
    ...
}

इंटरनेट एक्सप्लोरर के लिए <= v9

IE <= 9 कोर का समर्थन नहीं करता है। मैंने एक जावास्क्रिप्ट लिखी है जो स्वचालित रूप से उन अनुरोधों को एक प्रॉक्सी के माध्यम से रूट करेगा। यह सब 100% पारदर्शी है (आपको सिर्फ मेरी प्रॉक्सी और स्क्रिप्ट को शामिल करना है)।

Nuget का उपयोग करके इसे डाउनलोड corsproxyकरें और शामिल निर्देशों का पालन करें।

ब्लॉग पोस्ट | सोर्स कोड


8
गजब का! मैंने एमवीसी + यू को लव किया!
पायोत्र कुला

2
इस समाधान की शान में खौफ
BraveNewMath

3
यदि आप कॉर्स को अपने स्वयं के डोमेन तक सीमित करना चाहते हैं, तो आप विशिष्ट मूल को स्वीकार करने के लिए आसानी से विशेषता का विस्तार कर सकते हैं।
पेट्रस थेरॉन

2
आपको अपने App_Start \ FilterConfig में RegisterHttpFilters में इसे जोड़ने में सक्षम होना चाहिए सही? ऐसा करने से यह आपकी परियोजना के सभी Api नियंत्रकों पर लागू होगा। आप के ऊपर pate की टिप्पणी के साथ युग्मन आप सभी नियंत्रकों के लिए अपने डोमेन (ओं) को CORS सीमित कर सकते हैं।
bdwakefield

9
मैंने हाल ही में MVC 5 के लिए अपनी परियोजना को अद्यतन किया है और ऐसा करने का प्रयास किया है। यहां तक ​​कि एक फिल्टर में हेडर जोड़ने से काम नहीं लगता है। जब मैं नेटवर्क में अनुरोध देखता हूं तो हेडर प्रतिक्रिया पर मौजूद नहीं होता है। क्या कुछ और है जो इसे काम करने के लिए चाहिए?
क्नेमिन

121

यदि आप IIS 7+ का उपयोग कर रहे हैं, तो आप web.config फ़ाइल को इस सिस्टम के साथ फ़ोल्डर के मूल में रख सकते हैं ।webServer सेक्शन:

<httpProtocol>
   <customHeaders>
      <clear />
      <add name="Access-Control-Allow-Origin" value="*" />
   </customHeaders>
</httpProtocol>

देखें: http://msdn.microsoft.com/en-us/library/ms178685.aspx और: http://enable-cors.org/#how-iis7


1
मुझे याद नहीं है कि अब और क्यों, लेकिन यह तरीका हमेशा IIS 7+ में काम नहीं करता है
LaundroMatt

हम्म। केवल यही कारण है कि मुझे लगता है कि यह काम नहीं करेगा अगर एक गैर-कोर ब्राउज़र से एक अनुरोध उत्पन्न होता है। लेकिन मैं जांच करना जारी रखूंगा।
sellmeadog

29
इसके अलावा, यह पूरी वेबसाइट को कोर-फ्रेंडली बना देगा। यदि कोई व्यक्ति केवल एक क्रिया या नियंत्रक को कोर्स-फ्रेंडली के रूप में चिह्नित करना चाहता है, तो स्वीकृत उत्तर बहुत बेहतर है।
लेव दुबिनेट्स

1
यदि आप ASP.Net अनुभाग देखते हैं , तो इसमें एक संकेत है : "नोट: यह दृष्टिकोण IIS6, IIS7 क्लासिक मोड और IIS7 एकीकृत मोड के साथ संगत है।"
रात

1
जब मैं SharePoint वातावरण पर अपना ऐप प्रकाशित करता हूं तो मैं एक क्रॉस-डोमेन समस्या का सामना कर रहा हूं। जब मैं स्थानीय वातावरण पर अपना ऐप चलाता हूं तो मेरा ऐप ठीक चलता है, लेकिन जब मैं इसे अपने शेयर पॉइंट साइट पर प्रकाशित करता हूं तो यह Ajax.Begin फॉर्म कॉल में त्रुटि पृष्ठ पर रीडायरेक्ट करता है। मैंने इस समाधान की कोशिश की, लेकिन यह मेरे लिए काम नहीं करता है। क्या इसका कोई और विकल्प है?
ज्योत्सना वाधवानी

22

मैं एक समस्या में भाग गया, जहां ब्राउज़र ने सामग्री को परोसने से इनकार कर दिया था, जिसे कुकीज़ (जैसे, xhr के पास withCredentials=true) में अनुरोध पारित होने पर पुनः प्राप्त किया था , और साइट पर Access-Control-Allow-Originसेट कर दिया था *। (Chrome में त्रुटि यह थी, "क्रेडेंशियल ध्वज के सत्य होने पर Access-Control-Allow-Origin में वाइल्डकार्ड का उपयोग नहीं किया जा सकता है।"

@Jgauffin से उत्तर पर निर्माण, मैंने इसे बनाया, जो मूल रूप से उस विशेष ब्राउज़र सुरक्षा जांच के आसपास काम करने का एक तरीका है, इसलिए कैवेट एम्प्टर।

public class AllowCrossSiteJsonAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        // We'd normally just use "*" for the allow-origin header, 
        // but Chrome (and perhaps others) won't allow you to use authentication if
        // the header is set to "*".
        // TODO: Check elsewhere to see if the origin is actually on the list of trusted domains.
        var ctx = filterContext.RequestContext.HttpContext;
        var origin = ctx.Request.Headers["Origin"];
        var allowOrigin = !string.IsNullOrWhiteSpace(origin) ? origin : "*";
        ctx.Response.AddHeader("Access-Control-Allow-Origin", allowOrigin);
        ctx.Response.AddHeader("Access-Control-Allow-Headers", "*");
        ctx.Response.AddHeader("Access-Control-Allow-Credentials", "true");
        base.OnActionExecuting(filterContext);
    }
}

यह विशेष रूप से उपयोगी था, धन्यवाद।
cklimowski

15

यह वास्तव में सरल है, बस इसे web.config में जोड़ें

<system.webServer>
  <httpProtocol>
    <customHeaders>
      <add name="Access-Control-Allow-Origin" value="http://localhost" />
      <add name="Access-Control-Allow-Headers" value="X-AspNet-Version,X-Powered-By,Date,Server,Accept,Accept-Encoding,Accept-Language,Cache-Control,Connection,Content-Length,Content-Type,Host,Origin,Pragma,Referer,User-Agent" />
      <add name="Access-Control-Allow-Methods" value="GET, PUT, POST, DELETE, OPTIONS" />
      <add name="Access-Control-Max-Age" value="1000" />
    </customHeaders>
  </httpProtocol>
</system.webServer>

मूल में उन सभी डोमेन को डालें जो आपके वेब सर्वर तक पहुंच रखते हैं, हेडर में सभी संभावित हेडर डालते हैं जो किसी भी ajax http अनुरोध का उपयोग कर सकते हैं, विधियों में उन सभी विधियों को डालते हैं जिन्हें आप अपने सर्वर पर अनुमति देते हैं

सादर :)


यदि आप अधिकृत प्रश्नों का उपयोग करने का इरादा रखते हैं, तो एक्सेस-कंट्रोल-अनुमति-हेडर्स में "प्राधिकरण" जोड़ना भी उपयोगी हो सकता है।

9

कभी-कभी विकल्प क्रिया के साथ-साथ समस्याएं भी उत्पन्न होती हैं

बस: निम्नलिखित के साथ अपने web.config को अपडेट करें

<system.webServer>
    <httpProtocol>
        <customHeaders>
          <add name="Access-Control-Allow-Origin" value="*" />
          <add name="Access-Control-Allow-Headers" value="Origin, X-Requested-With, Content-Type, Accept" />
        </customHeaders>
    </httpProtocol>
</system.webServer>

और httpGet और httpOptions के साथ webservice / कंट्रोलर हेडर को अपडेट करें

// GET api/Master/Sync/?version=12121
        [HttpGet][HttpOptions]
        public dynamic Sync(string version) 
        {

BTW, साइटफिनिटी में आपको सुरक्षा अनुभाग में सिस्टम उन्नत सेटिंग्स में * जोड़ने की आवश्यकता है
बिशो हैना

वे कौन सी फाइलें हैं जिनमें मुझे नियंत्रक हेडर को अपडेट करने की आवश्यकता है?
user3281466

8

WebAPI 2 में अब CORS के लिए एक पैकेज है जिसका उपयोग करके स्थापित किया जा सकता है: Install-Package Microsoft.AspNet.WebApi.Cors -pre -project WebServic

एक बार यह स्थापित हो जाने के बाद, कोड के लिए इसका अनुसरण करें: http://www.asp.net/web-api/overview/security/en enable-cross-origin-requests-in-web-api


5

यदि आप एक एपीआई का उपयोग कर रहे हैं, तो इस विधि को अपनी विधि में जोड़ें।

HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "*"); 

4

यह ट्यूटोरियल बहुत उपयोगी है। एक त्वरित सारांश देने के लिए:

  1. Nuget पर उपलब्ध CORS पैकेज का उपयोग करें: Install-Package Microsoft.AspNet.WebApi.Cors

  2. अपने में WebApiConfig.csफ़ाइल, जोड़ने config.EnableCors()के लिए Register()विधि।

  3. कंट्रोलर को cors को हैंडल करने के लिए एक विशेषता जोड़ें:

[EnableCors(origins: "<origin address in here>", headers: "*", methods: "*")]


मुझे इस विधि का उपयोग करना पड़ा क्योंकि मुझे अपने अनुरोध में एक कस्टम हेडर सेट करने की आवश्यकता थी, और कस्टम विशेषता विधि ब्राउज़र पूर्व-उड़ान अनुरोध के साथ काम नहीं करती थी। यह सभी मामलों में काम करता है।
lehn0058

3
    public ActionResult ActionName(string ReqParam1, string ReqParam2, string ReqParam3, string ReqParam4)
    {
        this.ControllerContext.HttpContext.Response.Headers.Add("Access-Control-Allow-Origin","*");
         /*
                --Your code goes here --
         */
        return Json(new { ReturnData= "Data to be returned", Success=true }, JsonRequestBehavior.AllowGet);
    }

2

ऐसे विभिन्न तरीके हैं जिनसे हम एक्सेस-कंट्रोल-एक्सपोज़-हेडर्स पास कर सकते हैं।

  • जैसा कि jgauffin ने बताया है कि हम एक नई विशेषता बना सकते हैं।
  • जैसा कि LaundroMatt ने बताया है कि हम web.config फ़ाइल में जोड़ सकते हैं।
  • दूसरा तरीका यह है कि हम webApiconfig.cs फ़ाइल में नीचे जैसा कोड जोड़ सकते हैं।

    config.EnableCors (नया EnableCorsAttribute (" ", शीर्ष लेख: " ", विधियाँ: "*", उजागरहेडर्स: "TestHeaderToExpose") {SupportsCredentials = true};

या हम Global.Asax फ़ाइल में नीचे कोड जोड़ सकते हैं।

protected void Application_BeginRequest()
        {
            if (HttpContext.Current.Request.HttpMethod == "OPTIONS")
            {
                //These headers are handling the "pre-flight" OPTIONS call sent by the browser
                HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", "GET, POST, OPTIONS");
                HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "*");
                HttpContext.Current.Response.AddHeader("Access-Control-Allow-Credentials", "true");
                HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "http://localhost:4200");
                HttpContext.Current.Response.AddHeader("Access-Control-Expose-Headers", "TestHeaderToExpose");
                HttpContext.Current.Response.End();
            }
        }

मैंने इसे विकल्पों के लिए लिखा है। कृपया अपनी आवश्यकता के अनुसार इसे संशोधित करें।

हैप्पी कोडिंग !!


1

एक पूरी शाम के लिए संघर्ष करने के बाद आखिरकार मुझे यह काम करना पड़ा। कुछ डिबगिंग के बाद मुझे पता चला कि मैं जिस समस्या में चल रहा था, वह यह था कि मेरा क्लाइंट एक तथाकथित प्रीफ्लाइट ऑप्शन रिक्वेस्ट भेज रहा था ताकि यह जांचा जा सके कि आवेदन को मूल, विधियों और हेडर के साथ पोस्ट अनुरोध भेजने की अनुमति दी गई थी या नहीं। मैं Owin या APIController का उपयोग नहीं करना चाहता था, इसलिए मैंने खुदाई शुरू की और सिर्फ ActionFilterAttribute के साथ निम्नलिखित समाधान के साथ आया। विशेष रूप से "एक्सेस-कंट्रोल-अनुमति-हेडर्स" भाग बहुत महत्वपूर्ण है, क्योंकि वहाँ उल्लिखित हेडर को आपके अनुरोध भेजने वाले हेडर से मिलान करना होगा।

using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace MyNamespace
{
    public class AllowCrossSiteJsonAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            HttpRequest request = HttpContext.Current.Request;
            HttpResponse response = HttpContext.Current.Response;

            // check for preflight request
            if (request.Headers.AllKeys.Contains("Origin") && request.HttpMethod == "OPTIONS")
            {
                response.AppendHeader("Access-Control-Allow-Origin", "*");
                response.AppendHeader("Access-Control-Allow-Credentials", "true");
                response.AppendHeader("Access-Control-Allow-Methods", "GET, PUT, POST, DELETE");
                response.AppendHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, X-RequestDigest, Cache-Control, Content-Type, Accept, Access-Control-Allow-Origin, Session, odata-version");
                response.End();
            }
            else
            {
                HttpContext.Current.Response.Cache.SetCacheability(HttpCacheability.NoCache);
                HttpContext.Current.Response.Cache.SetNoStore();

                response.AppendHeader("Access-Control-Allow-Origin", "*");
                response.AppendHeader("Access-Control-Allow-Credentials", "true");
                if (request.HttpMethod == "POST")
                {
                    response.AppendHeader("Access-Control-Allow-Methods", "GET, PUT, POST, DELETE");
                    response.AppendHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, X-RequestDigest, Cache-Control, Content-Type, Accept, Access-Control-Allow-Origin, Session, odata-version");
                }

                base.OnActionExecuting(filterContext);
            }
        }
    }
}

अंत में, मेरी MVC एक्शन विधि इस तरह दिखती है। यहां महत्वपूर्ण विकल्प HttpVerbs का भी उल्लेख करना है, क्योंकि अन्यथा प्रीफ़लाइट अनुरोध विफल हो जाएगा।

[AcceptVerbs(HttpVerbs.Post | HttpVerbs.Options)]
[AllowCrossSiteJson]
public async Task<ActionResult> Create(MyModel model)
{
    return Json(await DoSomething(model));
}

0

Web.config में निम्न दर्ज करें

<system.webServer>
<httpProtocol>
  <customHeaders>
    <clear />     
    <add name="Access-Control-Allow-Credentials" value="true" />
    <add name="Access-Control-Allow-Origin" value="http://localhost:123456(etc)" />
  </customHeaders>
</httpProtocol>

0

यदि आप IIS का उपयोग करते हैं, तो मैं सुझाव दूंगा कि IIS CORS मॉड्यूल है
यह सभी प्रकार के नियंत्रकों के लिए कॉन्फ़िगर और काम करना आसान है।

यहाँ विन्यास का एक उदाहरण है:

    <system.webServer>
        <cors enabled="true" failUnlistedOrigins="true">
            <add origin="*" />
            <add origin="https://*.microsoft.com"
                 allowCredentials="true"
                 maxAge="120"> 
                <allowHeaders allowAllRequestedHeaders="true">
                    <add header="header1" />
                    <add header="header2" />
                </allowHeaders>
                <allowMethods>
                     <add method="DELETE" />
                </allowMethods>
                <exposeHeaders>
                    <add header="header1" />
                    <add header="header2" />
                </exposeHeaders>
            </add>
            <add origin="http://*" allowed="false" />
        </cors>
    </system.webServer>

0

मैं डॉटनेट कोर एमवीसी का उपयोग कर रहा हूं और कुछ घंटों के लिए नगेट पैकेज, स्टार्टअप.क, विशेषताओं और इस जगह से लड़ने के बाद, मैंने इसे एमवीसी एक्शन में जोड़ा है:

Response.Headers.Add("Access-Control-Allow-Origin", "*");

मुझे लगता है कि यह बहुत ही भद्दा है, लेकिन मुझे इसकी ज़रूरत है, और कुछ और नहीं जो उन हेडर को जोड़ना चाहते हैं। मैं उम्मीद करता हूं कि इससे किसी की मदद होगी!

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.