Internet Explorer 11'de AngularJs uygulamasında web api çağrımlarında, asıl metod çağrımı öncesi OPTIONS metodu ile sunucuya istek yapılır.
OPTIONS metodu ile dönen response header uygun olmazsa aşağıdaki gibi hata vermektedir.
"SEC7123: authorization istek başlığı Access-Control-Allow-Headers listesinde yoktu."
"SCRIPT7002: XMLHttpRequest: Ağ Hatası 0x80070005, Erişim engellendi."
Bu hatanın nedeni OPTIONS metodu ile gelen request header'a uygun olarak response header'da uygun değer olmamasıdır. Access-Control-Allow-Headers response header değerini * şeklinde yapmak da hatayı çözmemektedir. * değeri atamak, Google Chrome browser ile çalışıyor ancak Internet Explorer 11'de aynı hatayı vermektedir.
--
https://api.ishakkulekci.com/auth/token adresli api'ye OPTIONS metoduyla request yapılır. Gelen Giden request bilgileri aşağıdaki gibidir ancak Internet Explorer 11 yukarıda belirtilen hataları vermektedir. Google Chrome'dan sorun olmamaktadır.
Request Header Bilgileri:
Accept: */*
Accept-Encoding: gzip, deflate
Access-Control-Request-Headers: authorization, content-type, accept
Access-Control-Request-Method: POST
Cache-Control: no-cache
Connection: Keep-Alive
Content-Length: 0
Host: api.b2becommerce.btpro.io
Origin: https://ishakkulekci.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko
Response Header Bilgileri:
Access-Control-Allow-Credentials: true
Access-Control-Allow-Headers: *
Access-Control-Allow-Methods: *
Access-Control-Allow-Origin: *
Cache-Control: no-cache, no-store, must-revalidate
Connection: Keep-Alive
Content-Length: 0
Date: Thu, 01 Feb 2018 16:21:34 GMT
Expires: 0
Keep-Alive: timeout=5, max=100
Pragma: no-cache
Server: Microsoft-IIS/8.5
--
Hatanın Çözümü:
Access-Control-Allow-Headers response header değeri = Access-Control-Request-Headers request header değeri
şeklinde olmalıdır.
ASP.NET Web API'da çözüm:
public SimpleAuthorizationServerProvider()
{
OnMatchEndpoint = async context =>
{
if (context.OwinContext.Request.Method == "OPTIONS")
{
await Task.Run(() =>
{
if (context.OwinContext.Response.Headers.ContainsKey("Access-Control-Allow-Methods"))
{
context.OwinContext.Response.Headers["Access-Control-Allow-Methods"] = "*";
}
else
{
context.OwinContext.Response.Headers.Add("Access-Control-Allow-Methods", new[] { "*" });
}
if (context.OwinContext.Response.Headers.ContainsKey("Access-Control-Allow-Headers"))
{
context.OwinContext.Response.Headers["Access-Control-Allow-Headers"] = context.OwinContext.Request.Headers["Access-Control-Request-Headers"];
}
else
{
context.OwinContext.Response.Headers.Add("Access-Control-Allow-Headers", new[] { context.OwinContext.Request.Headers["Access-Control-Request-Headers"] });
}
if (context.OwinContext.Response.Headers.ContainsKey("Access-Control-Allow-Origin"))
{
context.OwinContext.Response.Headers["Access-Control-Allow-Origin"] = "*";
}
else
{
context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new[] { "*" });
}
context.OwinContext.Response.StatusCode = 200;
context.RequestCompleted();
});
}
};
...
...
Kaynaklar:
--
Pay special attention to the Access-Control-Allow-Headers response header. The value of this header should be the same headers in the Access-Control-Request-Headers request header, and it can not be '*'.
--
https://www.codeproject.com/questions/1060149/how-to-deal-with-preflight-response-in-cors