﻿
{"id":15503,"date":"2020-04-26T20:01:27","date_gmt":"2020-04-26T20:01:27","guid":{"rendered":"https:\/\/www.gencayyildiz.com\/blog\/?p=15503"},"modified":"2020-04-26T20:01:27","modified_gmt":"2020-04-26T20:01:27","slug":"asp-net-core-uygulamalarinda-corscross-origin-resource-sharing-politikasi-ayarlama","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/asp-net-core-uygulamalarinda-corscross-origin-resource-sharing-politikasi-ayarlama\/","title":{"rendered":"Asp.NET Core Uygulamalar\u0131nda CORS(Cross-Origin-Resource-Sharing) Politikas\u0131 Ayarlama"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p>Merhaba,<\/p>\n<p>Web Browserlar varsay\u0131lan olarak bir web sayfas\u0131 \u00fczerinden <u>farkl\u0131 bir domaine<\/u> request ger\u00e7ekle\u015ftirildi\u011fi zaman g\u00fcvenlik amac\u0131yla bu iste\u011fi reddederler. B\u00f6ylece her web sitenin sade ve sadece kendi domaini alt\u0131ndaki adreslere istek yapabilmesini sa\u011flayarak, kullan\u0131c\u0131lar\u0131 k\u00f6t\u00fc ya da iyi zanla(niyet \u00f6nemli de\u011fil, nihayetinde onlar\u0131n r\u0131zas\u0131 olmadan) ba\u015fka sitelere istek g\u00f6ndermesini ama\u00e7layan ki\u015filere kar\u015f\u0131 engeli garanti alt\u0131na alm\u0131\u015f olurlar.<\/p>\n<p>Browserlar\u0131n bu davran\u0131\u015f\u0131na <strong>Same-Origin Policy<\/strong> denmektedir. Bu politika esas\u0131nda taray\u0131c\u0131lar\u0131n benimsedi\u011fi ilkeler setidir diyebiliriz. Browserlar i\u00e7in <u>farkl\u0131 domain<\/u> demek;<\/p>\n<ul>\n<li>protocol : protokol\u00fcn farkl\u0131 olmas\u0131,<\/li>\n<li>host : hostun farkl\u0131 olmas\u0131,<\/li>\n<li>port : portun farkl\u0131 olmas\u0131<\/li>\n<\/ul>\n<p>demektir. Dolay\u0131s\u0131yla bu \u00fc\u00e7l\u00fcn\u00fcn birle\u015fimi neticesinde &#8216;origin&#8217; dedi\u011fimiz k\u00f6k domain ile istek yap\u0131lacak hedef domain aras\u0131nda uyum de\u011ferlendirilir ve fark s\u00f6z konusu de\u011filse taray\u0131c\u0131 taraf\u0131ndan istek ba\u015far\u0131yla sonu\u00e7land\u0131r\u0131l\u0131r.<\/p>\n<p>Browserlara dair bu \u00fc\u00e7l\u00fcyle \u00f6rnek vermemiz gerekirse;<\/p>\n<table>\n<thead>\n<tr>\n<td colspan=\"3\" style=\"text-align:center;\"><span style=\"color:red;\">https:\/\/www.gencayyildiz.com<\/span> adresine uygun e\u015fle\u015ftirmeler a\u015fa\u011f\u0131da de\u011ferlendirilmi\u015ftir.<\/td>\n<\/tr>\n<tr>\n<th>Origin<\/th>\n<th>Sonu\u00e7<\/th>\n<th>Nedeni<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>https:\/\/www.gencayyildiz.com\/page\/1<\/td>\n<td style=\"background-color:green; color:white;\">Ba\u015far\u0131l\u0131<\/td>\n<td>protocol, host ve port ayn\u0131<\/td>\n<\/tr>\n<tr>\n<td>https:\/\/www.gencayyildiz.com\/images\/rsm.png<\/td>\n<td style=\"background-color:green; color:white;\">Ba\u015far\u0131l\u0131<\/td>\n<td>protocol, host ve port ayn\u0131<\/td>\n<\/tr>\n<tr>\n<td>https:\/\/www.gencayyildiz.com:88<\/td>\n<td style=\"background-color:red; color:white;\">Ba\u015far\u0131s\u0131z<\/td>\n<td>protocol ve host ayn\u0131, port farkl\u0131<\/td>\n<\/tr>\n<tr>\n<td>http:\/\/www.gencayyildiz.com<\/td>\n<td style=\"background-color:red; color:white;\">Ba\u015far\u0131s\u0131z<\/td>\n<td>protocol farkl\u0131, host ve port ayn\u0131<\/td>\n<\/tr>\n<tr>\n<td>https:\/\/gencayyildiz.com<\/td>\n<td style=\"background-color:red; color:white;\">Ba\u015far\u0131s\u0131z<\/td>\n<td>protocol ve port ayn\u0131, host farkl\u0131<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<blockquote style=\"color:purple;\"><p><strong>Same-Origin Policy, zararl\u0131 sitelerin di\u011fer sitelerden veri okumas\u0131n\u0131 engelleyerek b\u00fcy\u00fck bir g\u00fcvenlik a\u00e7\u0131\u011f\u0131n\u0131 kapat\u0131r.<\/strong><\/p><\/blockquote>\n<h4>Browser \u0130ste\u011fi Reddedip Etmeyece\u011fini Nereden Bilecektir?<\/h4>\n<p><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/04\/Asp.NET-Core-Uygulamalar\u0131nda-CORSCross-Origin-Resource-Sharing-Politikas\u0131-Ayarlama.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/04\/Asp.NET-Core-Uygulamalar\u0131nda-CORSCross-Origin-Resource-Sharing-Politikas\u0131-Ayarlama-1024x385.jpg\" alt=\"Asp.NET Core Uygulamalar\u0131nda CORS(Cross-Origin-Resource-Sharing) Politikas\u0131 Ayarlama\" width=\"1024\" height=\"385\" class=\"aligncenter size-large wp-image-15517\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/04\/Asp.NET-Core-Uygulamalar\u0131nda-CORSCross-Origin-Resource-Sharing-Politikas\u0131-Ayarlama-1024x385.jpg 1024w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/04\/Asp.NET-Core-Uygulamalar\u0131nda-CORSCross-Origin-Resource-Sharing-Politikas\u0131-Ayarlama-300x113.jpg 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/04\/Asp.NET-Core-Uygulamalar\u0131nda-CORSCross-Origin-Resource-Sharing-Politikas\u0131-Ayarlama-768x289.jpg 768w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/04\/Asp.NET-Core-Uygulamalar\u0131nda-CORSCross-Origin-Resource-Sharing-Politikas\u0131-Ayarlama.jpg 1123w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/p>\n<p>Browser, yap\u0131lan request neticesinde gelen response&#8217;da &#8211;<span style=\"color:red;\">No &#8216;Access-Control-Allow-Origin&#8217;<\/span>&#8211; ifadesiyle kar\u015f\u0131la\u015f\u0131ld\u0131\u011f\u0131 taktirde ilgili API taraf\u0131nda istek yapan client&#8217;a dair izin verilmedi\u011fi anla\u015f\u0131larak <em>Same-Origin Policy<\/em> devreye girer ve istek otomatikman reddedilir.<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/04\/Asp.NET-Core-Uygulamalar\u0131nda-CORSCross-Origin-Resource-Sharing-Politikas\u0131-Ayarlama-1.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/04\/Asp.NET-Core-Uygulamalar\u0131nda-CORSCross-Origin-Resource-Sharing-Politikas\u0131-Ayarlama-1.jpg\" alt=\"Asp.NET Core Uygulamalar\u0131nda CORS(Cross-Origin-Resource-Sharing) Politikas\u0131 Ayarlama\" width=\"834\" height=\"52\" class=\"alignleft size-full wp-image-15527\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/04\/Asp.NET-Core-Uygulamalar\u0131nda-CORSCross-Origin-Resource-Sharing-Politikas\u0131-Ayarlama-1.jpg 834w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/04\/Asp.NET-Core-Uygulamalar\u0131nda-CORSCross-Origin-Resource-Sharing-Politikas\u0131-Ayarlama-1-300x19.jpg 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/04\/Asp.NET-Core-Uygulamalar\u0131nda-CORSCross-Origin-Resource-Sharing-Politikas\u0131-Ayarlama-1-768x48.jpg 768w\" sizes=\"auto, (max-width: 834px) 100vw, 834px\" \/><\/a><br \/>\n<strong>CORS Politikalar\u0131 Nedir?<\/strong><br \/>\nAPI&#8217;\u0131n hangi client&#8217;tan istek al\u0131p almayaca\u011f\u0131n\u0131 belirlemesi CORS politikalar\u0131 ayarlama diye nitelendirilebilir. CORS politikalar\u0131 bir g\u00fcvenlik \u00f6nleminden ziyade browserlardaki same-origin policy \u00f6nlemini hafifletmek i\u00e7in devreye giren yap\u0131lard\u0131r. <\/p>\n<p>CORS politiklar\u0131nda ilgili client&#8217;a dair izin verilen bir API&#8217;a yap\u0131lan istek neticesinde; API, gelen istekteki origin bilgisini denetler ve bu denetim neticesinde bir do\u011frulama ger\u00e7ekle\u015ftirilirse response&#8217;a &#8211;<span style=\"color:blue;\">Access-Control-Allow-Origin:https:\/\/www.example.com<\/span>&#8211; de\u011ferini ekleyerek cevab\u0131 d\u00f6nd\u00fcr\u00fcr. Browser, d\u00f6nd\u00fcr\u00fclen de\u011ferdeki origin ile g\u00f6nderdi\u011fi origin&#8217;i k\u0131yaslayarak iste\u011fin ba\u015far\u0131l\u0131 olup olmad\u0131\u011f\u0131 kanaatine nihai olarak varmaktad\u0131r. <\/p>\n<h4>CORS Politikas\u0131 Belirleme<\/h4>\n<p>Asp.NET Core uygulamalar\u0131nda CORS politikas\u0131 belirleyip farkl\u0131 clientlardan gelen istekleri kar\u015f\u0131layabilmek i\u00e7in Startup.cs dosyas\u0131nda &#8216;AddCors&#8217; servisinin uygulamaya dahil edilmesi gerekmektedir.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public class Startup\r\n    {\r\n       \r\n        .\r\n        .\r\n        .\r\n        public void ConfigureServices(IServiceCollection services)\r\n        {\r\n            .\r\n            .\r\n            .\r\n            services.AddCors();\r\n            .\r\n            .\r\n            .\r\n        }\r\n        .\r\n        .\r\n        .\r\n    }\r\n<\/pre>\n<p>Bu i\u015flemden sonra bu servis arac\u0131l\u0131\u011f\u0131yla tan\u0131mlanan CORS politikas\u0131n\u0131 uygulamada devreye sokacak olan &#8216;UseCors&#8217; middleware&#8217;ini \u00e7a\u011f\u0131rmam\u0131z gerekmektedir. Lakin bu i\u015flemi, a\u015fa\u011f\u0131da t\u00fcr\u00fcne g\u00f6re tan\u0131mlama yapt\u0131\u011f\u0131m\u0131z CORS politikalar\u0131 yakla\u015f\u0131mlar\u0131nda tek tek hususi olarak inceleyece\u011fiz.<\/p>\n<p><strong>Genel CORS Politikas\u0131 Belirmele<\/strong><br \/>\nOrigin&#8217;i yahut header&#8217;\u0131 ne olursa olsun client ay\u0131rmaks\u0131z\u0131n yap\u0131lan t\u00fcm isteklerin ba\u015far\u0131yla kar\u015f\u0131lanabilece\u011fini ifade etti\u011fimiz CORS politikas\u0131d\u0131r.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n         services.AddCors(options =&gt;\r\n              options.AddDefaultPolicy(builder =&gt;\r\n              builder.AllowAnyHeader().AllowAnyMethod().AllowAnyOrigin()));\r\n<\/pre>\n<p>G\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere &#8216;AllowAnyHeader&#8217;, &#8216;AllowAnyMethod&#8217; ve &#8216;AllowAnyOrigin&#8217; metotlar\u0131yla t\u00fcm clientlardan gelecek isteklere eri\u015fim izni verilmi\u015ftir.<\/p>\n<p>Bu \u015fekilde belirlenen CORS politikas\u0131n\u0131 kullanabilmek i\u00e7in uygulamada &#8216;UseRouting&#8217; ile &#8216;UseAuthentication&#8217; aras\u0131nda &#8216;UseCors&#8217; middleware&#8217;ini \u00e7a\u011f\u0131rmam\u0131z yeterli olacakt\u0131r.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n      public void Configure(IApplicationBuilder app, IWebHostEnvironment env)\r\n      {\r\n         app.UseRouting();\r\n         app.UseCors();\r\n         app.UseAuthentication();\r\n         app.UseEndpoints(endpoints =&gt;\r\n         {\r\n            endpoints.MapControllers();\r\n         });\r\n      }\r\n<\/pre>\n<p><strong>Belirli Bir Hedefe CORS Politikas\u0131 Belirleme<\/strong><br \/>\nSadece belirlenen clientlardan gelen istekleri kar\u015f\u0131layan CORS politikas\u0131d\u0131r.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n         services.AddCors(options =&gt;\r\n                options.AddPolicy(&quot;myclients&quot;, builder =&gt;\r\n                    builder.WithOrigins(&quot;https:\/\/localhost:1453&quot;, &quot;http:\/\/localhost:1453&quot;).AllowAnyMethod().AllowAnyHeader()));\r\n<\/pre>\n<p>Yukar\u0131daki kod blo\u011funu incelerseniz e\u011fer; &#8216;WithOrigins&#8217; metodu ile belirli originlere izin verilmektedir.<\/p>\n<p>Bu \u015fekilde belirlenen CORS politikas\u0131nda ise &#8216;UseCors&#8217; a\u015fa\u011f\u0131daki gibi yine &#8216;UseRouting&#8217; ile &#8216;UseAuthentication&#8217; aras\u0131nda kullan\u0131lmal\u0131d\u0131r.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n      public void Configure(IApplicationBuilder app, IWebHostEnvironment env)\r\n      {\r\n         app.UseRouting();\r\n         app.UseCors(&quot;myclients&quot;);\r\n         app.UseAuthentication();\r\n         app.UseEndpoints(endpoints =&gt;\r\n         {\r\n            endpoints.MapControllers();\r\n         });\r\n      }\r\n<\/pre>\n<p><strong>Subdomain&#8217;e Uygun CORS Politikas\u0131 Belirleme<\/strong><br \/>\nBelirtilen domaine ait t\u00fcm subdomainler&#8217;e gelen istekleri kar\u015f\u0131layacak CORS politikas\u0131d\u0131r.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n         services.AddCors(options =&gt;\r\n                options.AddPolicy(&quot;myclients&quot;, builder =&gt;\r\n                    builder.WithOrigins(&quot;https:\/\/*.example.com&quot;).SetIsOriginAllowedToAllowWildcardSubdomains()\r\n                    .AllowAnyHeader().AllowAnyMethod()\r\n                    ));\r\n<\/pre>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n         app.UseRouting();\r\n         app.UseCors(&quot;myclients&quot;);\r\n         app.UseAuthentication();\r\n<\/pre>\n<p><strong>Controller veya Action Seviyesinde CORS Politikas\u0131 Belirleme<\/strong><br \/>\nController seviyesinde CORS politikas\u0131 belirleyebilmek i\u00e7in \u00f6ncelikle ilgili politikan\u0131n tan\u0131mlanm\u0131\u015f olmas\u0131 gerekmektedir.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n         services.AddCors(options =&gt;\r\n                options.AddPolicy(&quot;myclients&quot;, builder =&gt;\r\n                    builder.WithOrigins(&quot;https:\/\/localhost:5002&quot;, &quot;https:\/\/localhost:44355&quot;).SetIsOriginAllowedToAllowWildcardSubdomains()\r\n                    .AllowAnyHeader().AllowAnyMethod()\r\n                    ));\r\n<\/pre>\n<p>Ard\u0131ndan &#8216;UseCors&#8217; middleware&#8217;ini Startup&#8217;da herhangi bir politikan\u0131n ismini belirlemeksizin bo\u015f olarak \u00e7a\u011f\u0131r\u0131yoruz. Nihayetinde ilgili politika controller yahut action seviyesinde verilecektir.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n         app.UseRouting();\r\n         app.UseCors();\r\n         app.UseAuthentication();\r\n<\/pre>\n<p>Son olarak ilgili controller ya da action&#8217;\u0131 &#8216;EnableCors&#8217; attribute&#8217;u ile i\u015faretliyoruz.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    &#x5B;ApiController]\r\n    &#x5B;Route(&quot;api\/&#x5B;controller]&quot;)]\r\n    &#x5B;EnableCors(&quot;myclients&quot;)]\r\n    public class ProductsController : ControllerBase\r\n    {\r\n        public string&#x5B;] GetProducts()\r\n        {\r\n            return new string&#x5B;] {\r\n                &quot;Telefon&quot;,\r\n                &quot;C\u00fczdan&quot;,\r\n                &quot;G\u00f6mlek&quot;,\r\n                &quot;Tablo&quot;\r\n            };\r\n        }\r\n    }\r\n<\/pre>\n<p><strong>CORS Politikas\u0131n\u0131 Action Baz\u0131nda Ge\u00e7ersiz K\u0131lma<\/strong><br \/>\nGenel yahut controller baz\u0131nda tan\u0131mlanan bir CORS politikas\u0131 varsa e\u011fer actionlarda ge\u00e7ersiz k\u0131lmak i\u00e7in &#8216;DisableCors&#8217; attribute&#8217;unu kullanabiliriz.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    &#x5B;ApiController]\r\n    &#x5B;Route(&quot;api\/&#x5B;controller]&quot;)]\r\n    &#x5B;EnableCors(&quot;myclients&quot;)]\r\n    public class ProductsController : ControllerBase\r\n    {\r\n        &#x5B;DisableCors]\r\n        public string&#x5B;] GetProducts()\r\n        {\r\n            return new string&#x5B;] {\r\n                &quot;Telefon&quot;,\r\n                &quot;C\u00fczdan&quot;,\r\n                &quot;G\u00f6mlek&quot;,\r\n                &quot;Tablo&quot;\r\n            };\r\n        }\r\n    }\r\n<\/pre>\n<p>\u0130lgilenenlerin faydalanmas\u0131 dile\u011fiyle&#8230;<br \/>\nSonraki yaz\u0131lar\u0131mda g\u00f6r\u00fc\u015fmek \u00fczere&#8230;<br \/>\n\u0130yi \u00e7al\u0131\u015fmalar&#8230;<\/p>\n<!-- AddThis Advanced Settings generic via filter on the_content --><!-- AddThis Share Buttons generic via filter on the_content -->","protected":false},"excerpt":{"rendered":"<p>Merhaba, Web Browserlar varsay\u0131lan olarak bir web sayfas\u0131 \u00fczerinden farkl\u0131 bir domaine request ger\u00e7ekle\u015ftirildi\u011fi zaman g\u00fcvenlik amac\u0131yla bu iste\u011fi reddederler. B\u00f6ylece her web sitenin sade ve sadece kendi domaini alt\u0131ndaki adreslere istek yapabilmesini sa\u011flayarak,&#46;&#46;&#46;<!-- AddThis Advanced Settings generic via filter on get_the_excerpt --><!-- AddThis Share Buttons generic via filter on get_the_excerpt --><\/p>\n","protected":false},"author":1,"featured_media":15517,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3102,2898,3103],"tags":[3471,3472,3473,3475,3474],"class_list":["post-15503","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-asp-net-core","category-asp-net-core-3-0","category-asp-net-core-3-1","tag-asp-net-core-cors","tag-cors-politikasi","tag-cross-origin-resource-sharing","tag-orjinler-arasi-kaynak-paylasimi","tag-same-origin-policy"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/15503","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/comments?post=15503"}],"version-history":[{"count":44,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/15503\/revisions"}],"predecessor-version":[{"id":15549,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/15503\/revisions\/15549"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media\/15517"}],"wp:attachment":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media?parent=15503"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=15503"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=15503"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}