Derinlemesine yazılım eğitimleri için kanalımı takip edebilirsiniz...

Asp.NET Core Uygulamalarında CORS(Cross-Origin-Resource-Sharing) Politikası Ayarlama

Merhaba,

Web Browserlar varsayılan olarak bir web sayfası üzerinden farklı bir domaine request gerçekleştirildiği zaman güvenlik amacıyla bu isteği reddederler. Böylece her web sitenin sade ve sadece kendi domaini altındaki adreslere istek yapabilmesini sağlayarak, kullanıcıları kötü ya da iyi zanla(niyet önemli değil, nihayetinde onların rızası olmadan) başka sitelere istek göndermesini amaçlayan kişilere karşı engeli garanti altına almış olurlar.

Browserların bu davranışına Same-Origin Policy denmektedir. Bu politika esasında tarayıcıların benimsediği ilkeler setidir diyebiliriz. Browserlar için farklı domain demek;

  • protocol : protokolün farklı olması,
  • host : hostun farklı olması,
  • port : portun farklı olması

demektir. Dolayısıyla bu üçlünün birleşimi neticesinde ‘origin’ dediğimiz kök domain ile istek yapılacak hedef domain arasında uyum değerlendirilir ve fark söz konusu değilse tarayıcı tarafından istek başarıyla sonuçlandırılır.

Browserlara dair bu üçlüyle örnek vermemiz gerekirse;

https://www.gencayyildiz.com adresine uygun eşleştirmeler aşağıda değerlendirilmiştir.
Origin Sonuç Nedeni
https://www.gencayyildiz.com/page/1 Başarılı protocol, host ve port aynı
https://www.gencayyildiz.com/images/rsm.png Başarılı protocol, host ve port aynı
https://www.gencayyildiz.com:88 Başarısız protocol ve host aynı, port farklı
http://www.gencayyildiz.com Başarısız protocol farklı, host ve port aynı
https://gencayyildiz.com Başarısız protocol ve port aynı, host farklı

Same-Origin Policy, zararlı sitelerin diğer sitelerden veri okumasını engelleyerek büyük bir güvenlik açığını kapatır.

Browser İsteği Reddedip Etmeyeceğini Nereden Bilecektir?

Asp.NET Core Uygulamalarında CORS(Cross-Origin-Resource-Sharing) Politikası Ayarlama

Browser, yapılan request neticesinde gelen response’da –No ‘Access-Control-Allow-Origin’– ifadesiyle karşılaşıldığı taktirde ilgili API tarafında istek yapan client’a dair izin verilmediği anlaşılarak Same-Origin Policy devreye girer ve istek otomatikman reddedilir.
Asp.NET Core Uygulamalarında CORS(Cross-Origin-Resource-Sharing) Politikası Ayarlama
CORS Politikaları Nedir?
API’ın hangi client’tan istek alıp almayacağını belirlemesi CORS politikaları ayarlama diye nitelendirilebilir. CORS politikaları bir güvenlik önleminden ziyade browserlardaki same-origin policy önlemini hafifletmek için devreye giren yapılardır.

CORS politiklarında ilgili client’a dair izin verilen bir API’a yapılan istek neticesinde; API, gelen istekteki origin bilgisini denetler ve bu denetim neticesinde bir doğrulama gerçekleştirilirse response’a –Access-Control-Allow-Origin:https://www.example.com– değerini ekleyerek cevabı döndürür. Browser, döndürülen değerdeki origin ile gönderdiği origin’i kıyaslayarak isteğin başarılı olup olmadığı kanaatine nihai olarak varmaktadır.

CORS Politikası Belirleme

Asp.NET Core uygulamalarında CORS politikası belirleyip farklı clientlardan gelen istekleri karşılayabilmek için Startup.cs dosyasında ‘AddCors’ servisinin uygulamaya dahil edilmesi gerekmektedir.

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

Bu işlemden sonra bu servis aracılığıyla tanımlanan CORS politikasını uygulamada devreye sokacak olan ‘UseCors’ middleware’ini çağırmamız gerekmektedir. Lakin bu işlemi, aşağıda türüne göre tanımlama yaptığımız CORS politikaları yaklaşımlarında tek tek hususi olarak inceleyeceğiz.

Genel CORS Politikası Belirmele
Origin’i yahut header’ı ne olursa olsun client ayırmaksızın yapılan tüm isteklerin başarıyla karşılanabileceğini ifade ettiğimiz CORS politikasıdır.

         services.AddCors(options =>
              options.AddDefaultPolicy(builder =>
              builder.AllowAnyHeader().AllowAnyMethod().AllowAnyOrigin()));

Görüldüğü üzere ‘AllowAnyHeader’, ‘AllowAnyMethod’ ve ‘AllowAnyOrigin’ metotlarıyla tüm clientlardan gelecek isteklere erişim izni verilmiştir.

Bu şekilde belirlenen CORS politikasını kullanabilmek için uygulamada ‘UseRouting’ ile ‘UseAuthentication’ arasında ‘UseCors’ middleware’ini çağırmamız yeterli olacaktır.

      public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
      {
         app.UseRouting();
         app.UseCors();
         app.UseAuthentication();
         app.UseEndpoints(endpoints =>
         {
            endpoints.MapControllers();
         });
      }

Belirli Bir Hedefe CORS Politikası Belirleme
Sadece belirlenen clientlardan gelen istekleri karşılayan CORS politikasıdır.

         services.AddCors(options =>
                options.AddPolicy("myclients", builder =>
                    builder.WithOrigins("https://localhost:1453", "http://localhost:1453").AllowAnyMethod().AllowAnyHeader()));

Yukarıdaki kod bloğunu incelerseniz eğer; ‘WithOrigins’ metodu ile belirli originlere izin verilmektedir.

Bu şekilde belirlenen CORS politikasında ise ‘UseCors’ aşağıdaki gibi yine ‘UseRouting’ ile ‘UseAuthentication’ arasında kullanılmalıdır.

      public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
      {
         app.UseRouting();
         app.UseCors("myclients");
         app.UseAuthentication();
         app.UseEndpoints(endpoints =>
         {
            endpoints.MapControllers();
         });
      }

Subdomain’e Uygun CORS Politikası Belirleme
Belirtilen domaine ait tüm subdomainler’e gelen istekleri karşılayacak CORS politikasıdır.

         services.AddCors(options =>
                options.AddPolicy("myclients", builder =>
                    builder.WithOrigins("https://*.example.com").SetIsOriginAllowedToAllowWildcardSubdomains()
                    .AllowAnyHeader().AllowAnyMethod()
                    ));
         app.UseRouting();
         app.UseCors("myclients");
         app.UseAuthentication();

Controller veya Action Seviyesinde CORS Politikası Belirleme
Controller seviyesinde CORS politikası belirleyebilmek için öncelikle ilgili politikanın tanımlanmış olması gerekmektedir.

         services.AddCors(options =>
                options.AddPolicy("myclients", builder =>
                    builder.WithOrigins("https://localhost:5002", "https://localhost:44355").SetIsOriginAllowedToAllowWildcardSubdomains()
                    .AllowAnyHeader().AllowAnyMethod()
                    ));

Ardından ‘UseCors’ middleware’ini Startup’da herhangi bir politikanın ismini belirlemeksizin boş olarak çağırıyoruz. Nihayetinde ilgili politika controller yahut action seviyesinde verilecektir.

         app.UseRouting();
         app.UseCors();
         app.UseAuthentication();

Son olarak ilgili controller ya da action’ı ‘EnableCors’ attribute’u ile işaretliyoruz.

    [ApiController]
    [Route("api/[controller]")]
    [EnableCors("myclients")]
    public class ProductsController : ControllerBase
    {
        public string[] GetProducts()
        {
            return new string[] {
                "Telefon",
                "Cüzdan",
                "Gömlek",
                "Tablo"
            };
        }
    }

CORS Politikasını Action Bazında Geçersiz Kılma
Genel yahut controller bazında tanımlanan bir CORS politikası varsa eğer actionlarda geçersiz kılmak için ‘DisableCors’ attribute’unu kullanabiliriz.

    [ApiController]
    [Route("api/[controller]")]
    [EnableCors("myclients")]
    public class ProductsController : ControllerBase
    {
        [DisableCors]
        public string[] GetProducts()
        {
            return new string[] {
                "Telefon",
                "Cüzdan",
                "Gömlek",
                "Tablo"
            };
        }
    }

İlgilenenlerin faydalanması dileğiyle…
Sonraki yazılarımda görüşmek üzere…
İyi çalışmalar…

Bunlar da hoşunuza gidebilir...

11 Cevaplar

  1. haci dedi ki:

    Cok güzel detayli anlatmissiniz, tesekkürler.

  2. Serdar dedi ki:

    Emeğine sağlık

  3. murat dedi ki:

    Çok sağolun güzel bir anlatım ve bilgilendirme olmuş.

  4. aparlar dedi ki:

    Güzel bir anlatım . Uzun zamandın aradığım cevabı buldum Teşekkür ederim.

  5. Abdullah dedi ki:

    Teşekkürler

  6. Muhyettin dedi ki:

    merhaba

    services.AddCors(options =>
         options.AddDefaultPolicy(builder =>
         builder.AllowAnyHeader().AllowAnyMethod().AllowAnyOrigin()));
    
    app.UseCors();
    

    Kullandığım halde sadece local pc den veriler geliyor. dışardan bağlanınca verileri çekemiyorum. sorun ne olabilir yardımcı olur musunuz?

  7. Yusuf Karabay dedi ki:

    Hocam merhaba. Bu durumun başarılı olup olmadığını swager üzerinden local üzerinden nasıl test edebiliriz hocam. Yayınladığınız videoyu da baştan sona izledim. .net core web api üzerinde çalışıyorum.

  8. Bahadır Arslan dedi ki:

    Hocam merhaba tüm işlemlerinizi yaptım ama 1 tane fonksiyonum hariç hepsi çalışıyor o da dosya oluşturup indirme fonksiyonum
    “Çapraz köken isteği engellendi: Aynı Köken İlkesi,*** üzerindeki uzak kaynağın okunmasına izin vermiyor. (Sebep: CORS üstbilgisi ‘Access-Control-Allow-Origin’ eksik.) Durum kodu: 500”

    hatası alıyorum yardımcı olurmusunuz?

  9. Uğur dedi ki:

    Yine harika bir yazı.

  10. Durdu Mehmet Keskin dedi ki:

    hocam öncelikle hazırladığınız yazı için teşekkürler. Bir süredir sizi hem youtube üzerinden hemde websitenizdeki yazılarınızdan takip ediyorum ve gerçekten çok faydalı bilgiler edindim bunlar için ayrıca teşekkür ederim. benim bu konu ile ilgili daha spesifik bir sorum var. Her müşterinin kendi subdomaini ile bağlandığı bir yapıda her müşteri kaydında bunu cors politikalarına elle eklemek çok sağlıklı ve mantıklı gelmiyor. .net core da bunu dinamize edebilecek bir yapı mevcut mu acaba

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir