'पहुंच-नियंत्रण-अनुमति-उत्पत्ति' शीर्षक में कई मान हैं


104

मैं सर्वर पक्ष पर ASP.NET वेब API एप्लिकेशन के समापन बिंदु तक पहुंचने के लिए क्लाइंट पक्ष पर AngularJS $ http का उपयोग कर रहा हूं। चूंकि क्लाइंट को सर्वर के रूप में एक अलग डोमेन पर होस्ट किया जाता है, मुझे CORS की आवश्यकता होती है। यह $ http.post (url, data) के लिए काम करता है। लेकिन जैसे ही मैं उपयोगकर्ता को प्रमाणित करता हूं और $ http.get (url) के माध्यम से अनुरोध करता हूं, मुझे संदेश मिलता है

'एक्सेस-कंट्रोल-अलाउंस-ओरिजिन' हेडर में कई मान शामिल हैं 'http://127.0.0.1:9000, http://127.0.0.1:9000', लेकिन केवल एक की अनुमति है। उत्पत्ति 'http://127.0.0.1:9000' इसलिए पहुंच की अनुमति नहीं है।

फिडलर मुझे दिखाता है कि सफल विकल्प के अनुरोध के बाद प्राप्त अनुरोध में वास्तव में दो हेडर प्रविष्टियां हैं। मैं क्या और कहाँ कुछ गलत कर रहा हूँ?

अपडेट करें

जब मैं $ http.get के बजाय jQuery $ .get का उपयोग करता हूं, तो वही त्रुटि संदेश प्रकट होता है। इसलिए यह एंगुलरजेएस के साथ कोई समस्या नहीं है। लेकिन यह गलत कहां है?


खैर, हेडर में क्या है?
Eckes

जवाबों:


53

मैंने कहा

config.EnableCors(new EnableCorsAttribute(Properties.Settings.Default.Cors, "", ""))

साथ ही साथ

app.UseCors(CorsOptions.AllowAll);

सर्वर पर। यह दो हेडर प्रविष्टियों में परिणाम है। बस बाद वाले का उपयोग करें और यह काम करता है।


4
ऐसा लगता है जैसे आप एक सेटिंग फ़ाइल से Properties.Settings.Default.Cors पढ़ रहे हैं। क्या आप एक उदाहरण पोस्ट कर सकते हैं? और UseCors किस वर्ग में है?
हॉपी

"बिना पढ़ा हुआ संदर्भ: EnableCorsAttribute परिभाषित नहीं है" ??
सर्किट्री

@ देखें, कृपया msdn.microsoft.com/en-us/library/dn314597(v=vs.118).aspx पर एक नज़र डालें । यह बताता है, कि EnableCorsAttribute का पहला पैरामीटर अनुमत मूल है। उदाहरण के लिए "*" सभी को अनुमति देने के लिए।
पापा मफलन

1
@Hoppe, UseCors NuGet पैकेज Microsoft.Owin.Cors में परिभाषित एक विस्तार विधि है। Sf katanaproject.codeplex.com/SourceControl/latest#src/…
पापा मफलन

7
config.EnableCors (enableCorsAttribute) को आमतौर पर WebApiConfig.cs में कहा जाता है - यह Microsoft.AspNet.WebApi.Cors Nuget पैकेज का हिस्सा है, जिसके उपयोग का वर्णन यहां किया गया है: asp.net/web-api/overview/security/… ऐप .UseCors (CorsOptions.AllowAll) को आमतौर पर Startup.Auth.cs में अपने पहचान प्रदाता (जैसे OAuth) को कॉन्फ़िगर करने के भाग के रूप में कहा जाता है, और Microsoft.Owin.Cors Nuget पैकेज का हिस्सा है।
हेनरी सी

51

हम इस समस्या में भाग गए क्योंकि हमने सबसे अच्छे अभ्यास के अनुसार कोर्स की स्थापना की थी (जैसे http://www.asp.net/web-api/overview/security/en enable-cross-origin-requests-in-web-api ) ... ALSO <add name="Access-Control-Allow-Origin" value="*"/>में web.config में एक कस्टम हेडर था।

Web.config प्रविष्टि निकालें, और सब कुछ ठीक है।

@ Mww के उत्तर के विपरीत, हमारे पास अभी भी WebApiConfig.cs EnableCors()और EnableCorsAttributeनियंत्रक पर है। जब हमने एक या दूसरे को निकाला, तो हम अन्य मुद्दों में भाग गए।


11
मैंने इस लाइन को हटा दिया <add name = "Access-Control-Allow-Origin" मान = "*"> और मेरे पास web.config फ़ाइल में निम्नलिखित दो प्रविष्टियाँ थीं जिन्हें मैंने नहीं हटाया: <add name = "Access -Control-Allow-Headers "value =" Content-Type "/> <add name =" Access-Control-allow-Methods "value =" GET, POST, PUT, DELETE, OPTIONS "/>
शिव कार्तिकेयन

2
यह कुंजी है, आपको केवल एक बार CORS को सक्षम करना होगा, मेरा मुद्दा यह था कि मैंने इसे अपने web.config के साथ-साथ app.UseCors () में भी सक्षम किया था ... मैंने web.config प्रविष्टि को हटा दिया और बस app का उपयोग किया। UCCors (Microsoft.Owin.Cors.CorsOptions.AllowAll); इसके बजाय विधि।
मोहम्मद सिपाहीवंद

1
ऊपर की लाइन ने मेरी जान बचा ली! सुनिश्चित करें कि आप CORS को एक से अधिक बार सक्षम नहीं करते हैं, अन्यथा यह हो जाएगा और आप बहुत निराश हो जाएंगे।
तगरेट

वेब से <add name = "Access-Control-Allow-Headers" value = "Content-Type" /> को हटा दिया। मेरे लिए तय किया गया
jbooker

1
"यह महत्वपूर्ण है, आपको केवल एक बार कॉर्स को सक्षम करना होगा" - यह आईटी @ मोहम्मदसेपावंद धन्यवाद है। .NET पर वापस जाएं और पहले से ही आश्चर्यचकित: D
तुआन जिन

42

मैं Cors 5.1.0.0 का उपयोग कर रहा हूं, बहुत अधिक सिरदर्द के बाद, मैंने सर्वर से डुप्लिकेट एक्सेस-कंट्रोल-अलाउंस-ओरिजिन एंड एक्सेस-कंट्रोल-एलाउंस-हेडर हेड होने की बात की।

config.EnableCors()WebApiConfig.cs फ़ाइल से हटा दिया गया और केवल [EnableCors("*","*","*")]नियंत्रक वर्ग पर विशेषता सेट करें

अधिक विस्तार के लिए इस लेख की जाँच करें


यह मेरे लिए काम करता है, बस यह सुनिश्चित करें कि आप इस तरह से एक और सेट नहीं कर रहे हैं <add name = "Access-Control-Allow-
Origin-

12

WebApiConfig में रजिस्टर करें

var cors = new EnableCorsAttribute("*", "*", "*");
config.EnableCors(cors);

या web.config

<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" />
<add name="Access-Control-Allow-Credentials" value="true" />
</customHeaders>  
</httpProtocol>

लेकिन नहीं


2
यह मेरे लिए महत्वपूर्ण समाधान था, दोनों मत करो।
3

8

वास्तव में आप कई हेडर सेट नहीं कर सकते Access-Control-Allow-Origin(या कम से कम यह सभी ब्राउज़रों में काम नहीं करेगा)। इसके बजाय आप सशर्त रूप से एक पर्यावरण चर सेट कर सकते हैं और फिर इसे Headerनिर्देश में उपयोग कर सकते हैं :

SetEnvIf Origin "^(https?://localhost|https://[a-z]+\.my\.base\.domain)$" ORIGIN_SUB_DOMAIN=$1
Header set Access-Control-Allow-Origin: "%{ORIGIN_SUB_DOMAIN}e" env=ORIGIN_SUB_DOMAIN

इसलिए इस उदाहरण में प्रतिक्रिया शीर्षलेख तभी जोड़ा जाएगा जब अनुरोध शीर्षलेख OriginRegExp से मेल खाता हो: ^(https?://localhost|https://[a-z]+\.my\.base\.domain)$(इसका मूल अर्थ HTTP या HTTPS पर स्थानीयहोस्ट है और HTTPS पर * .my.base.domain है)।

setenvifमॉड्यूल को सक्षम करने के लिए याद रखें ।

डॉक्स:

Btw। }eमें %{ORIGIN_SUB_DOMAIN}eलिखने में कोई त्रुटि नहीं है। यह है कि आप Headerनिर्देशन में पर्यावरण चर का उपयोग कैसे करते हैं ।


1
क्या आपके पास कई एक्सेस कंट्रोल हेडर सेट नहीं करने का स्रोत है? मुझे ऐसा कुछ नहीं मिला जो इसकी पुष्टि करता हो।
स्पेंसर

बहुत स्मार्ट और साफ समाधान। मेरे लिए काम किया।
एलेक्स कलमिकोव

@ स्पेंसर "नोट: व्यवहार में मूल-सूची या अशक्त उत्पादन अधिक विवश है। अंतरिक्ष की अलग-अलग सूची की अनुमति देने के बजाय, यह या तो एक मूल या स्ट्रिंग" अशक्त "है ।" w3.org/TR/cors/#access-control-allow-origin-response-header
Nux

8

मैं भी दोनों OWIN के साथ ही मेरे WebAPI था कि दोनों जाहिरा तौर पर जरूरत CorS अलग जो बदले में 'Access-Control-Allow-Origin' header contains multiple valuesत्रुटि पैदा सक्षम होना चाहिए ।

मैंने उन सभी कोड को हटा दिया जो कि CORS को सक्षम करते हैं और फिर system.webServerअपने वेब के नोड में निम्नलिखित को जोड़ते हैं। Config:

<httpProtocol>
  <customHeaders>
    <add name="Access-Control-Allow-Origin" value="https://stethio.azurewebsites.net" />
    <add name="Access-Control-Allow-Methods" value="GET, POST, OPTIONS, PUT, DELETE" />
    <add name="Access-Control-Allow-Headers" value="Origin, X-Requested-With, Content-Type, Accept, Authorization" />
  </customHeaders>
</httpProtocol>

OWIN (लॉग इन में अनुमति देने के लिए) और WebAPI (API कॉल की अनुमति) के लिए इस संतुष्ट कॉर्स आवश्यकताओं को करना, लेकिन इसने एक नई समस्या पैदा की: OPTIONSमेरे एपीआई कॉल के लिए प्रीफ़्लाइट के दौरान एक विधि नहीं मिल सकी। उस के लिए फिक्स सरल था - मुझे केवल handlersअपने वेब नोड से निम्नलिखित को हटाने की आवश्यकता थी। कॉन्फिग:

<remove name="OPTIONSVerbHandler" />

आशा है कि यह किसी की मदद करता है।


7

अपाचे सर्वर:

मैं वही खर्च करता हूं, लेकिन यह इसलिए था क्योंकि मेरी फ़ाइल में कोई उद्धरण चिह्न (") नहीं था, जो सर्वर तक पहुंच प्रदान करता था, जैसे '.htaccess।'

Header add Access-Control-Allow-Origin: * 
Header add Access-Control-Allow-Origin "*" 

आपके पास किसी अन्य फ़ोल्डर में एक फ़ाइल '.htaccess' भी हो सकती है

/ 
- .htaccess 
- public_html / .htaccess (problem here)

आपके मामले में '*' के बजाय तारांकन आईपी ( http://127.0.0.1:9000) सर्वर होगा जो आप डेटा की सेवा करने की अनुमति देते हैं।

ASP.NET:

जांचें कि आपके कोड में कोई 'एक्सेस-कंट्रोल-अलाउंस-ओरिजिन' डुप्लिकेट नहीं है।

डेवलपर उपकरण:

Chrome से आप अपने अनुरोध शीर्षलेख सत्यापित कर सकते हैं। F12 कुंजी दबाएं और 'नेटवर्क' टैब पर जाएं, अब AJAX अनुरोध चलाएं और सूची में दिखाई देंगे, क्लिक करें और सभी जानकारी दें।

प्रवेश-नियंत्रण-अनुमति-उत्पत्ति: *


कभी-कभी इसका यह आसान ... IIS / Chrome पर चलने के लिए उन भ्रमित वेब सेवा को प्राप्त करने का प्रयास करते समय मैंने Application_BeginRequest विधि के साथ चारों ओर खेला, और इसके बारे में भूल गया ... मेरे अपने कोड में दोहराव! मुझे स्पष्ट की ओर इशारा करने के लिए धन्यवाद! :)
Juergen Riemer

2
कॉर्स प्रतिक्रिया हेडर प्राप्त करने के लिए, आपको वास्तविक क्रॉस-ऑरिजिन रिक्वेस्ट का अनुकरण भी करना होगा, इसलिए यदि आप सिर्फ रनिंग साइट पर नेटवर्क टैब को देखते हैं तो यह प्रकट नहीं हो सकता है। हालाँकि, आपके AJAX अनुरोध को चलाने के लिए DHC ( chrome.google.com/webstore/detail/dhc-resthttp-api-client/… ) जैसी किसी चीज़ का उपयोग करना तकनीकी रूप से एक अलग डोमेन से कॉल करना होगा, इस प्रकार कॉर्स को ट्रिगर करने और आपको देखने की अनुमति देगा। एक्सेस कंट्रोल हेडर।
हेनरी सी

4

ऐसा तब होता है जब आपके पास कई स्थानों पर कॉर्स विकल्प कॉन्फ़िगर होता है। मेरे मामले में मेरे पास यह नियंत्रक स्तर के साथ-साथ Startup.Auth.cs / ConfigureAuth में था।

मेरी समझ यह है कि यदि आप इसे व्यापक रूप से लागू करना चाहते हैं, तो बस इसे Startup.Auth.cs / कॉन्फ़िगर कॉन्फ़िगर के तहत कॉन्फ़िगर करें ... आपको Microsoft.Owin.Cors के संदर्भ की आवश्यकता होगी

public void ConfigureAuth(IAppBuilder app)
        {
          app.UseCors(CorsOptions.AllowAll);

यदि आप इसे नियंत्रक स्तर पर रखते हैं, तो आप नियंत्रक स्तर पर सम्मिलित कर सकते हैं।

[EnableCors("http://localhost:24589", "*", "*")]
    public class ProductsController : ApiController
    {
        ProductRepository _prodRepo;

मेरे मामले में मैंने इसे Web.Config और MyAppApiConfig.cs दोनों में सेट किया था। बाद में इसे हटाने से मेरे लिए समस्या हल हो गई।
जिम बी

4

यदि आप IIS में हैं, तो आपको web.config में CORS को सक्रिय करने की आवश्यकता है, तो आपको App_Start / WebApiConfig.cs रजिस्टर विधि में सक्षम करने की आवश्यकता नहीं है

मेरा समाधान था, यहाँ लाइनों पर टिप्पणी की:

// Enable CORS
//EnableCorsAttribute cors = new EnableCorsAttribute("*", "*", "*");
//config.EnableCors(cors);

और web.config में लिखें:

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


2

यह निश्चित रूप से भी हो सकता है यदि आपने वास्तव में अपने Access-Control-Allow-Originहेडर को कई मान रखने के लिए सेट किया है - उदाहरण के लिए, अल्पविराम द्वारा अलग की गई मानों की सूची, जो कि RFC में समर्थित है लेकिन वास्तव में अधिकांश प्रमुख ब्राउज़रों द्वारा समर्थित नहीं है। ध्यान दें कि RFC '*' का उपयोग किए बिना एक से अधिक डोमेन की अनुमति देने के बारे में बात करता है

उदाहरण के लिए, आप क्रोम जैसी हेडर का उपयोग करके उस त्रुटि को प्राप्त कर सकते हैं:

Access-Control-Allow-Origin: http://test.mysite.com, http://test2.mysite.com

में था Chrome Version 64.0.3282.186 (Official Build) (64-bit)

ध्यान दें कि यदि आप CDN के कारण इस पर विचार कर रहे हैं, और आप अकामाई का उपयोग करते हैं, तो आप यह नोट करना चाह सकते हैं कि अकामाई सर्वर पर कैश नहीं करेगा यदि आप उपयोग करते हैं Vary:Origin , तो कई इस समस्या को हल करने का सुझाव देते हैं।

आपको शायद "कैश आईडी संशोधन" प्रतिक्रिया व्यवहार का उपयोग करके अपनी कैश कुंजी को बदलना होगा। इस संबंधित StackOverflow प्रश्न में इस मुद्दे पर अधिक जानकारी


इसलिए मूल रूप से, आप अभी नहीं कर सकते क्योंकि यह संदिग्ध है कि आप इंटरनेट पर हर एक डोमेन को यूआरएल हिट करना चाहते हैं।
स्काउटचेल

अकामाई लिंक को लॉग इन करने की आवश्यकता है।
जीन-फ्रांस्वा सवार्ड

हाँ जो उन डॉक्स के लिए एक अकामाई आवश्यकता प्रतीत होता है;
ब्रैड पार्क्स

Chrome में इस त्रुटि को प्राप्त करने का एक अन्य तरीका मानों की एक अलग-अलग सूची के साथ है Access-Control-Allow-Origin: http://test.mysite.com http://test2.mysite.com:। यही कारण है कि होगा सही तरीका हो सकता है, लेकिन ब्राउज़र मानक यहाँ (का पालन नहीं करते स्रोत )।
तानूस 12

2

इतना बेवकूफ और सरल:

यह समस्या मेरे लिए तब हुई जब Header always set Access-Control-Allow-Origin *मेरी अपाचे कॉन्फिगर फाइल के अंदर दो बार । एक बार VirtualHostटैग के साथ और एक बार Limitटैग के अंदर :

<VirtualHost localhost:80>
  ...
  Header set Access-Control-Allow-Origin: *
  ...
  <Limit OPTIONS>
    ...
    Header set Access-Control-Allow-Origin: *
    ...
  </Limit>
</VirtualHost>

एक प्रविष्टि को हटाने से समस्या हल हो गई।

मुझे लगता है कि मूल पोस्ट में यह दो बार होगा:

Header set Access-Control-Allow-Origin: "http://127.0.0.1:9000"

1

बस एक नोडज सर्वर के साथ यह समस्या थी।

यहाँ है कि मैं इसे कैसे तय किया।
मैं अपने नोड सर्वर को एक के माध्यम से चलाता हूं nginx proxyऔर मैं nodeदोनों को nginx सेट करता हूं allow cross domain requestsऔर यह ऐसा नहीं करता है इसलिए मैंने इसे nginx से हटा दिया और इसे नोड में छोड़ दिया और सब कुछ ठीक हो गया।


इस उत्तर के लिए धन्यवाद! यह एक समस्या को हल करता है जिसे मैं एक लंबे समय तक nginx + रैक (रूबी) सेटअप के साथ हल नहीं कर सकता था। एक ही मुद्दा, एक ही समाधान: हेडेक परिवर्धन को नेनेक्स में बंद करें, और rack-corsमणि को कॉर्स सामान को संभालने दें । बाम, तय।
पिस्तोस

0

मैंने एक ही मुद्दे का सामना किया है और यही मैंने इसे हल करने के लिए किया है:

WebApi सेवा में, Global.asax के अंदर मैंने निम्नलिखित कोड लिखा है:

Sub Application_BeginRequest()
        Dim currentRequest = HttpContext.Current.Request
        Dim currentResponse = HttpContext.Current.Response

        Dim currentOriginValue As String = String.Empty
        Dim currentHostValue As String = String.Empty

        Dim currentRequestOrigin = currentRequest.Headers("Origin")
        Dim currentRequestHost = currentRequest.Headers("Host")

        Dim currentRequestHeaders = currentRequest.Headers("Access-Control-Request-Headers")
        Dim currentRequestMethod = currentRequest.Headers("Access-Control-Request-Method")

        If currentRequestOrigin IsNot Nothing Then
            currentOriginValue = currentRequestOrigin
        End If

        If currentRequest.Path.ToLower().IndexOf("token") > -1 Or Request.HttpMethod = "OPTIONS" Then
            currentResponse.Headers.Remove("Access-Control-Allow-Origin")
            currentResponse.AppendHeader("Access-Control-Allow-Origin", "*")
        End If

        For Each key In Request.Headers.AllKeys
            If key = "Origin" AndAlso Request.HttpMethod = "OPTIONS" Then
                currentResponse.AppendHeader("Access-Control-Allow-Credentials", "true")
                currentResponse.AppendHeader("Access-Control-Allow-Methods", currentRequestMethod)
                currentResponse.AppendHeader("Access-Control-Allow-Headers", If(currentRequestHeaders, "GET,POST,PUT,DELETE,OPTIONS"))
                currentResponse.StatusCode = 200
                currentResponse.End()
            End If
        Next

    End Sub

यहां यह कोड केवल पूर्व-उड़ान और टोकन अनुरोध को प्रतिक्रिया में "एक्सेस-कंट्रोल-अनुमति-उत्पत्ति" जोड़ने की अनुमति देता है अन्यथा मैं इसे नहीं जोड़ रहा हूं।

कार्यान्वयन के बारे में मेरा ब्लॉग यहाँ है: https://ibhowmick.wordpress.com/2018/09/21/cross-domain-token-based-authentication-with-web-api2-and-jquery-angular-5-angular- 6 /


0

उन लोगों के लिए जो IIS के साथ php का उपयोग कर रहे हैं, IIS पर यह सर्वर साइड अपडेट web.config इसे रूट डायरेक्टरी (wwwroot) फाइल करता है और इसे जोड़ता है

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <directoryBrowse enabled="true" />
        <httpProtocol>
            <customHeaders>
                <add name="Control-Allow-Origin" value="*"/>
            </customHeaders>
        </httpProtocol>
    </system.webServer>
</configuration>

उसके बाद IIS सर्वर को पुनरारंभ करें, RUN में IISReset टाइप करें और दर्ज करें


0

यहां ऊपर दिए गए उदाहरणों के समान एक और उदाहरण है कि आपके पास केवल एक कॉन्फिग फाइल डिफाइन हो सकती है जहां कोर्स है: विभिन्न निर्देशिकाओं में पथ पर IIS सर्वर पर दो web.config फाइलें थीं, और उनमें से एक वर्चुअल निर्देशिका में छिपी हुई थी। इसे हल करने के लिए मैंने रूट लेवल कॉन्फिग फाइल को डिलीट कर दिया क्योंकि पथ वर्चुअल डायरेक्टरी में कॉन्फिग फाइल का उपयोग कर रहा था। एक या दूसरे को चुनना होगा।

URL called:  'https://example.com/foo/bar'
                     ^              ^
      CORS config file in root      virtual directory with another CORS config file
          deleted this config             other sites using this


0

'पहुंच-नियंत्रण-अनुमति-उत्पत्ति' शीर्षक में कई मान हैं

जब मुझे यह त्रुटि मिली तो मैंने इसके लिए समाधान खोजने में घंटों समय लगा दिया लेकिन कुछ भी काम नहीं आया, आखिरकार मुझे इस समस्या का हल मिल गया जो बहुत सरल है। जब '' एक्सेस-कंट्रोल-अनुमति-उत्पत्ति 'हेडर आपकी प्रतिक्रिया में एक से अधिक बार जुड़ गया, तो यह त्रुटि उत्पन्न होती है, अपने apache.conf या httpd.conf (अपाचे सर्वर), सर्वर साइड स्क्रिप्ट की जाँच करें, और इन फ़ाइलों से अवांछित प्रविष्टि हेडर निकालें ।

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