ASP.net Core WebAPI में CORS को कैसे सक्षम करें


189

मैं क्या करने की कोशिश कर रहा हूं

मेरे पास एक बैकएंड ASP.Net कोर वेब एपीआई है जो एक एज़्योर फ्री प्लान (स्रोत कोड: https://github.com/killerrin/Portfolio-Backend ) पर होस्ट किया गया है ।

मेरे पास एक क्लाइंट वेबसाइट भी है जिसे मैं उस एपीआई का उपभोग करना चाहता हूं। क्लाइंट एप्लिकेशन को Azure पर होस्ट नहीं किया जाएगा, बल्कि इसे Github Pages या किसी अन्य वेब होस्टिंग सेवा पर होस्ट किया जाएगा जिसकी मुझे एक्सेस है। इस वजह से डोमेन नाम लाइन नहीं होंगे।

इसे देखते हुए, मुझे वेब एपीआई की तरफ कॉर्स को सक्षम करने की आवश्यकता है, हालांकि मैंने अभी कई घंटों तक सब कुछ करने की कोशिश की है और यह काम करने से इनकार कर रहा है।

मेरे पास क्लाइंट सेटअप कैसे है यह React.js में लिखा गया एक साधारण क्लाइंट है। मैं AJAX के माध्यम से Jquery में एपीआई कॉल कर रहा हूं। प्रतिक्रिया साइट काम करती है इसलिए मुझे पता है कि नहीं। Jquery API कॉल काम करता है जैसा कि मैंने प्रयास 1 में पुष्टि की थी। यहां बताया गया है कि मैं कैसे कॉल करता हूं

    var apiUrl = "http://andrewgodfroyportfolioapi.azurewebsites.net/api/Authentication";
    //alert(username + "|" + password + "|" + apiUrl);
    $.ajax({
        url: apiUrl,
        type: "POST",
        data: {
            username: username,
            password: password
        },
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function (response) {
            var authenticatedUser = JSON.parse(response);
            //alert("Data Loaded: " + authenticatedUser);
            if (onComplete != null) {
                onComplete(authenticatedUser);
            }
        },
        error: function (xhr, status, error) {
            //alert(xhr.responseText);
            if (onComplete != null) {
                onComplete(xhr.responseText);
            }
        }
    });

मैंने क्या कोशिश की है


प्रयास 1 - 'उचित' तरीका

https://docs.microsoft.com/en-us/aspnet/core/security/cors

मैंने Microsoft वेबसाइट पर इस ट्यूटोरियल को एक टी तक फॉलो किया है, इसे Startup.cs में ग्लोबली सक्षम करने के सभी 3 विकल्पों को आज़माते हुए, इसे हर कंट्रोलर पर सेट करके हर एक्शन पर आज़माया।

इस पद्धति का अनुसरण करते हुए, क्रॉस डोमेन काम करता है, लेकिन केवल एक ही नियंत्रक पर एक क्रिया पर (POST से खाता नियंत्रक)। बाकी सब चीज़ों के लिए, Microsoft.AspNetCore.Corsमिडलवेयर हेडर सेट करने से मना कर देता है।

मैं Microsoft.AspNetCore.CorsNUGET के माध्यम से स्थापित किया है और संस्करण है1.1.2

यहां बताया गया है कि स्टार्टअप में यह कैसे सेटअप है

    // This method gets called by the runtime. Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
    {
        // Add Cors
        services.AddCors(o => o.AddPolicy("MyPolicy", builder =>
        {
            builder.AllowAnyOrigin()
                   .AllowAnyMethod()
                   .AllowAnyHeader();
        }));

        // Add framework services.
        services.AddMvc();
        services.Configure<MvcOptions>(options =>
        {
            options.Filters.Add(new CorsAuthorizationFilterFactory("MyPolicy"));
        });

        ...
        ...
        ...
    }

    // This method gets called by the runtime. Use this method to configure 
    //the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IHostingEnvironment env,
    ILoggerFactory loggerFactory)
    {
        loggerFactory.AddConsole(Configuration.GetSection("Logging"));
        loggerFactory.AddDebug();

        // Enable Cors
        app.UseCors("MyPolicy");

        //app.UseMvcWithDefaultRoute();
        app.UseMvc();

        ...
        ...
        ...
    }

जैसा कि आप देख सकते हैं, मैं सब कुछ बता रहा हूं। मैं MVC से पहले दोनों बार कॉर्स जोड़ता हूं, और जब मैंने काम नहीं किया, तो मैंने [EnableCors("MyPolicy")]प्रत्येक नियंत्रक पर डालने का प्रयास किया

[Route("api/[controller]")]
[EnableCors("MyPolicy")]
public class AdminController : Controller

प्रयास 2 - जानवर मजबूर

https://andrewlock.net/adding-default-security-headers-in-asp-net-core/

पिछले प्रयास में कई घंटों की कोशिश के बाद, मुझे लगा कि मैं हेडर को मैन्युअल रूप से सेट करने की कोशिश करके इसे ब्रूटफोर्स करने की कोशिश करूंगा, जिससे उन्हें हर प्रतिक्रिया पर चलने के लिए मजबूर किया जा सके। मैंने यह इस ट्यूटोरियल के बाद किया है कि हर प्रतिक्रिया के लिए हेडर को मैन्युअल रूप से कैसे जोड़ा जाए।

ये मेरे द्वारा जोड़े गए हेडर हैं

.AddCustomHeader("Access-Control-Allow-Origin", "*")
.AddCustomHeader("Access-Control-Allow-Methods", "*")
.AddCustomHeader("Access-Control-Allow-Headers", "*")
.AddCustomHeader("Access-Control-Max-Age", "86400")

ये अन्य हेडर हैं जिनकी मैंने कोशिश की जो असफल रहे

.AddCustomHeader("Access-Control-Allow-Methods", "GET, POST, PUT, PATCH, DELETE")
.AddCustomHeader("Access-Control-Allow-Headers", "content-type, accept, X-PINGOTHER")
.AddCustomHeader("Access-Control-Allow-Headers", "X-PINGOTHER, Host, User-Agent, Accept, Accept: application/json, application/json, Accept-Language, Accept-Encoding, Access-Control-Request-Method, Access-Control-Request-Headers, Origin, Connection, Content-Type, Content-Type: application/json, Authorization, Connection, Origin, Referer")

इस पद्धति के साथ, क्रॉस साइट हेडर को ठीक से लागू किया जा रहा है और वे मेरे डेवलपर कंसोल और पोस्टमैन में दिखाई देते हैं। समस्या फिर भी है कि यह गुजरता है, जबकि Access-Control-Allow-Originजांच, webbrowser पर (मेरा मानना है कि) एक hissy फिट फेंकता Access-Control-Allow-Headersबताते हुए415 (Unsupported Media Type)

तो जानवर बल विधि भी काम नहीं करती है


आखिरकार

क्या किसी ने इसे काम करने के लिए दिया है और एक हाथ उधार दे सकता है, या बस मुझे सही दिशा में इंगित करने में सक्षम है?


संपादित करें

तो जाने के लिए एपीआई कॉल प्राप्त करने के लिए, मुझे JQuery का उपयोग करना बंद करना होगा और शुद्ध जावास्क्रिप्ट XMLHttpRequestप्रारूप में स्विच करना होगा ।

प्रयास 1

मैं पहले डालने के तरीके के Microsoft.AspNetCore.Corsअलावा, MindsData के जवाब का पालन करके काम पाने में कामयाब रहा ।Configureapp.UseCorsapp.UseMvc

इसके अलावा, जब options.AllowAnyOrigin()वाइल्डकार्ड समर्थन के लिए जावास्क्रिप्ट एपीआई सॉल्यूशन के साथ मिश्रित काम करना शुरू हुआ।

प्रयास २

इसलिए मैं काम करने के लिए प्रयास 2 (यह मजबूर करने के लिए) प्राप्त करने में कामयाब रहा हूं ... एकमात्र अपवाद है कि वाइल्डकार्ड Access-Control-Allow-Originकाम नहीं करता है और जैसे कि मुझे उन डोमेन को मैन्युअल रूप से सेट करना होगा जिनकी उस तक पहुंच है।

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

app.UseSecurityHeadersMiddleware(new SecurityHeadersBuilder()
    .AddDefaultSecurePolicy()
    .AddCustomHeader("Access-Control-Allow-Origin", "http://localhost:3000")
    .AddCustomHeader("Access-Control-Allow-Methods", "OPTIONS, GET, POST, PUT, PATCH, DELETE")
    .AddCustomHeader("Access-Control-Allow-Headers", "X-PINGOTHER, Content-Type, Authorization"));

2
अपने 415 (Unsupported Media Type)समस्या के लिए, Content-Typeअनुरोध शीर्ष लेख को यहां सेट करें application/json
टेक्नेटियम

5
इस तरह के एक वर्णनात्मक प्रश्न लिखने के लिए समय बिताने के लिए धन्यवाद।
user1007074

1
यदि आप पोस्टमैन का उपयोग कर परीक्षण कर रहे हैं, तो सुनिश्चित करें कि आपने अनुरोध हेडर के लिए उत्पत्ति * या कुछ और सेट किया है, तो # 1 प्रयास करना चाहिए। इस हेडर के बिना, एक्सेस-कंट्रोल-अलाउंस-ओरिजनल रिस्पॉन्स हेडर में वापस नहीं आएगा।
tala9999

जवाबों:


237

क्योंकि आपके पास बहुत ही सरल CORS नीति है (XXX डोमेन से सभी अनुरोधों की अनुमति दें), आपको इसे इतना जटिल बनाने की आवश्यकता नहीं है। पहले करने की कोशिश करें (कोर का एक बहुत ही बुनियादी कार्यान्वयन)।

यदि आप पहले से ही नहीं है, तो CORS नगेट पैकेज स्थापित करें।

Install-Package Microsoft.AspNetCore.Cors

अपने स्टार्टअप के कन्फिगरस्वाइस विधि में, कोर सेवाओं को जोड़ें।

public void ConfigureServices(IServiceCollection services)
{
    services.AddCors(); // Make sure you call this previous to AddMvc
    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
}

फिर अपने स्टार्टअप के कॉन्फ़िगर विधि में।

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
    // Make sure you call this before calling app.UseMvc()
    app.UseCors(
        options => options.WithOrigins("http://example.com").AllowAnyMethod()
    );

    app.UseMvc();
}

अब इसे विदा दो। नीतियां तब होती हैं जब आप अलग-अलग कार्यों के लिए अलग-अलग नीतियां चाहते हैं (जैसे अलग-अलग होस्ट या अलग-अलग हेडर)। अपने सरल उदाहरण के लिए आपको वास्तव में इसकी आवश्यकता नहीं है। इस सरल उदाहरण के साथ शुरू करें और वहां से आपको आवश्यकतानुसार ट्विक करें।

आगे पढ़े: http://dotnetcoretutorials.com/2017/01/03/en enable-cors-asp-net-core/


3
XMLHttpRequest andrewgodfroyportfolioapi.azurewebsites.net/api/Authication को लोड नहीं कर सकता । प्रीफ़्लाइट अनुरोध का उत्तर एक्सेस कंट्रोल चेक पास नहीं करता है: अनुरोधित संसाधन पर कोई 'एक्सेस-कंट्रोल-अनुमति-उत्पत्ति' हेडर मौजूद नहीं है। उत्पत्ति ' लोकलहोस्ट: 3000 ' इसलिए पहुँच की अनुमति नहीं है। प्रतिक्रिया में HTTP स्थिति कोड 415 था।
किलरिन

7
इस काम के लिए जा रहा संभावना नहीं है, आप रजिस्टर जब app.UseCors बाद () `` `app.UseMvc। मध्यवर्ग वे पंजीकृत हैं जिस क्रम में वे पंजीकृत हैं
त्सेंग

24
app.UseCvc से पहले app.UseCors का उपयोग कर, कॉन्फ़िगर विधि में काम करने लगता है। किसी कारण के लिए, अनुक्रम मामला प्रतीत होता है।
मि। क्लान

1
मेरे लिए, 2.0 में CORS की सबसे बड़ी समस्या यह है कि यह नहीं बताता कि क्या गलत है, बस चुपचाप कोरस हेडर सेट करने में विफल है। नोट : अपने सभी आवश्यक हेडर को पॉलिसी में जोड़ना याद रखें या यह विफल हो जाएगा (मेरे पास सामग्री-प्रकार था)। मेरे लिए यह भी अजीब बात है कि कॉर्स मिडलवेयर ने रिक्वेस्ट प्रोसेसिंग को ब्रेक नहीं किया है, बस लॉग्स में सूचित किया जाता है कि मूल की अनुमति नहीं है और .. आगे रिक्वेस्ट पास करता है (मिडलवेयर ऑर्डर सही था)।
एंड्री M4n0w4R

2
मुझे options.DisableHttpsRequirement();इस कार्य के लिए किसी भी क्रम में सक्षम करना था। ऐसा लगता है कि https cors सेटिंग लागू नहीं हो रही थी।
माइकल ब्राउन

206
  • में ConfigureServices जोड़ने services.AddCors(); services.AddMvc () से पहले;
  • कॉन्फ़िगर में UseCors जोड़ें

    app.UseCors(builder => builder
        .AllowAnyOrigin()
        .AllowAnyMethod()
        .AllowAnyHeader()
        .AllowCredentials());   
    app.UseMvc();

मुख्य बिंदु यह है कि जोड़ें app.UseCors, पहले app.UseMvc()

सुनिश्चित करें कि आप MVC से पहले CORS कार्यक्षमता की घोषणा करते हैं ताकि MVC पाइपलाइन के नियंत्रण से पहले मिडलवेयर आग लग जाए और अनुरोध को समाप्त कर दे।

उपरोक्त विधि के काम करने के बाद आप इसे बदल सकते हैं ताकि आपी कॉल स्वीकार करने के लिए एक विशिष्ट ORIGIN कॉन्फ़िगर कर सकें और अपने API को किसी से भी खुला छोड़ने से बचें

public void ConfigureServices(IServiceCollection services)
{
    services.AddCors(options => options.AddPolicy("ApiCorsPolicy", builder =>
    {
        builder.WithOrigins("http://localhost:4200").AllowAnyMethod().AllowAnyHeader();
    }));
    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
}

कॉन्फ़िगर विधि में बताएं कि आपके द्वारा बनाई गई नीति का उपयोग करने के लिए CORS:

app.UseCors("ApiCorsPolicy");
app.UseMvc();

मुझे इस विषय पर यह संक्षिप्त लेख मिला - https://dzone.com/articles/cors-in-net-core-core-core-core-security-part-vi


1
यह मेरे लिए काम करता है। codeproject.com/Articles/1150023/…
hubert17

17
यह वास्तव में एक अच्छा "शुरुआती" बिंदु के रूप में अधिक उत्थान प्राप्त करना चाहिए। 25 वर्षों के कोडिंग के मेरे अनुभव में यह जानना हमेशा अच्छा होता है कि फ्लडगेट को कैसे खोलना है, यह सुनिश्चित करने के लिए कि यह वास्तव में "काम" करता है और फिर जरूरत के अनुसार चीजों को बंद / सुरक्षित करता है।
इंडी-जोन्स

4
सिर्फ यह उल्लेख करने Configure()के लिए , आदेश के विपरीत वास्तव में यहां महत्वपूर्ण नहीं हैConfigureServices()
B12Toaster

मैंने आगे रीडर में लिंक का उपयोग किया और उन चरणों ने इस त्रुटि को हल किया। मुझे यकीन नहीं था कि इन परिवर्तनों को कहां रखा जाना चाहिए (मुझे लगा कि एपीआई)। लिंक ने पुष्टि की कि उन्हें एपीआई में रखा जाना चाहिए। सहायता के लिए धन्यवाद। मैं इस त्रुटि के साथ अपने पहियों को पूरी तरह से काट रहा था।
रिचर्ड

1
FYI करें - CORS विनिर्देश यह भी बताता है कि अगर एक्सेस-कंट्रोल-अलाउंस-क्रेडेंशियल्स हेडर मौजूद है, तो "*" (सभी मूल) को सेट करना अमान्य है। जिसका अर्थ है आप उपयोग नहीं कर सकते AllowCredentials()के साथ AllowAnyOrigin()ऊपर की तरह। उपयोग करने के लिए AllowCredentials()आपको सेट करने की आवश्यकता है WithOrigins()docs.microsoft.com/en-us/aspnet/core/security/…
Nick De Beer

27

मैंने अपना मिडलवेयर क्लास बनाया जो मेरे लिए काम करता है, मुझे लगता है कि .net कोर मिडलवेयर क्लास में कुछ गड़बड़ है

public class CorsMiddleware
{
    private readonly RequestDelegate _next;

    public CorsMiddleware(RequestDelegate next)
    {
        _next = next;
    }

    public Task Invoke(HttpContext httpContext)
    {
        httpContext.Response.Headers.Add("Access-Control-Allow-Origin", "*");
        httpContext.Response.Headers.Add("Access-Control-Allow-Credentials", "true");
        httpContext.Response.Headers.Add("Access-Control-Allow-Headers", "Content-Type, X-CSRF-Token, X-Requested-With, Accept, Accept-Version, Content-Length, Content-MD5, Date, X-Api-Version, X-File-Name");
        httpContext.Response.Headers.Add("Access-Control-Allow-Methods", "POST,GET,PUT,PATCH,DELETE,OPTIONS");
        return _next(httpContext);
    }
}

// Extension method used to add the middleware to the HTTP request pipeline.
public static class CorsMiddlewareExtensions
{
    public static IApplicationBuilder UseCorsMiddleware(this IApplicationBuilder builder)
    {
        return builder.UseMiddleware<CorsMiddleware>();
    }
}

और इसे स्टार्टअप में इस तरह से उपयोग किया

app.UseCorsMiddleware();

एक्सेस-कंट्रोल-अनुमति-उत्पत्ति को चलाने का बहुत ही सुंदर तरीका।
अर्तुर पोंडिज़ियालेक

यह WebAPI और MVC पर काम करता है और इसकी कोई निर्भरता नहीं है, धन्यवाद!
जो

मुझे इस पर भी संदेह था, लेकिन इसने मेरे लिए काम किया। मैंने इसे पूरा करने के लिए मूल रूप से हर दूसरे तरीके की कोशिश की, जिसे मैं इंटरनेट पर पा सकता था, लेकिन कोई फर्क नहीं पड़ता कि सर्वर एक्सेस हेडर के साथ क्या प्रतिक्रिया देगा। इसने बहुत अच्छा काम किया। मैं aspnetcore 2.1 चला रहा हूं।
जॉर्डन

यदि ग्राहक अनुरोध में "मूल" भेजते हैं, तो आपको केवल हेडर को वापस करना चाहिए। मूल CospMiddleware में यह इस तरह दिखता है:if (!context.Request.Headers.ContainsKey(CorsConstants.Origin)) return this._next(context);
एंड्रयू प्रिगोरशनेव

1
हो सकता है कि ".net कोर मिडलवेयर क्लास के साथ कुछ गलत हो" क्योंकि आप इसे हेडल "ओरिजिनल" नहीं जोड़ते हैं जब इसे कर्ल या कुछ इस तरह से टेस्ट करते हैं। जब आप js कोड में अनुरोध करते हैं तो ब्राउजर इस हेडर को अपने आप जोड़ देता है।
एंड्रयू प्रिगोरशनेव

17

मेरे मामले में केवल getMindsData के उत्तर के अनुसार अनुरोध अच्छा काम करता है। अन्य प्रकार के अनुरोध के लिए आपको लिखना होगा:

app.UseCors(corsPolicyBuilder =>
   corsPolicyBuilder.WithOrigins("http://localhost:3000")
  .AllowAnyMethod()
  .AllowAnyHeader()
);

जोड़ना मत भूलना .AllowAnyHeader()


तौहीद से सहमत हूँ कि AllowAnyHeader () की आवश्यकता है। यदि सर्वर हेडर के अनुरोध को कुछ याद कर रहा है तो यह सर्वर को विकल्प का अनुरोध देता है।
रिवॉन

.AllowAnyHeader () ने मेरे लिए यह किया था, मेरे पास पहले से प्रतिक्रिया के साथ मुद्दे थे।
तकाज़

11

उपयोगकर्ता 8266077 के उत्तर पर विस्तार करने के लिए , मैंने पाया कि मुझे अभी भी अपने उपयोग के मामले के लिए .NET कोर 2.1-प्रीव्यू में प्रीफ़लाइट अनुरोधों के लिए विकल्प प्रतिक्रिया की आपूर्ति करने की आवश्यकता है :

// https://stackoverflow.com/a/45844400
public class CorsMiddleware
{
  private readonly RequestDelegate _next;

  public CorsMiddleware(RequestDelegate next)
  {
    _next = next;
  }

  public async Task Invoke(HttpContext context)
  {
    context.Response.Headers.Add("Access-Control-Allow-Origin", "*");
    context.Response.Headers.Add("Access-Control-Allow-Credentials", "true");
    // Added "Accept-Encoding" to this list
    context.Response.Headers.Add("Access-Control-Allow-Headers", "Content-Type, X-CSRF-Token, X-Requested-With, Accept, Accept-Version, Accept-Encoding, Content-Length, Content-MD5, Date, X-Api-Version, X-File-Name");
    context.Response.Headers.Add("Access-Control-Allow-Methods", "POST,GET,PUT,PATCH,DELETE,OPTIONS");
    // New Code Starts here
    if (context.Request.Method == "OPTIONS")
    {
      context.Response.StatusCode = (int)HttpStatusCode.OK;
      await context.Response.WriteAsync(string.Empty);
    }
    // New Code Ends here

    await _next(context);
  }
}

और फिर Startup.cs में जैसे मिडलवेयर को सक्षम किया

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
  app.UseMiddleware(typeof(CorsMiddleware));
  // ... other middleware inclusion such as ErrorHandling, Caching, etc
  app.UseMvc();
}

1
मैं इस तरह से मिडलवेयर जोड़ने की सलाह देता हूं:app.Use<CorsMiddleware>();
अल्बर्ट 221

आप उन 2 लिगने को बदल सकते हैं: संदर्भ। Response.StatusCode = (int) HttpStatusCode.OK; प्रतीक्षा का संदर्भ। Response.WriteAsync (string.Empty); एक साधारण के साथ: वापसी;
हयशा

1
@ User8266077 के उत्तर के अपने विस्तार पर विस्तार करने के लिए: सावधान रहें कि यदि किसी अन्य कारण से अनुरोध विफल हो जाता है, तो यह मिडलवेयर एक अपवाद को फेंक देगा और हेडर सेट नहीं किए जाएंगे। इसका मतलब है कि दृश्यपटल में, यह अभी भी एक CORS मुद्दे की तरह दिखेगा, भले ही यह कुछ पूरी तरह से अलग हो। await _next(context)यदि ऐसा होता है, तो मैं किसी भी अपवाद को पकड़कर और स्थिति कोड और प्रतिक्रिया मैन्युअल रूप से सेट करके इसे बायपास कर देता हूं । मुझे प्राधिकरण से अनुरोध करने पर प्रतिक्रिया करने के लिए काम करने के लिए प्रीफ़लाइट अनुरोध के लिए एक्सेस-कंट्रोल-अनुमति-हेडर्स में "प्राधिकरण" जोड़ना पड़ा।
एडम

11
    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {      
       app.UseCors(builder => builder
                .AllowAnyHeader()
                .AllowAnyMethod()
                .SetIsOriginAllowed((host) => true)
                .AllowCredentials()
            );
    }

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddCors();
    }

.SetIsOriginAllowed ((host) => true) ने मेरे लिए इसे हल किया।
जेन्सबी

वाह, तो मैं पूरी तरह से केवल 3 वोट के साथ इस छोटे से पहले काम करने के लिए किसी भी अन्य जवाब की उम्मीद है। लेकिन मैंने सावधानी से हर एक की कोशिश की, ... एक बार मैं तुम्हारे लिए चला गया और, यह काम किया। धन्यवाद
roberto tomás

यह वह है जो मेरे लिए .NET कोर 3.1 पर काम करता है ताकि बहुत कुछ हो सके।
जस्टिनहुई

10

मैं DAYS के लिए इससे जूझ रहा था।

मैं अंत में ले जाकर काम करने के लिए मिल गया app.UseCors(CORS_POLICY);के लिए टॉप की Configure()

https://weblog.west-wind.com/posts/2016/sep/26/aspnet-core-and-cors-gotchas

सुनिश्चित करें कि आप> MVC से पहले CORS कार्यक्षमता की घोषणा करते हैं क्योंकि MVC के अनुरोध को पूरा करने से पहले हेडर को लागू किया जाना है।

<= हालांकि मेरा ऐप कॉल नहीं करता था UseMVC(), UseCors()शीर्ष पर जाकर समस्या को हल किया गया

इसके अलावा:

  • Microsoft.AspNetCore.Cors.Net कोर 2 और निचले में एक आवश्यक NuGet पैकेज हुआ करता था; यह अब स्वचालित रूप से। नेट कोर 3 और उच्चतर में Microsoft.AspNetCore का एक हिस्सा है।
  • builder.AllowAnyOrigin()और .AllowCredentials()कोर विकल्प अब .Net कोर 3 और उच्चतर में परस्पर अनन्य हैं
  • लगता है कि कोस नीति को सर्वर के साथ कोणीय कॉल की आवश्यकता है https। एक HTTP URL .net कोर सर्वर के CORS कॉन्फ़िगरेशन की परवाह किए बिना एक CORS त्रुटि देता प्रतीत होता है। उदाहरण के लिए, http://localhost:52774/api/Contactsएक CORS त्रुटि देगा; बस https://localhost:44333/api/Contactsकाम करने के लिए URL बदल रहा है ।

अतिरिक्त नोट :

मेरे मामले में, CORS तब तक काम नहीं करेगा जब तक मैं app.UseCors()ऊपर नहीं चला जाता app.UseEndpoints(endpoints => endpoints.MapControllers())


2
यदि आप नेट कोर 3 का उपयोग कर रहे हैं तो यह उत्तर होना चाहिए। मेरी जान बचाने के लिए धन्यवाद!
कनाडा वान

2
"एंडपॉइंट रूटिंग के साथ, कॉर्स मिडलवेयर को कॉलआउट और यूजिंगइंडपॉइंट्स के बीच कॉल करने के लिए कॉन्फ़िगर किया जाना चाहिए। गलत कॉन्फ़िगरेशन मिडलवेयर को सही ढंग से काम करना बंद कर देगा।" यहाँ docs.microsoft.com/en-us/aspnet/core/security/…
Mark Schultheiss

"एंडपॉइंट रूटिंग के साथ, कॉर्स मिडलवेयर को कॉलआउट और यूजिंगइंडपॉइंट्स के बीच कॉल करने के लिए कॉन्फ़िगर किया जाना चाहिए। गलत कॉन्फ़िगरेशन मिडलवेयर को सही ढंग से काम करना बंद कर देगा।" यहाँ docs.microsoft.com/en-us/aspnet/core/security/…
Mark Schultheiss

7

उपरोक्त प्रक्रियाओं में से किसी ने भी मदद नहीं की और मैंने तब लेख पढ़ा जो इस मुद्दे को हल करता है।

नीचे कोड है।

public void ConfigureServices(IServiceCollection services)
{
    // Add service and create Policy with options
    services.AddCors(options =>
    {
        options.AddPolicy("CorsPolicy",
            builder => builder.AllowAnyOrigin()
            .AllowAnyMethod()
            .AllowAnyHeader()
            .AllowCredentials() );
    });


    services.AddMvc(); 
}

तथा

public void Configure(IApplicationBuilder app)
{
    // ...

    // global policy - assign here or on each controller
    app.UseCors("CorsPolicy");

और मेरे एक्शनमेथोड के शीर्ष पर

[EnableCors("CorsPolicy")]

2
यह शायद एक बुरा विचार है: आपको एक ही एप्लिकेशन में मिडलवेयर ( app.UseCors()) के साथ मिश्रण नहीं करना चाहिए [EnableCors()]। आपको एक या दूसरे का उपयोग करना चाहिए - लेकिन दोनों नहीं: docs.microsoft.com/en-us/aspnet/core/security/… :Use the [EnableCors] attribute or middleware, not both in the same app.
FoggyDay

4

jQuery.support.cors = true;Ajax कॉल से पहले जोड़ने का प्रयास करें

यह भी हो सकता है कि आपके द्वारा एपीआई को भेजा गया डेटा विस्की हो,

निम्नलिखित JSON फ़ंक्शन को जोड़ने का प्रयास करें

        var JSON = JSON || {};

    // implement JSON.stringify serialization
    JSON.stringify = JSON.stringify || function (obj) {

        var t = typeof (obj);
        if (t != "object" || obj === null) {

            // simple data type
            if (t == "string") obj = '"' + obj + '"';
            return String(obj);

        }
        else {

            // recurse array or object
            var n, v, json = [], arr = (obj && obj.constructor == Array);

            for (n in obj) {
                v = obj[n]; t = typeof (v);

                if (t == "string") v = '"' + v + '"';
                else if (t == "object" && v !== null) v = JSON.stringify(v);

                json.push((arr ? "" : '"' + n + '":') + String(v));
            }

            return (arr ? "[" : "{") + String(json) + (arr ? "]" : "}");
        }
    };

    // implement JSON.parse de-serialization
    JSON.parse = JSON.parse || function (str) {
        if (str === "") str = '""';
        eval("var p=" + str + ";");
        return p;
    };

फिर आपके डेटा में: ऑब्जेक्ट इसे में बदलें

    data: JSON.stringify({
        username: username,
        password: password
    }),

आपकी सहायता के लिए धन्यवाद। निश्चित रूप से हर जवाब का संयोजन करने के बाद अंत में समाधान का पता लगाने के लिए उत्तर के एक हिस्से का उपयोग किया
हत्यारे

4

सबसे सरल समाधान है

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseHsts();
        }

        app.UseCors(options => options.AllowAnyOrigin());

        app.UseHttpsRedirection();
        app.UseMvc();
    }

स्टार्टअप के लिए।


3

मुझे लगता है कि यदि आप अपने स्वयं के कोरस मिडलवेयर का उपयोग करते हैं, तो आपको यह सुनिश्चित करने की आवश्यकता है कि मूल हेडर की जांच करके यह वास्तव में कॉर्स अनुरोध है ।

 public class CorsMiddleware
{
    private readonly RequestDelegate _next;
    private readonly IMemoryCache _cache;
    private readonly ILogger<CorsMiddleware> _logger;

    public CorsMiddleware(RequestDelegate next, IMemoryCache cache, ILogger<CorsMiddleware> logger)
    {
        _next = next;
        _cache = cache;
        _logger = logger;
    }
    public async Task InvokeAsync(HttpContext context, IAdministrationApi adminApi)
    {
        if (context.Request.Headers.ContainsKey(CorsConstants.Origin) || context.Request.Headers.ContainsKey("origin"))
        {
            if (!context.Request.Headers.TryGetValue(CorsConstants.Origin, out var origin))
            {
                context.Request.Headers.TryGetValue("origin", out origin);
            }

            bool isAllowed;
            // Getting origin from DB to check with one from request and save it in cache 
            var result = _cache.GetOrCreateAsync(origin, async cacheEntry => await adminApi.DoesExistAsync(origin));
            isAllowed = result.Result.Result;

            if (isAllowed)
            {
                context.Response.Headers.Add(CorsConstants.AccessControlAllowOrigin, origin);
                context.Response.Headers.Add(
                    CorsConstants.AccessControlAllowHeaders,
                    $"{HeaderNames.Authorization}, {HeaderNames.ContentType}, {HeaderNames.AcceptLanguage}, {HeaderNames.Accept}");
                context.Response.Headers.Add(CorsConstants.AccessControlAllowMethods, "POST, GET, PUT, PATCH, DELETE, OPTIONS");

                if (context.Request.Method == "OPTIONS")
                {
                    _logger.LogInformation("CORS with origin {Origin} was handled successfully", origin);
                    context.Response.StatusCode = (int)HttpStatusCode.NoContent;
                    return;
                }

                await _next(context);
            }
            else
            {
                if (context.Request.Method == "OPTIONS")
                {
                    _logger.LogInformation("Preflight CORS request with origin {Origin} was declined", origin);
                    context.Response.StatusCode = (int)HttpStatusCode.NoContent;
                    return;
                }

                _logger.LogInformation("Simple CORS request with origin {Origin} was declined", origin);
                context.Response.StatusCode = (int)HttpStatusCode.Forbidden;
                return;
            }
        }

        await _next(context);
    }

आपका बहुत बहुत धन्यवाद। मैं लगभग पागल हो गया, खुद से पूछ रहा Access-Control-Allow-Originथा कि हेडर सर्वर द्वारा जारी क्यों नहीं किया गया था। वास्तव में मैंने Originहेडर डब्ल्यू / ओ हेडर के माध्यम से अनुरोध भेजा है । इससे मेरा दिन बच गया! (या कम से कम मेरे
फोरनून

2

MindsData के उत्तर में आपकी टिप्पणी के आधार पर, इसका आपके CORS से कोई लेना-देना नहीं है, यह ठीक काम कर रहा है।

आपकी नियंत्रक कार्रवाई गलत डेटा लौटा रही है। HttpCode 415 का अर्थ है, "असमर्थित मीडिया प्रकार"। ऐसा तब होता है जब आप या तो कंट्रोलर को गलत फॉर्मेट (यानी एक्सएमएल को कंट्रोलर जो केवल जौन को स्वीकार करता है) को पास करते हैं या जब आप गलत टाइप लौटाते हैं (कंट्रोलर में एक्सएमएल लौटाते हैं जिसे केवल एक्सएमएल वापस करने की घोषणा की जाती है)।

बाद में [Produces("...")]अपनी कार्रवाई पर विशेषता के अस्तित्व की जांच करें


आपकी सहायता के लिए धन्यवाद। एक नए समाधान की कोशिश की और बाहर भेजे जाने के साथ खेलने के लिए खेला और यह काम करने के बाद मैंने इसे
कड़ा

2

मेरे लिए, इसका उस कोड से कोई लेना-देना नहीं था जिसका मैं उपयोग कर रहा था। एज़्योर के लिए हमें ऐप सेवा की सेटिंग्स में जाना था, साइड मेनू पर प्रविष्टि "CORS"। वहाँ मुझे उस डोमेन को जोड़ना था जिससे मैं सामान का अनुरोध कर रहा था। एक बार जब मैं उस में था, सब कुछ जादू था।


2

लॉन्चसेटिंग्स.जॉन में, आईसिटिंग्स के तहत, अनाम को सही करने के लिए स्वतंत्र रूप से सेट करें:

"iisSettings": {
    "windowsAuthentication": true,
    "anonymousAuthentication": true,
    "iisExpress": {
      "applicationUrl": "http://localhost:4200/",
      "sslPort": 0
    }
  }

उसके बाद, Startup.cs में, ConfigureServices के तहत, सेवाओं से पहले ।ddvc, जोड़ें:

services.AddCors(options => options.AddPolicy("ApiCorsPolicy", builder =>
{
    builder
        .AllowAnyOrigin()
        .WithHeaders(HeaderNames.AccessControlAllowHeaders, "Content-Type")
        .AllowAnyMethod()
        .AllowCredentials();
}));

और फिर, app.UseMvc () जोड़ें से पहले, कॉन्फ़िगर विधि में:

app.UseCors("ApiCorsPolicy");

यह मेरे लिए था, मैंने मूल रूप से विंडोज ऑथेंटिकेशन के लिए अपनी परियोजना को सेटअप किया था, लेकिन फिर इसे अनाम में बदलना पड़ा, मैंने कॉर्स को सही तरीके से कॉन्फ़िगर किया था, लेकिन लॉन्चसेटिंग.जॉन में यह सेटिंग अपराधी थी, इसे पोस्ट करने के लिए धन्यवाद!
HaRoLD

2

मैं .Net CORE 3.1 का उपयोग कर रहा हूं और मैंने उम्र बिताई है जब मैंने एक दीवार के साथ अपना सिर पीट लिया था, जब मुझे महसूस हुआ कि मेरा कोड वास्तव में काम करना शुरू कर चुका है, लेकिन मेरे डिबगिंग का वातावरण टूट गया है, इसलिए यहां 2 संकेत हैं यदि आप समस्या निवारण का प्रयास कर रहे हैं संकट:

  1. यदि आप ASP.NET मिडलवेयर का उपयोग करके प्रतिक्रिया शीर्षकों को लॉग इन करने का प्रयास कर रहे हैं, तो "एक्सेस-कंट्रोल-अलाउंस-ओरिजिन" हेडर कभी नहीं दिखाई देगा। मुझे नहीं पता कि यह पाइपलाइन के बाहर कैसे जोड़ा जाता है (अंत में मुझे इसे देखने के लिए वायरशार्क का उपयोग करना पड़ा)।

  2. जब तक आपके अनुरोध में "मूल" शीर्षलेख नहीं होता है, तब .NET कोर प्रतिक्रिया में "एक्सेस-कंट्रोल-अनुमति-उत्पत्ति" नहीं भेजेगा। पोस्टमैन इसे स्वचालित रूप से सेट नहीं करेगा, इसलिए आपको इसे स्वयं जोड़ना होगा।


1

.NET कोर 3.1

मेरे लिए काम किया और डॉक्स इसे कैसे कहते हैं:

स्टार्टअप क्लास में:

readonly string MyAllowSpecificOrigins = "_myAllowSpecificOrigins"; 

कॉन्फ़िगर सेवा () विधि में:

    services.AddCors(options =>
    {
        options.AddPolicy(MyAllowSpecificOrigins,
        builder =>
        {
            builder.WithOrigins("http://example.com",
                                "http://www.contoso.com");
        });
    });

कॉन्फ़िगर () विधि में:

    app.UseCors(MyAllowSpecificOrigins);  

https://docs.microsoft.com/en-us/aspnet/core/security/cors?view=aspnetcore-3.1



0

मुझे काम करने के लिए ऊपर MindsData का उत्तर मिला, लेकिन मुझे Microsoft.AspNetCore.Cors के बजाय Microsoft.AspNet.Cors का उपयोग करना था। मैं Visual Studio 2019 में। नेटकोर वेब एप्लिकेशन एपीआई परियोजना का उपयोग कर रहा हूं


2
नोट: आपको ASP.Net Cor एप्लिकेशन में Microsoft.AspNet.Cors का उपयोग नहीं करना चाहिए। यदि आप .Net Core 3.0 या उच्चतर पर हैं, तो आपको किसी भी NuGet पैकेज को CORS के लिए आयात करने की आवश्यकता नहीं है। यदि आप .Net Core 2.3 या उससे कम पर हैं, तो आपको NuGet से Microsoft.AspNet.Cors के उपयुक्त संस्करण की आवश्यकता है।
फोग्गायदे

0

Microsoft.AspNetCore.Cors

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

.NET कोर वेब एपीआई पर कॉर्स के लिए विकल्प हेडर सक्षम करें


0

इसे करने का सरल और आसान तरीका।

  1. पैकेज स्थापित करे

Install-Package Microsoft.AspNetCore.Cors

  1. इस नीचे दिए गए कोड को startup.cs फ़ाइल में डालें

app.UseCors(options => options.AllowAnyOrigin());


0

यहाँ मेरा कोड है:)

  app.Use((ctx, next) =>
        {
            ctx.Response.Headers.Add("Access-Control-Allow-Origin", ctx.Request.Headers["Origin"]);
            ctx.Response.Headers.Add("Access-Control-Allow-Methods", "*");
            ctx.Response.Headers.Add("Access-Control-Allow-Credentials", "true");
            ctx.Response.Headers.Add("Access-Control-Allow-Headers", "AccessToken,Content-Type");
            ctx.Response.Headers.Add("Access-Control-Expose-Headers", "*");
            if (ctx.Request.Method.ToLower() == "options")
            {
                ctx.Response.StatusCode = 204;

                return Task.CompletedTask;
            }
            return next();
        });

0

यहाँ है कि मैंने ऐसा कैसे किया।

मैं देख रहा हूं कि कुछ उत्तरों में वे सेटिंग कर रहे हैं app.UserCors("xxxPloicy")और डाल रहे हैं[EnableCors("xxxPloicy")] नियंत्रकों में। आपको दोनों करने की जरूरत नहीं है।

यहाँ कदम हैं।

कॉन्फ़िगर के अंदर Startup.cs में निम्न कोड जोड़ें।

    services.AddCors(c=>c.AddPolicy("xxxPolicy",builder => {
        builder.AllowAnyOrigin()
        .AllowAnyMethod()
        .AllowAnyHeader();
    }));

यदि आप पूरी परियोजना में आवेदन करना चाहते हैं तो Startup.cs में कॉन्फ़िगर विधि में निम्न कोड जोड़ें

app.UseCors("xxxPolicy");

या

यदि आप इसे विशिष्ट नियंत्रकों में जोड़ना चाहते हैं तो नीचे दिखाए अनुसार सक्षम कोड जोड़ें।

[EnableCors("xxxPolicy")]
[Route("api/[controller]")]
[ApiController]
public class TutorialController : ControllerBase {}

अधिक जानकारी के लिए: इसे देखें


0

कोर हेडर सेट करने के लिए एक कस्टम एक्शन / कंट्रोलर एट्रीब्यूट का उपयोग करें।

उदाहरण:

public class AllowMyRequestsAttribute : ControllerAttribute, IActionFilter
{
    public void OnActionExecuted(ActionExecutedContext context)
    {
        // check origin
        var origin = context.HttpContext.Request.Headers["origin"].FirstOrDefault();
        if (origin == someValidOrigin)
        {
            context.HttpContext.Response.Headers.Add("Access-Control-Allow-Origin", origin);
            context.HttpContext.Response.Headers.Add("Access-Control-Allow-Credentials", "true");
            context.HttpContext.Response.Headers.Add("Access-Control-Allow-Headers", "*");
            context.HttpContext.Response.Headers.Add("Access-Control-Allow-Methods", "*");
            // Add whatever CORS Headers you need.
        }
    }

    public void OnActionExecuting(ActionExecutingContext context)
    {
        // empty
    }
}

फिर वेब एपीआई नियंत्रक / कार्रवाई पर:

[ApiController]
[AllowMyRequests]
public class MyController : ApiController
{
    [HttpGet]
    public ActionResult<string> Get()
    {
        return "Hello World";
    }
}

0

बस यहाँ जवाब देने के लिए, यदि आप उपयोग कर रहे हैं app.UseHttpsRedirection(), और आप SSL पोर्ट नहीं मार रहे हैं तो इस पर टिप्पणी करने पर विचार करें।


0

मैं ग्राहक के रूप में ब्लेज़र वेबसाइड का उपयोग कर रहा था और बैकएंड के रूप में asp.net वेब एपीआई कोर और cors समस्या भी थी।

मुझे इन कोड के साथ समाधान मिला:

मेरा ASP.Net कोर वेब एप स्टार्टअप। एससी कॉन्फिगर्स सर्विसेज और कॉन्फिगरिंग के तरीके पहली लाइनें इस तरह दिखती हैं:

public void ConfigureServices(IServiceCollection services)
{
   services.AddCors(options => options.AddPolicy("ApiCorsPolicy", builder =>
   {
        builder.WithOrigins("http://example.com").AllowAnyMethod().AllowAnyHeader();
    }));

 //other code below...
}

और मेरी कॉन्फ़िगर विधि:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    app.UseCors(
        options =>   options.WithOrigins("http://example.com").AllowAnyMethod().AllowAnyHeader()
            );
 //other code below...
}

http://example.comअपने क्लाइंट डोमेन या आईपी पते के साथ बदलें


-1
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2)
                .AddJsonOptions(options => {
                    var resolver = options.SerializerSettings.ContractResolver;
                    if (resolver != null)
                        (resolver as DefaultContractResolver).NamingStrategy = null;
                });

            services.AddDbContext<PaymentDetailContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DevConnection"))); //Dependency Injection
            // options => options.UseSqlServer() Lamda Expression

            services.AddCors(options =>
            {
                options.AddPolicy(MyAllowSpecificOrigins,
                    builder =>
                    {
                        builder.WithOrigins("http://localhost:4200").AllowAnyHeader()
                                .AllowAnyMethod(); ;
                    });
            });

कृपया अपने कोड को शामिल करने और स्पष्टीकरण के लिए अपने उत्तर को संपादित करें और यह अन्य उत्तरों से कैसे भिन्न होता है। यह आपके पोस्ट को अधिक उपयोगी बना देगा और इसके लिए अधिक संभावना है :)
दास_गीक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.