CORS İlkesi ve .NET Core 3.1 ile ilgili sorun


12

Neyi kaçırdığımdan emin değilim, ancak CORS Politikamın .NET Core 3.1 ve Angular 8 istemci tarafı ile çalışmasını sağlayamıyorum.

Startup.cs:

        public void ConfigureServices(IServiceCollection services)
        {
            // ...

            // Add CORS policy
            services.AddCors(options =>
            {
                options.AddPolicy("foo",
                builder =>
                {
                    // Not a permanent solution, but just trying to isolate the problem
                    builder.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader();
                });
            });

            services.AddControllers();
        }

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

            app.UseHttpsRedirection();

            // Use the CORS policy
            app.UseCors("foo");

            app.UseRouting();

            app.UseAuthorization();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllers();
            });
        }

Hata Mesajı İstemci tarafı:

Access to XMLHttpRequest at 'https://localhost:8082/api/auth/' from origin 'http://localhost:4200' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

GÜNCELLEME:

Her ne kadar CORS'u yanlış yapılandırmış olsam da (ve aşağıdaki kabul edilen cevap aslında bu konuda yardımcı oldu) sorunun kökü ilgisizdi. Ek bağlam için, API ve Angular uygulamasını CLI kullanarak çalıştırırken uygulama tamamen iyi çalışıyordu - Bu sorunu yalnızca her ikisini de bir web sunucusuna dağıttıktan sonra yaşıyordum.

"Gerçek" sorunu sadece API düz dosya hata günlüğü eklenmesi ve uygulama hiç SQL bağlanmak mümkün değildi bulmak için bir SQL Server iz çalıştırdıktan sonra keşfedilen SQL bağlantısı ile ilgili olan sona erdi.

Normalde bunun sadece 500 dönmesini beklerdim ve sorunu 10 saniye içinde fark ederdim - ancak CORS yanlış yapılandırması, 500'ün asla geri döndürülmediği anlamına geliyordu çünkü CORS ara katmanı ilk önce başarısız oldu. Bu mutlak az söylemek son derece sinir bozucu oldu! . Ancak bunu, başkalarının kendilerini bu durumda bulmaları durumunda, "yanlış tavşanı kovaladığım" şeklinde eklemek istiyorum. CORS yapılandırmasını düzelttikten sonra, asıl sorunun CORS ile tamamen ilgisiz olduğunu fark ettim.

TL; DR; - Bazen "CORS olmayan" .NET Server tarafı hataları, CORS ilkeleri doğru şekilde ayarlanmazsa CORS hataları olarak döndürülebilir

Referanslar:

https://docs.microsoft.com/en-us/aspnet/core/security/cors?view=aspnetcore-3.1#cors-with-named-policy-and-middleware

https://medium.com/swlh/cors-headers-with-dot-net-core-3-5c9dfc664785


1
daha app.UseCors("foo");önce ayarlamaya çalışınapp.UseHttpsRedirection();
StepUp

@StepUp tavsiye için teşekkürler, ama yine de şans yok
KMJungersen

Sorununuzu çözdünüz mü?
StepUp

Bu sorunu çözen oldu mu? Neden hiçbir cevap kabul edilmiyor?
Waseem Ahmad Naeem

Evet, özür dilerim, çözdükten sonra bu konuya asla geri dönmedim. Soruya bazı ek bağlamlarla bir güncelleme ekledim. Teşekkür ederim!
KMJungersen

Yanıtlar:


21

önce app.UseRouting();o zamanapp.UseCors("foo");

ConfigureYönteminizi aşağıdaki gibi değiştirin :

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

    app.UseHttpsRedirection();



    app.UseRouting();  // first
    // Use the CORS policy
    app.UseCors("foo"); // second

    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllers();
    });
}

Benim için çalıştı!


-Nuget paketi gerekli mi?
chana

külçeler için nuget paketi
chana

1
@chana - nuget paketini kurmanıza gerek yok
AbolfazlR

7
GÜNLER için bu konuda takılıp kaldım! internetten hiçbir şey işe yaramadı. Çözümünüz OP ConfigureServiceskoduyla birleştiğinde sorunumu çözdü. Çok teşekkürler!
Tahreem Iqbal

1
Beni uzun zamandır boğdum. Çok teşekkürler!
Myles J

6

Web API kullanıyor app.UseHttpsRedirection(); hangi sebep CORSmüşteri talep değilse sorun httpstemelli. Bu yüzden httpmüşteri ile kullanmak için bu satırı yorumlamamız veya kaldırmamız gerekiyor.

Bu sorun ile değil CORS, https bu soruna neden oluyor ama atılan hata CORS ile söylüyor.


Teşekkürler adamım. Bu sorunumu çözdü
Reagan Gallant

1
Bu doğru! UseHttpsRedirection () satırı UseCors () öğesinden sonra olmalıdır
Eric


0

Localhost'u kullandığınız gibi http://localhost:4200, yapılandırmanızda ayarlamayı deneyin:

public void ConfigureServices(IServiceCollection services)
{
    services.AddCors(options => options.AddPolicy("ApiCorsPolicy", build =>
    {                
        build.WithOrigins("http://localhost:4200")
             .AllowAnyMethod()
             .AllowAnyHeader();
        }));
        // ... other code is omitted for the brevity
     }
}

Ve Configureyöntem:

public void Configure(IApplicationBuilder app, IHostingEnvironment env, IServiceProvider provider)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    app.UseCors("ApiCorsPolicy");
    app.UseHttpsRedirection();
    app.UseAuthentication();
    app.UseMvc();
}

0

CORS Servisi eklerken eklemeyi unutmayın .SetIsOriginAllowed((host) => true)sonra.WithOrigins("http://localhost:4200")

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

0

.NET CORE 3.1 İÇİN

En iyi yol, başlangıç ​​yolunu app.settings dosyasında depolamaktır

"Origins": {
    "Server": "http://localhost:5001/",
    "Client": "http://localhost:4200/",
    "CorsOrigins": "http://localhost:4200,http://localhost:5001"
}

ve ConfigureServicesyöntemde yapılandırma bölümünden orijinleri tanımlayın

services.AddCors(
            options => options.AddPolicy(
                PolicyNames.AllowOrigins,
                builder => builder
                    .WithOrigins(
                        Configuration["Origins:CorsOrigins"]
                            .Split(",", StringSplitOptions.RemoveEmptyEntries)
                            .Select(s => s.TrimEnd('/'))
                            .ToArray()
                    )
                    .AllowAnyHeader()
                    .AllowAnyMethod()
                    .AllowCredentials()
            )
        );

Son olarak, sadece Configureyöntemde cors kullanın (kullanım sırası ne olursa olsun!)

app.UseCors(PolicyNames.AllowOrigins);     //Enable CORS!
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.