ASP.NET Web API 2’de İsteklere İzin Verme

Tarayıcı güvenliği için bir web sayfasıdan başka bir web sayfasına AJAX isteklerini engeller. Bu hassas verilerin korunmasını sağlar. Bazen de API çağrılarına izin vermek isteyebilirsiniz.

İzin vermek için W3C standartı olan CORS kullanırız. CORS bize istek yapanları, metodları ve headerları filtrelememize olanak verir.

İlk önce NuGet ile CORS paketini projemize dahil ediyoruz. Benim kullandığım 5.2.6 versiyonudur.

Install-Package Microsoft.AspNet.WebApi.Cors

WebApiConfig.cs dosyasında global bir denetleme yapacaksak Global.asax dosyasımızda aşağıdaki satırın ekli olduğundan emin oluyoruz.

protected void Application_Start()
{
    GlobalConfiguration.Configure(WebApiConfig.Register);
}

CORS global olarak etkinleştirmek istiyorsanız, WebApiConfig.cs dosyamızda aşağıdaki satırları ekliyoruz.

public static void Register(HttpConfiguration config)
{
    EnableCorsAttribute cors = new EnableCorsAttribute(origins: "http://site.com, http://site1.com", headers: "Origin, X-Requested-With, Content-Type, Accept ", methods: "GET, POST");
    config.EnableCors(cors);
}

CORS Attribute dikkat ederseniz size üç filtre sunmaktadır. Yukarıdaki örnekteki gibi origins, headers ve methods değerleri belirtebilir veya joker karakteri (*) ile her şeye izin verebilirsiniz.

CORS global olarak izin verebileceğiniz gibi Controller veya Method seviyesinde de izin verebilirsiniz.

public class ValuesController : ApiController
{
    [HttpGet]
    [EnableCors(origins:"*", headers:"*", methods: "*")]
    public string Value()
    {
        return "Value";
    }
}
[EnableCors(origins:"*", headers:"*", methods: "*")]
public class ValuesController : ApiController
{
    [HttpGet]
    public string Value()
    {
        return "Value";
    }
}

Burada unutmamız gereken iki nokta var.

  1. Controller veya method seviyesinde uyguladığımız CORS, Global olarak uyguladığımız CORS’u geçersiz kılar.
  2. Web.Config’de de CORS için ayar bulunmamalıdır. Biz projemizde bu maddede çok sıkıntı çekmiştik 🙂
<system.webServer>
    <httpProtocol>
      <!--<customHeaders>
        <add name="Access-Control-Allow-Origin" value="*" />
        <add name="Access-Control-Allow-Methods" value="GET, POST, OPTIONS" />
        <add name="Access-Control-Allow-Headers" value="Origin, X-Requested-With, Content-Type, Accept, X-Csrf-Token, Authorization" />
        <add name="Access-Control-Allow-Credentials" value="true" />
      </customHeaders>-->
    </httpProtocol>
    <handlers>
      <!--<remove name="WebDAV" />
      <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
      <remove name="OPTIONSVerbHandler" />
      <remove name="TRACEVerbHandler" />
      <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />-->
    </handlers>
  </system.webServer>

Bir Cevap Yazın