ASP.net Core WebAPI'de CORS nasıl etkinleştirilir


190

Ne yapmaya çalışıyorum

Azure Ücretsiz Planında (Kaynak Kodu: https://github.com/killerrin/Portfolio-Backend ) barındırılan bir arka uç ASP.Net Core Web API'm var .

Ayrıca bu API'yı tüketmek istediğim bir Müşteri Web Sitem var. İstemci Uygulaması Azure'da barındırılmayacak, aksine Github Sayfalarında veya erişebileceğim başka bir Web Hosting Hizmetinde barındırılacaktır. Bu nedenle alan adları sıralanmayacaktır.

Buna baktığımda, Web API tarafında CORS'yi etkinleştirmem gerekiyor, ancak şimdi birkaç saat boyunca hemen hemen her şeyi denedim ve çalışmayı reddediyor.

İstemci Kurulumu var React.js'de yazılmış basit bir istemci. Jquery AJAX aracılığıyla API'leri arıyorum. React sitesi çalışır, bu yüzden biliyorum. Jquery API çağrısı Deneme 1'de onayladığım şekilde çalışıyor. İşte çağrıları nasıl yapacağım

    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);
            }
        }
    });

Ne denedim


Deneme 1 - 'Doğru' yol

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

Microsoft Web sitesindeki bu öğreticiyi bir T'ye kadar takip ettim, Startup.cs'ta Global olarak etkinleştirmenin tüm 3 seçeneğini deniyorum, her denetleyicide Kuruyor ve her Eylemde Deniyorum.

Bu yöntemin ardından, Etki Alanları Arası çalışır, ancak yalnızca tek bir denetleyicide tek bir Eylem üzerinde (AccountController'a POST). Diğer her şey için, Microsoft.AspNetCore.Corsara katman yazılımı üstbilgileri ayarlamayı reddeder.

Ben yüklü Microsoft.AspNetCore.CorsNuget içinden ve versiyonudur1.1.2

Startup.cs içinde nasıl kurulum var

    // 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();

        ...
        ...
        ...
    }

Gördüğünüz gibi her şeyi söylediğim gibi yapıyorum. MVC'den önce iki kez Cors ekliyorum ve bu işe yaramadığında [EnableCors("MyPolicy")]her denetleyiciyi bu şekilde koymaya çalıştım

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

Deneme 2 - Brute Forcing

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

Önceki denemede birkaç saat denedikten sonra, üstbilgileri manuel olarak ayarlamaya çalışarak bruteforce yapmaya çalışacağımı ve her yanıtta çalışmaya zorlayacağımı düşündüm. Bunu el ile her yanıta başlık eklemek için bu öğretici aşağıdaki yaptı.

Bunlar eklediğim başlıklar

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

Bunlar denediğim ve başarısız olan diğer başlıklar

.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")

Bu yöntemle Siteler arası başlıklar düzgün bir şekilde uygulanıyor ve geliştirici konsolumda ve Postacı'da görünüyorlar. Sorun ancak geçerken olmasıdır Access-Control-Allow-Originçek webbrowser (sanırım) bir hissy uygun atar Access-Control-Allow-Headersbelirten415 (Unsupported Media Type)

Yani kaba kuvvet yöntemi de işe yaramıyor


En sonunda

Herkes bu işe aldı ve bir el ödünç olabilir, ya da sadece doğru yönde beni işaret edebiliyor mu?


DÜZENLE

Bu yüzden API çağrıları geçmek için, JQuery kullanmayı durdurmak ve bir Saf Javascript XMLHttpRequestformatına geçmek zorunda kaldı .

Deneme 1

Ben önce koyarak Yöntem Microsoft.AspNetCore.Corsdışında MindingData yanıt takip ederek işe başardı .Configureapp.UseCorsapp.UseMvc

Ayrıca, options.AllowAnyOrigin()joker karakter desteği için Javascript API Solution ile karıştırıldığında da çalışmaya başladı.

Deneme 2

Bu yüzden Deneme 2'yi (kaba zorlama) işe almayı başardım ... Wildcard'ın Access-Control-Allow-Originişe yaramadığı tek istisna dışında ve bu nedenle ona erişimi olan etki alanlarını manuel olarak ayarlamalıyım.

Bu WebAPI'nin herkese geniş olarak açılmasını istediğim için ideal değil, ancak en azından benim için ayrı bir sitede çalışıyor, yani bir başlangıç

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
Senin için 415 (Unsupported Media Type)konuyla bir set Content-Typeisteği başlığını için application/json.
Technetium

5
Böyle açıklayıcı bir soru yazmak için zaman harcadığınız için teşekkür ederiz.
user1007074

1
Postacı'yı kullanarak test yapıyorsanız, Orijin değerini * veya istek üstbilgisi için bir şey olarak ayarladığınızdan emin olun, o zaman Deneme # 1 çalışmalıdır. Bu üstbilgi olmadan, yanıt üstbilgisinde Access-Control-Allow-Origin döndürülmez.
tala9999

Yanıtlar:


240

Çok basit bir CORS politikanız olduğundan (XXX alan adından tüm isteklere izin ver), bunu bu kadar karmaşık hale getirmeniz gerekmez. Önce aşağıdakileri yapmayı deneyin (CORS'in çok temel bir uygulaması).

Henüz yapmadıysanız, CORS nuget paketini kurun.

Install-Package Microsoft.AspNetCore.Cors

Startup.cs dosyasının ConfigureServices yönteminde CORS hizmetlerini ekleyin.

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

Ardından startup.cs dosyasının Configure yöntemine aşağıdakileri ekleyin:

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();
}

Şimdi bir deneyin. Politikalar, farklı eylemler için farklı politikalar (ör. Farklı ana makineler veya farklı başlıklar) istediğinizde geçerlidir. Basit örneğiniz için buna gerçekten ihtiyacınız yok. Bu basit örnekle başlayın ve ihtiyaç duyduğunuzda ince ayar yapın.

İlave okumalar: http://dotnetcoretutorials.com/2017/01/03/enabling-cors-asp-net-core/


3
XMLHttpRequest, andrewgodfroyportfolioapi.azurewebsites.net/api/Authentication dosyasını yükleyemiyor . Ön kontrol isteğine verilen yanıt erişim kontrolü denetimini geçemez: İstenen kaynakta 'Erişim-Denetim-İzin Verme Başlığı' başlığı yok. Bu nedenle ' localhost: 3000 ' kaynağına erişime izin verilmiyor. Yanıt HTTP durum kodu 415 idi.
killerrin

7
`` App.UseMvc () ` app.UseCors SONRASI kaydolduğunuzda bu işe yaramaz . Middlewares kayıtlı oldukları sırayla idam
Tseng

24
app.UmCors kullanarak app.UseMvc, Configure yönteminde çalışıyor gibi görünüyor. Bazı nedenlerden dolayı, dizinin önemi yoktur.
MrClan

1
Benim için, CORS'ın 2.0'daki en büyük sorunu neyin yanlış olduğunu söylememesi, sadece sessizce CORS başlıklarını ayarlamamasıdır. Not : Politikaya tüm gerekli başlıklarınızı eklemeyi unutmayın, yoksa başarısız olur (içerik türüm vardı). Ayrıca benim için garip şey CORS ara katmanı istek işleme fren değil, sadece menşe izin verilmiyor günlükleri bilgilendirme ve .. Daha fazla istek geçer (ara katmanı siparişi doğruydu).
Andrii M4n0w4R

2
Bunlardan options.DisableHttpsRequirement();herhangi birinin çalışması için etkinleştirmem gerekiyordu. Görünüşe göre https cors ayarları uygulanmadı.
Michael Brown

210
  • Gelen ConfigureServices eklemek services.AddCors(); services.AddMvc () önce;

  • Configure'da UseCors Ekleme

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

Ana nokta app.UseCors, daha önce eklemektir app.UseMvc().

MVC ardışık düzenini kontrol altına almak ve isteği sonlandırmadan önce ara katman yazılımı ateşlemek için MVC önce CORS işlevselliği bildirdiğinizden emin olun.

Yukarıdaki yöntem çalıştıktan sonra, API çağrılarını kabul etmek ve API'nızı herkese bu kadar açık bırakmaktan kaçınmak için belirli bir ORIGIN'i yapılandırabilirsiniz.

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

    services.AddMvc();
}

Configure yönteminde CORS'e az önce oluşturduğunuz politikayı kullanmasını söyleyin:

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

Konuyla ilgili bu kompakt makaleyi buldum - https://dzone.com/articles/cors-in-net-core-net-core-security-part-vi


1
Bu benim için çalışıyor. codeproject.com/Articles/1150023/…
hubert17

17
Bu gerçekten iyi bir "başlangıç" noktası olarak daha fazla oy almalıdır. 25 yılı aşkın kodlama deneyimimde, aslında "çalıştığından" emin olmak ve ardından gerektiğinde işleri kapatmak / güvenli hale getirmek için taşkın kapılarını nasıl açacağınızı bilmek her zaman güzeldir.
Indy-Jones

4
Sadece aksine, bu söz Configure()sipariş içinde burada gerçekten önemli değilConfigureServices()
B12Toaster

Bağlantıyı Diğer Reader'da kullandım ve bu adımlar bu hatayı çözdü. Bu değişikliklerin nereye yerleştirileceğinden emin değildim (API'yi düşündüm). Link, API'ya yerleştirilmeleri gerektiğini doğruladı. Yardım için teşekkürler. Bu hatayla tekerleklerimi tamamen döndürüyordum.
Richard

1
FYI - CORS belirtimi, Access-Control-Allow-Credentials üstbilgisi varsa "*" (tüm orijinler) ayarlarının da geçersiz olduğunu belirtir. Eğer kullanamaz Anlamı AllowCredentials()ile AllowAnyOrigin()yukarıda gibi. Kullanmak AllowCredentials()için ayarlamanız gerekir WithOrigins(). docs.microsoft.com/tr-tr/aspnet/core/security/…
Nick De Beer

28

Benim için çalışan kendi katman yazılım sınıfımı oluşturdum, bence .net çekirdek katman yazılımı ile ilgili bir sorun var

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>();
    }
}

ve startup.cs dosyasında bu şekilde kullandı

app.UseCorsMiddleware();

Access-Control-Allow-Origin'i çalıştırmanın çok zarif bir yolu.
Artur Poniedziałek

Bu WebAPI ve MVC üzerinde çalışır ve bağımlılıkları yoktur, Teşekkürler!
Joe

Bu konuda da şüpheliydim, ama benim için çalıştı. Temelde internette bulabildiğim için bunu yapmak için diğer tüm yöntemleri denedim, ancak ne olursa olsun sunucunun erişim üstbilgileriyle yanıt vermeyeceğini. Bu harika çalıştı. Aspnetcore 2.1 kullanıyorum.
Ürdün

Cors başlıklarını yalnızca istemci istekte "Origin" başlığı gönderirse döndürmelisiniz. Orijinal CospMiddleware şu şekilde görünüyor:if (!context.Request.Headers.ContainsKey(CorsConstants.Origin)) return this._next(context);
Andrew Prigorshnev

2
Belki ".net core middleware class ile yanlış bir şey" çünkü curl ile test ederken "Origin" başlığı eklemezsiniz. Tarayıcılar bu üstbilgiyi js kodunda istekte bulunduğunuzda otomatik olarak ekler.
Andrew Prigorshnev

18

Benim durumumda sadece getistek MindingData yanıt göre iyi çalışır. Diğer istek türleri için şunları yazmanız gerekir:

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

Eklemeyi unutma .AllowAnyHeader()


Towhid ile AllowAnyHeader () gerektiğini kabul edin. HEADER'ın isteği bir şey eksikse sunucunun OPTIONS isteği almasına izin verir.
Rivon

.AllowAnyHeader () benim için yaptı, ön kontrol yanıtı ile ilgili sorunlar vardı.
takaz

11

Genişletmek için user8266077 'ın cevabı , ben hala için tedarik SEÇENEKLERİ yanıtı için gerekli bulundu uçuş öncesi isteklerden benim kullanım durumu için .NET Çekirdek 2.1-önizleme:

// 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);
  }
}

ve ardından Startup.cs dosyasında olduğu gibi ara katman yazılımını etkinleştirin

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

1
Bu şekilde ara katman yazılımı eklemenizi tavsiye ederim:app.Use<CorsMiddleware>();
Albert221 24:18

Bu 2 ligne'nin yerini değiştirebilirsiniz: context.Response.StatusCode = (int) HttpStatusCode.OK; bağlamı bekle.Response.WriteAsync (string.Empty); basit: dönüş;
Hayha

1
@ User8266077'nin cevabını genişletmek için: Başka bir nedenden dolayı istek başarısız olursa, bu ara yazılımın bir istisna atacağına ve başlıkların ayarlanmayacağına dikkat edin. Yani, ön uçta, tamamen farklı bir şey olmasına rağmen hala bir CORS sorunu gibi görünecek. Herhangi bir istisna yakalayarak await _next(context)ve bu olursa durum kodunu ve yanıtı manuel olarak ayarlayarak bunu atladım. Ayrıca, yetkilendirme gerektiren reaksiyondan istekte bulunurken ön kontrol isteğinin çalışması için Access-Control-Allow-Headers öğesine "yetkilendirme" eklemek zorunda kaldım.
Adam

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) benim için çözdü.
JensB

vay, bu yüzden diğer cevapların bu küçük cevaptan önce sadece 3 oyla çalışmasını bekledim. ama her birini titizlikle denedim, ... senin için gittiğim bir hevesle ve işe yaradı. thank you
roberto tomás

Hemen hemen her şeye izin vermek için .NET Core 3.1'de benim için çalışan bu.
JustinHui

10

GÜNLER için bununla mücadele ediyordum.

Sonunda hareket ettirerek işe aldım app.UseCors(CORS_POLICY);için İLK arasında Configure().

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

MVC isteği tamamlamadan önce başlıkların uygulanması gerektiğinden CORS işlevselliğini> MVC'den önce bildirdiğinizden emin olun.

<= Uygulamam aramasa bile UseMVC(), UseCors()en üste gitmek sorunu çözdü

Ayrıca:

  • Microsoft.AspNetCore.Cors.Net Core 2 ve daha düşük sürümlerde gerekli bir NuGet paketi; artık otomatik olarak .Net Core 3 ve sonraki sürümlerde Microsoft'un bir parçası.
  • builder.AllowAnyOrigin()ve .AllowCredentials()CORS seçenekleri artık .Net Core 3 ve sonraki sürümlerde birbirini dışlar
  • CORS ilkesi sunucunun açısal çağrısını gerektiriyor gibi görünüyor https. Bir http URL'si, .Net Core sunucusunun CORS yapılandırmasına bakılmaksızın bir CORS hatası veriyor gibi görünüyordu. Örneğin, http://localhost:52774/api/Contactsbir CORS hatası verir; URL'yi çalışacak şekilde değiştirmeniz yeterlidir https://localhost:44333/api/Contacts.

Ek not :

Benim durumumda, app.UseCors()yukarı hareket etmeden CORS işe yaramazdı app.UseEndpoints(endpoints => endpoints.MapControllers()).


2
Net Core 3 kullanıyorsanız bu cevap olmalı. Hayatımı kurtardığın için teşekkürler!
Kanada Wan

2
"Uç nokta yönlendirmede, CORS ara katmanının UseRouting ve UseEndpoints çağrıları arasında çalışacak şekilde yapılandırılması gerekir. Yanlış yapılandırma, ara katman yazılımının düzgün çalışmamasına neden olur." burada docs.microsoft.com/tr-tr/aspnet/core/security/…
Mark Schultheiss

"Uç nokta yönlendirmede, CORS ara katmanının UseRouting ve UseEndpoints çağrıları arasında çalışacak şekilde yapılandırılması gerekir. Yanlış yapılandırma, ara katman yazılımının düzgün çalışmamasına neden olur." burada docs.microsoft.com/tr-tr/aspnet/core/security/…
Mark Schultheiss

7

Yukarıdaki prosedürlerin hiçbiri yardımcı olmadı ve sonra sorunu çözen makaleyi okudum .

Kod aşağıdadır.

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(); 
}

ve

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

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

ve benim aksiyon yöntemimin üstünde

[EnableCors("CorsPolicy")]

2
Bu muhtemelen kötü bir fikirdir: Middleware ( app.UseCors()) ile [EnableCors()]aynı uygulamada karıştırılmamalıdır. Birini ya da diğerini kullanmalısınız - ama ikisini birden kullanmamalısınız: 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 çağrısından önce eklemeyi deneyin

API'ya gönderdiğiniz verilerin sakat olması da olabilir,

aşağıdaki JSON işlevini eklemeyi deneyin

        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;
    };

sonra verilerinizde: nesne olarak değiştirin

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

Yardımınız için teşekkürler. Herkesin cevaplarını birleştirdikten sonra sonunda çözümü bulmak için cevabın bir kısmını kesinlikle kullandım
killerrin

4

En basit çözüm ekleme

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

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

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

Başlangıç.cs.


3

Kendi CORS ara katmanınızı kullanıyorsanız, kaynak başlığını kontrol ederek gerçekten CORS isteği olduğundan emin olmanız gerektiğini düşünüyorum .

 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);
    }

Çok teşekkür ederim. Neredeyse kafamın neden Access-Control-Allow-Originsunucu tarafından yayınlanmadığını sorarak çıldırdım . Aslında Originbaşlık olmadan Postacı aracılığıyla istek gönderdim . Bu benim günümü kurtardı! (Ya da en azından benim
zuhurum

2

MindingData'nın cevabındaki yorumunuza dayanarak, CORS'nizle ilgisi yok, iyi çalışıyor.

Denetleyici eyleminiz yanlış verileri döndürüyor. HttpCode 415, "Desteklenmeyen Ortam türü" anlamına gelir. Bu, denetleyiciye yanlış biçim (yani yalnızca json kabul eden bir denetleyiciye XML) ilettiğinizde veya yanlış bir tür döndürdüğünüzde (yalnızca xml döndürdüğü bildirilen bir denetleyicide Xml döndürür) oluşur.

Daha sonra bir [Produces("...")]kez eyleminizde niteliğin varlığını kontrol edin


Yardımınız için teşekkürler. Yeni bir çözüm denedim ve
json'un

2

Benim için kullandığım kodla ilgisi yoktu. Azure için App Service ayarlarına gitmemiz gerekiyordu, yan menüde "CORS" girişi. Orada bir şey istediğim etki alanını eklemek zorunda kaldım. Bir kere bunu aldığımda, her şey sihirdi.


2

LaunchSettings.json uygulamasında, iisSettings altında anonimAuthentication (doğru) değerini true olarak ayarlayın:

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

Sonra, Startup.cs içinde, ConfigureServices altında, hizmetlerden önce.

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

ve ardından configure yönteminde app.UseMvc () öğesini ekleyin:

app.UseCors("ApiCorsPolicy");

Bu benim için yaptı, başlangıçta Windows Kimlik Doğrulaması için projemi kurdum, ancak daha sonra anonim olarak değiştirmek zorunda kaldım, CORS'ı doğru şekilde yapılandırdım, ancak launchSettings.json'daki bu ayar suçluydu, bunu gönderdiğiniz için teşekkür ederiz !.
HaRoLD

2

Net CORE 3.1 kullanıyorum ve kodum gerçekten işe başladığını ama hata ayıklama ortamım bozulduğunu fark ettiğimde kafamı bir duvara çarparak yaşları harcadım, bu yüzden sorun gidermeye çalışıyorsanız 2 ipucu sorun:

  1. ASP.NET ara katman yazılımını kullanarak yanıt üstbilgilerini günlüğe kaydetmeye çalışıyorsanız, "Access-Control-Allow-Origin" üstbilgisi, orada olsa bile hiçbir zaman görünmez. Nasıl bilmiyorum ama boru hattı dışında eklenmiş gibi görünüyor (sonunda ben bunu görmek için wireshark kullanmak zorunda kaldı).

  2. .NET CORE, isteğinizde bir "Origin" üstbilgisi yoksa yanıtta "Access-Control-Allow-Origin" göndermez. Postacı bunu otomatik olarak ayarlamaz, bu yüzden kendiniz eklemeniz gerekir.


2

Benim durumumda UserRouting önce UseCors ile sabit ..


Dotnet core 2.2'den 3.1'e yükselttiğimde buna benzer bir şeyle karşılaştım. App.UseRorsing () 'in üzerindeki app.UseCors ()' ı taşımak zorunda kaldı. Bu cevap beni doğru yönde gösterdi.
Brandonm

1

.NET Core 3.1

Benim için çalıştı ve dokümanlar bunu nasıl söyledi:

Başlangıç ​​sınıfında:

readonly string MyAllowSpecificOrigins = "_myAllowSpecificOrigins"; 

ConfigureServices () yönteminde:

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

Configure () yönteminde:

    app.UseCors(MyAllowSpecificOrigins);  

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


0

Çalışmak için yukarıdaki MindingData yanıt aldım, ancak Microsoft.AspNetCore.Cors yerine Microsoft.AspNet.Cors kullanmak zorunda kaldı. Visual Studio 2019'da .NetCore Web Uygulaması API'sı projesini kullanıyorum


2
Not: bir ASP.Net Cor uygulamasında Microsoft.AspNet.Cors kullanmamalısınız. Net Core 3.0 veya üstü bir sürümdeyseniz, CORS için herhangi bir NuGet paketini içe aktarmanız gerekmez. Net Core 2.3 veya daha düşük bir sürüm kullanıyorsanız, NuGet'in Microsoft.AspNet.Cors sürümünün uygun olması gerekir.
FoggyDay


0

Bunu yapmanın basit ve kolay yolu.

  1. Kurulum paketi

Install-Package Microsoft.AspNetCore.Cors

  1. Bu kodu startup.cs dosyasına yerleştirin

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


0

İşte benim kod:)

  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

İşte böyle yaptım.

Bazı cevapları onlar ayarlarken görüyoruz app.UserCors("xxxPloicy")ve koyarak [EnableCors("xxxPloicy")]denetleyicileri içinde. Her ikisini de yapmanıza gerek yoktur.

İşte adımlar.

ConfigureServices içindeki Startup.cs içinde aşağıdaki kodu ekleyin.

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

Tüm projeye uygulamak istiyorsanız, Startup.cs içindeki Configure yöntemine aşağıdaki kodu ekleyin

app.UseCors("xxxPolicy");

Veya

Belirli denetleyicilere eklemek istiyorsanız, aşağıda gösterildiği gibi enable cors kodunu ekleyin.

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

Daha fazla bilgi için: buna bakın


0

CORS başlıklarını ayarlamak için özel bir Eylem / Denetleyici Özelliği kullanın.

Misal:

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
    }
}

Ardından Web API Denetleyicisi / İşleminde:

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

0

Sadece cevap eklemek için, kullanıyorsanız app.UseHttpsRedirection()ve SSL bağlantı noktası vurmuyorsanız, bunu yorumlamayı düşünün.


0

Ben istemci olarak blazor webassembly ve backend olarak asp.net web api core kullanıyordum ve çok cors sorunu vardı.

Bu kod ile çözüm buldum:

ASP.Net çekirdek webim api Startup.cs ConfigureServices ve Configure yöntemleri ilk satırları şöyle görünür:

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

 //other code below...
}

ve Configure yöntemim:

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

değiştirmek http://example.comistemci etki alanı veya ip adresi ile


-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(); ;
                    });
            });

Lütfen yanıtınızı, kodunuzu ve diğer yanıtlardan nasıl farklı olduğunu ve açıklamasını içerecek şekilde düzenleyin. Bu, yayınınızı daha yararlı ve daha yüksek bir olasılıkla gösterecektir :)
Das_Geek
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.