एमवीसी वेब एपी: अनुरोधित संसाधन पर कोई 'एक्सेस-कंट्रोल-अलाउंस-ओरिजिन' हेडर मौजूद नहीं है


128

मैंने वह सब कुछ आजमाया जो इस लेख में लिखा गया है: http://www.asp.net/web-api/overview/security/eneable-cross-origin-requests-in-web-api , लेकिन कुछ भी नहीं काम करता है। मैं angularJS का उपयोग करके किसी अन्य डोमेन में उपयोग करने के लिए webAPI2 (MVC5) से डेटा प्राप्त करने का प्रयास कर रहा हूं।

मेरा नियंत्रक इस तरह दिखता है:

namespace tapuzWebAPI.Controllers
{
    [EnableCors(origins: "http://local.tapuz.co.il", headers: "*", methods: "*", SupportsCredentials = true)]
    [RoutePrefix("api/homepage")]
    public class HomePageController : ApiController
    {
        [HttpGet]
        [Route("GetMainItems")]
        //[ResponseType(typeof(Product))]
        public List<usp_MobileSelectTopSecondaryItemsByCategoryResult> GetMainItems()
        {


            HomePageDALcs dal = new HomePageDALcs();
            //Three product added to display the data

            //HomePagePromotedItems.Value.Add(new HomePagePromotedItem.Value.FirstOrDefault((p) => p.ID == id));


            List<usp_MobileSelectTopSecondaryItemsByCategoryResult> items = dal.MobileSelectTopSecondaryItemsByCategory(3, 5);
            return items;

        }      
    }
}

1
इसके अलावा
cors

2
संभवतः उनके कोणीय कोड में कोई समस्या नहीं है क्योंकि अधिकांश CORS प्रोब्लम केवल सर्वर कॉन्फिग के कारण हैं
sam

मेरे पास एक ही तरह का सेटअप है, मैंने देखा कि जब मैं एपीआई पर एक गैर-मौजूदा कार्रवाई का अनुरोध करता हूं, और वेबएपी एक 404 लौटा रहा है, तो कॉर्स हेडर गायब है और ब्राउज़र शिकायत करेगा। तो, शायद यह उतना ही सरल है।
रॉबिन वैन डेर कन्नप

जवाबों:


296

आपको अपने Web Api में CORS को सक्षम करने की आवश्यकता है । कॉर्स को विश्व स्तर पर सक्षम करने का आसान और पसंदीदा तरीका निम्न को web.config में जोड़ना है

<system.webServer>
  <httpProtocol>
    <customHeaders>
      <add name="Access-Control-Allow-Origin" value="*" />
      <add name="Access-Control-Allow-Headers" value="Content-Type" />
      <add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE, OPTIONS" />
    </customHeaders>
  </httpProtocol>
</system.webServer>

कृपया ध्यान दें कि विधियाँ सभी व्यक्तिगत रूप से निर्दिष्ट हैं, उपयोग करने के बजाय *। ऐसा इसलिए है क्योंकि उपयोग करते समय एक बग होता है *

आप कोड द्वारा भी CORS को सक्षम कर सकते हैं ।

अद्यतन
निम्न NuGet पैकेज आवश्यक है Microsoft.AspNet.WebApi.Cors:।

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        config.EnableCors();

        // ...
    }
}

फिर आप [EnableCors]इस तरह की क्रियाओं या नियंत्रकों पर विशेषता का उपयोग कर सकते हैं

[EnableCors(origins: "http://www.example.com", headers: "*", methods: "*")]

या आप इसे विश्व स्तर पर पंजीकृत कर सकते हैं

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        var cors = new EnableCorsAttribute("http://www.example.com", "*", "*");
        config.EnableCors(cors);

        // ...
    }
}

आपको Options अनुरोधों के साथ प्रीफ़्लाइट अनुरोधों को संभालने की भी आवश्यकता है HTTP OPTIONS

Web APIOptionsयह पुष्टि करने के लिए अनुरोध का जवाब देने की आवश्यकता है कि यह वास्तव में समर्थन के लिए कॉन्फ़िगर किया गया है CORS

इसे संभालने के लिए, आपको बस एक खाली प्रतिक्रिया वापस भेजनी होगी । आप इसे अपने कार्यों के अंदर कर सकते हैं, या आप इसे विश्व स्तर पर इस तरह कर सकते हैं:

# Global.asax.cs
protected void Application_BeginRequest()
{
    if (Request.Headers.AllKeys.Contains("Origin") && Request.HttpMethod == "OPTIONS")
    {
        Response.Flush();
    }
}

यह अतिरिक्त जांच यह सुनिश्चित करने के लिए जोड़ी गई थी कि पुराने APIsको केवल स्वीकार करने के लिए डिज़ाइन किया गया था GETऔर POSTअनुरोधों का शोषण नहीं किया जाएगा। जब यह क्रिया मौजूद नहीं थी, तो DELETEकिसी APIडिज़ाइन के लिए अनुरोध भेजने की कल्पना करें । परिणाम अप्रत्याशित है और परिणाम खतरनाक हो सकते हैं ।


4
आपके जवाब से मुझे मदद मिली। मैंने कोड बेस सॉल्यूशंस के साथ सब कुछ करने की कोशिश की थी। जब तक मैंने आपका उत्तर नहीं पढ़ा, मैंने web.config विकल्प की कोशिश नहीं की। यह एकमात्र ऐसा काम था। कोई विचार क्यों? मैं ओडटा के साथ वेब एपीआई 2 का उपयोग कर रहा हूं। फिर भी धन्यवाद! :)
फेलिप कोर्रिया

1
भविष्य के संदर्भ के लिए, आपको इसके लिए आवश्यक NuGet पैकेज "Microsoft.AspNet.WebApi.Cors" है।
BrainSlugs83

2
मैंने आपके सभी उत्तर का पालन किया है और मेरे पास दो प्रश्न हैं: Application_BeginRequest () को कहां आमंत्रित किया जाना चाहिए? और दूसरा, एक ही विधि में, .Contains ("उत्पत्ति") वास्तव में मुझ पर संकलन नहीं करता है, जहां यह विधि String.Contains, या Linq.Contains से है?
meJustAndrew

2
एक अलग पोर्ट को याद रखें # एक अलग डोमेन बनाता है, जो एक गोच हो सकता है। foo.com foo.com:8080
RyBolt

2
तुम मेरी जान बचाओ;)
पवेल ग्रोस्की

26

@ मिहाई-आंद्रेई डिनकुलेस्कु का उत्तर सही है, लेकिन खोजकर्ताओं के लाभ के लिए, एक सूक्ष्म बिंदु भी है जो इस त्रुटि का कारण बन सकता है।

आपके URL के अंत में एक '/' जोड़ने से EnableCors सभी उदाहरणों में काम करना बंद कर देगा (जैसे होमपेज से)।

यानी यह काम नहीं करेगा

var cors = new EnableCorsAttribute("http://testing.azurewebsites.net/", "*", "*");
config.EnableCors(cors);

लेकिन यह काम करेगा:

var cors = new EnableCorsAttribute("http://testing.azurewebsites.net", "*", "*");
config.EnableCors(cors);

इनेबलर्स एट्रिब्यूट का उपयोग करने पर प्रभाव समान है।


धन्यवाद!! यह मददगार था।
अंकित सहरावत

23

मैंने मिहाई-आंद्रेई डिनकुलस्कु द्वारा इंगित उपरोक्त सभी चरणों का पालन किया ।
लेकिन मेरे मामले में, मुझे 1 और चरण की आवश्यकता थी क्योंकि http विकल्प वेब में अक्षम था। नीचे दिए गए लाइन द्वारा।

<remove name="OPTIONSVerbHandler" />

मैंने अभी इसे Web.Config से हटा दिया (बस इसे नीचे की तरह टिप्पणी करें) और कॉर्स एक आकर्षण की तरह काम करता है

<handlers>
  <!-- remove name="OPTIONSVerbHandler" / -->
</handlers>

9

यह कोर्स नगेट पैकेजों की स्थापना के कारण हो सकता है।

यदि आप nuget से cors को स्थापित करने और enabaling करने के बाद समस्या का सामना कर रहे हैं, तो आप वेब Api को पुन: स्थापित करने का प्रयास कर सकते हैं।

पैकेज मैनेजर से, भागो Update-Package Microsoft.AspNet.WebApi -reinstall


मेरे लिए बिल्कुल यही था। मैंने System.Web.Http.Cors स्थापित किया और फिर अनइंस्टॉल किया, जिसने 5.2.2 और 5.2.3 के बीच गलत (नए अपग्रेड) संस्करण पर WebApi को छोड़ दिया
TaeKwonJoe

7

यह सुनिश्चित करने के लिए प्रयास करें कि आपने CORS को सही तरीके से कॉन्फ़िगर किया है:

[EnableCors(origins: "*", headers: "*", methods: "*")]

अभी भी काम नहीं कर रहा है? HTTP हेडर उपस्थिति की जाँच करें।


यह जाँचने के लिए कि क्या इसका कार्य, इसके बेहतर समर्थन को हटाने के लिए बेहतर है, साथ ही यह कुछ निश्चित परिस्थितियों में
cors

सबसे अच्छा जवाब क्योंकि मैं अपनी पूरी साइट के लिए कॉर्स को सक्षम नहीं करना चाहता, बस कुछ निश्चित समापन बिंदु हैं। config.EnableCors()इसके लिए भी आवश्यक है।
Csaba Toth

4

किसी भी CORS प्रोटोकॉल को काम करने के लिए, आपको प्रत्येक समापन बिंदु (या इस विधि के साथ एक वैश्विक फ़िल्टर) पर एक विकल्प विधि की आवश्यकता होगी जो उन शीर्ष लेखों को वापस कर देगा:

Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET, POST, PUT, DELETE
Access-Control-Allow-Headers: content-type

कारण यह है कि ब्राउज़र आपके सर्वर पर 'परीक्षण' करने के लिए पहले एक ऑप्शन भेजता है और प्राधिकरणों को देखता है


2

मैं cors के बारे में अगला मामला पकड़ता हूं। शायद यह किसी के लिए उपयोगी होगा। यदि आप अपने सर्वर में 'WebDav Redirector' फीचर जोड़ते हैं, तो PUT और DELETE अनुरोध विफल हो जाते हैं।

तो, आपको अपने IIS सर्वर से 'WebDAVModule' निकालना होगा:

  • "IIS मॉड्यूल कॉन्फ़िगरेशन में, WebDAVModule को लूप करें, यदि आपके वेब सर्वर में यह है, तो इसे हटा दें"।

या अपने विन्यास में जोड़ें:

<system.webServer>
<modules>
  <remove name="WebDAVModule"/>
</modules>
<handlers>
  <remove name="WebDAV" />
  ...
</handlers>


2

मुझे पता है कि मैं बहुत देर से आ रहा हूं। हालाँकि, किसी के लिए भी जो खोज रहा है, मुझे लगा कि मैं प्रकाशित करूँगा कि मेरे लिए क्या काम किया। मैं यह दावा नहीं कर रहा हूं कि यह सबसे अच्छा समाधान है - केवल यह काम किया।

हमारी WebApi सेवा config.EnableCors (corsAttribute) पद्धति का उपयोग करती है। हालाँकि, इसके साथ भी, यह अभी भी प्री-फ़्लाइट अनुरोधों पर विफल होगा। @ मिहाई-आंद्रेई डिनकुलस्कू के जवाब ने मेरे लिए सुराग प्रदान किया। सबसे पहले, मैंने विकल्प अनुरोधों को फ्लश करने के लिए अपने Application_BeginRequest () कोड को जोड़ा। वह काम मेरे लिए काम नहीं किया। मुद्दा यह है कि वेबएपीआई अभी भी किसी भी अपेक्षित हेडर को विकल्प अनुरोध में नहीं जोड़ रहा है। अकेले इसे फ्लश करने से काम नहीं चला - लेकिन इसने मुझे एक विचार दिया। मैंने कस्टम हेडर जोड़े हैं जो अन्यथा web.config के माध्यम से विकल्प अनुरोध के जवाब में जोड़े जाएंगे। यहाँ मेरा कोड है:

protected void Application_BeginRequest()
{
  if (Request.Headers.AllKeys.Contains("Origin") && Request.HttpMethod == "OPTIONS")
  {
    Response.Headers.Add("Access-Control-Allow-Origin", "https://localhost:44343");
    Response.Headers.Add("Access-Control-Allow-Headers",
      "Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With");
    Response.Headers.Add("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
    Response.Headers.Add("Access-Control-Allow-Credentials", "true");
    Response.Flush();
  }
}

जाहिर है, यह केवल विकल्प अनुरोधों पर लागू होता है। अन्य सभी क्रियाएं कॉर्स कॉन्फ़िगरेशन द्वारा नियंत्रित की जाती हैं। यदि इसके लिए एक बेहतर दृष्टिकोण है, तो मैं सभी कान हूँ। यह मेरे लिए एक धोखा की तरह लगता है और अगर हेडर स्वचालित रूप से जोड़े जाते हैं तो मैं पसंद करूंगा, लेकिन यह वही है जो आखिरकार काम करता है और मुझे आगे बढ़ने की अनुमति देता है।


1

@ मिहाई-आंद्रेई डिनकुलस्कु के जवाब ने मेरे लिए काम किया, जैसे:

  • <httpProtocol>Web.config के <system.webServer>सेक्शन में जोड़ना
  • OPTIONSउल्लिखित के माध्यम से अनुरोधों के लिए खाली प्रतिक्रिया लौटाता Application_BeginRequest()हैglobal.asax

सिवाय इसके कि उसके चेक Request.Headers.AllKeys.Contains("Origin")ने मेरे लिए काम नहीं किया, क्योंकि अनुरोध में एक था origing, इसलिए लोअरकेस के साथ। मुझे लगता है कि मेरा ब्राउज़र (क्रोम) इसे कोरस अनुरोधों के लिए इस तरह भेजता है।

मैंने इसके बजाय उसकी जाँच के असंवेदनशील रूप का एक केस का उपयोग करके इसे थोड़ा और उदारतापूर्वक हल Containsकिया: if (culture.CompareInfo.IndexOf(string.Join(",", Request.Headers.AllKeys), "Origin", CompareOptions.IgnoreCase) >= 0) {


0

यदि आपके पास अपने web.config में सिक्योरिटी \ requestFiltering नोड्स हैं:

<security>
  <requestFiltering>
    <verbs allowUnlisted="false">
      <add verb="GET" allowed="true" />
      <add verb="POST" allowed="true" />
      <add verb="PUT" allowed="true" />
      <add verb="DELETE" allowed="true" />
      <add verb="DEBUG" allowed="true" />          
    </verbs>
  </requestFiltering>

सुनिश्चित करें कि आप इसे भी जोड़ते हैं

<add verb="OPTIONS" allowed="true" />

0

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

फ़ाइल में WebApiConfig फ़ोल्डर में App_Start , कोड की सभी पंक्तियों टिप्पणी और निम्नलिखित कोड जोड़ें:

`public static void Register(HttpConfiguration config)
    {
        // Web API configuration and services
        config.EnableCors();
        var enableCorsAttribute = new EnableCorsAttribute("*",
                                           "Origin, Content-Type, Accept",
                                           "GET, PUT, POST, DELETE, OPTIONS");
        config.EnableCors(enableCorsAttribute);
        // Web API routes
        config.MapHttpAttributeRoutes();

        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            //routeTemplate: "api/{controller}/{id}",
            routeTemplate: "api/{controller}/{action}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
        config.Formatters.Add(new BrowserJsonFormatter());
    }

    public class BrowserJsonFormatter : JsonMediaTypeFormatter
    {
        public BrowserJsonFormatter()
        {
            this.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html"));
            this.SerializerSettings.Formatting = Formatting.Indented;
        }

        public override void SetDefaultContentHeaders(Type type, HttpContentHeaders headers, MediaTypeHeaderValue mediaType)
        {
            base.SetDefaultContentHeaders(type, headers, mediaType);
            headers.ContentType = new MediaTypeHeaderValue("application/json");
        }
    }`

0

मुझे पता है कि लोगों को यह पहली बार में बहुत स्पष्ट लगेगा, लेकिन वास्तव में इस बारे में सोचें। ऐसा अक्सर हो सकता है यदि आपने कुछ गलत किया है।

उदाहरण के लिए, मुझे यह समस्या हुई है क्योंकि मैंने अपनी होस्ट फ़ाइल में होस्ट प्रविष्टि नहीं जोड़ी है। असली समस्या DNS रिज़ॉल्यूशन की थी। या मुझे बस आधार URL गलत मिला है।

कभी-कभी मुझे यह त्रुटि मिलती है यदि पहचान टोकन एक सर्वर से आया था, लेकिन मैं इसे दूसरे पर उपयोग करने का प्रयास कर रहा हूं।

यदि आपको संसाधन गलत मिला है तो कभी-कभी आपको यह त्रुटि मिलेगी।

यदि आप श्रृंखला में बहुत देर कर देते हैं तो आपको यह मिल सकता है।


0

कॉर्स को सक्षम करने वाले कई स्थानों से बचें, जैसे WebApiCOnfig.cs, GrantResourceOwnerCredentials विधि प्रदाता और नियंत्रक शीर्ष लेख विशेषता आदि में। नीचे दी गई सूची है जो एक्सेस कंट्रोल अनुमति उत्पत्ति का कारण भी है।

  1. वेब DB के साथ बातचीत में ट्रूबल है जो आपने उपयोग किया था।
  2. एडब्ल्यूएस क्लाउड यदि वेब एपीआई और डीबी के वीपीसी अलग-अलग हैं।

नीचे कोड अधिक है तो एक्सेस कंट्रोल को ठीक करने के लिए पर्याप्त है। // सुनिश्चित करें कि app.UseCors कॉन्फ़िगरेशन की कोड लाइन के ऊपर होना चाहिए।

   public partial class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
            //All other configurations
        }
    }

इससे मेरी समस्या धीमी हो गई।


0

यह समस्या तब होती है जब आप किसी भिन्न डोमेन या भिन्न पोर्ट से एक्सेस करने का प्रयास करते हैं।

यदि आप विजुअल स्टूडियो का उपयोग कर रहे हैं, तो टूल्स> नुगेट पैकेज मैनेजर> पैकेज मैनेजर कंसोल पर जाएं। वहां आपको NuGet Package Microsoft.AspNet.WebApi.Cors स्थापित करना होगा

Install-Package Microsoft.AspNet.WebApi.Cors

फिर, PROJECT> App_Start> WebApiConfig में, CORS सक्षम करें

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        
        //Enable CORS. Note that the domain doesn't have / in the end.
        config.EnableCors(new EnableCorsAttribute("https://tiagoperes.eu",headers:"*",methods:"*"));

        ....

    }
}

एक बार सफलतापूर्वक स्थापित हो जाने पर, समाधान का निर्माण करें और इसे पर्याप्त होना चाहिए

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