ASPNET Core - CORS
Published: 2022-05-31 14:04:50


CORS; özet olarak son kullanıcının browser tarafından korunmak adına Same Origin Policy ile getirilen kısıtların esnetilmesi anlamına gelmektedir.Konu ile ilgili detaylı bilgi için [önceki yazıma](https://dev.to/cengmylmz/cors-cross-origin-resource-sharing-440e) bakabilirsiniz.

Bu yazıda ASPNET Core tarafında CORS uygulanması ile ilgili başlıkları ele alıyor olacağız. Temelde çalışacağımız dosya program.cs olacak ve burada gerekli tanımları yapacağız.

Proje ile görmek üzere bir blank solution içerisine api ve mvc projesi ekleyerek uygulamaya başlayalım.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/b00q3x58l53rqyvmn9j6.png)

**api url** : localhost:7093
**mvc url** : localhost:7002

! port numaraları siz de değişkenlik gösterebilir.

Burada api uygulamasına mvc uygulaması üzerinden yapılacak XmlHttpRequest veya fetch isteklerinin CORS ile yapılabilir olmasını sağlayacağız. Hiçbir ayar yapmadan mvc projesini tarayıcıda açıp chrome devtools -> console' dan **fetch api** ve **XmlHttpRequest** ile yaptığımız istek neticesinde chrome üzerinde aşağıda ki hatayı almaktayız. 

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/n3kgl96fcb4j777nb6d2.png)

Bu yapmış olduğumuz isteği mvc uygulamasına herhangi bir sayfadan api uygulamasına ajax isteği yapmış olmamız ile eşdeğer olarak düşünebilirsiniz.

---

## AddDefaultPolicy
Genel bir policy eklemeye yarar ve bu sayede tüm uygulama üzerinde geçerli olur.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/broe7ncf8bxrk9po9n9g.png)



Burada AllowAny* ile aslında Same Origin Policy yi devredışı bırakmış oluyor ve farklı originden her türlü istek yapılabilir demiş oluyoruz. UseCors middleware ekleme işlemi UseRouting' den önce UseAuthorization'dan sonra olmalıdır.

```
builder.Services.AddCors(options =>
{
    options.AddDefaultPolicy(policy =>
    {
        policy.AllowAnyHeader()
        .AllowAnyMethod()
        .WithOrigins("https://localhost:7002");
    });
});

```
Bu şekilde tanımladığımız policy için sadece https://localhost:7002 adresinden, herhangi bir method veya herhangi bir header ile istek yapabilirsiniz demiş oluyoruz.

> Burada dikkat edilecek husus; https://localhost:7002/ şeklinde sonda "/" kullanılarak yapılan tanımlamada url uyuşmayacağı için mvc uygulaması Same Origin Policy' ye takılacaktır.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gvjt1vrj0196y486mx3h.png)

---

## AddPolicy
Bu method ile custom policy ekleyebilir middleware yardımıyla tüm proje üzerinde geçerli kılabileceğimiz gibi bir controller veya action ile de sınırlı bir kullanım da sağlayabilmekteyiz. Örnekler ile nasıl kullanıldığına bakalım.


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/yfh5ifezrb7t1ghbt7sm.png)

Bu şekilde custom policy tanımları yapabilmekteyiz. Policy name üzerinden hangi policy nin devreye alınacağını belirtiyoruz.


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1bv78cuakt8dt7emvmej.png)

Eklemiş olduğumuz policy nin sadece belirli bir controller için çalışmasını istiyorsak sadece o controllerın üzerine **[EnableCors]** attribute eklemesi yaparak controller özelinde policy uygulayabiliriz. Aynı zamanda controller içerisinde ki her action için ilgili policy çalışacakken **[DisableCors]** attribute u ile işaretlemiş olduğumuz action için çalışmıyor olacaktır. 


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/riu5wi2bl5kr7qwzh58p.png)

Tek bir action için policy uygulamak istediğimizde sadece ilgili action ı [EnableCors] atrribute u ile işaretlememiz yeterli olacaktır.


Birden fazla client uygulaması api için istek atabilir ve bu durumda her action her client için uygun olmayabilir bu noktada ilgili actionların client ın erişimine açılması noktasında birden fazla policy tanımı yapıp gerekli actionlar EnableCors attribute u yardımıyla işaretlenebilir.

**Program.cs**
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hxk2sjlv6bee69ajn5lf.png)

**ProductController.cs**
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cijkazcytr6ox7mbn59o.png)

---

## Endpoint Routing

Endpoint routing üzerinde **RequireCors** methodu ile CORS tanımı yapabilmekteyiz.


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/efh0f0h9m6gquqlcmaev.png)


ASPNET Core uygulamalarında CORS uygulamak her türlü ihtiyaca yönelik tasarlanmış durumda ve siz de kullanmadan önce kendi isterlerinize göre policy tasarımınızı yapıp ardından kolayca projelerinizde uygulayabilirsiniz.

iyi çalışmalar :)

---


> **XmlHttpRequest**

```
var request = new XMLHttpRequest();
request.open("GET","https://localhost:7093/api/Product")
request.send();

```

> **fetch api**

```
fetch('https://localhost:7093/api/Product')
  .then(response => response.json())
  .then(data => console.log(data));

```



Kaynaklar

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