Ne yapmaya çalışıyorum
Azure Ücretsiz Planında (Kaynak Kodu: https://github.com/killerrin/Portfolio-Backend ) barındırılan bir arka uç ASP.Net Core Web API'm var .
Ayrıca bu API'yı tüketmek istediğim bir Müşteri Web Sitem var. İstemci Uygulaması Azure'da barındırılmayacak, aksine Github Sayfalarında veya erişebileceğim başka bir Web Hosting Hizmetinde barındırılacaktır. Bu nedenle alan adları sıralanmayacaktır.
Buna baktığımda, Web API tarafında CORS'yi etkinleştirmem gerekiyor, ancak şimdi birkaç saat boyunca hemen hemen her şeyi denedim ve çalışmayı reddediyor.
İstemci Kurulumu var React.js'de yazılmış basit bir istemci. Jquery AJAX aracılığıyla API'leri arıyorum. React sitesi çalışır, bu yüzden biliyorum. Jquery API çağrısı Deneme 1'de onayladığım şekilde çalışıyor. İşte çağrıları nasıl yapacağım
var apiUrl = "http://andrewgodfroyportfolioapi.azurewebsites.net/api/Authentication";
//alert(username + "|" + password + "|" + apiUrl);
$.ajax({
url: apiUrl,
type: "POST",
data: {
username: username,
password: password
},
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (response) {
var authenticatedUser = JSON.parse(response);
//alert("Data Loaded: " + authenticatedUser);
if (onComplete != null) {
onComplete(authenticatedUser);
}
},
error: function (xhr, status, error) {
//alert(xhr.responseText);
if (onComplete != null) {
onComplete(xhr.responseText);
}
}
});
Ne denedim
Deneme 1 - 'Doğru' yol
https://docs.microsoft.com/en-us/aspnet/core/security/cors
Microsoft Web sitesindeki bu öğreticiyi bir T'ye kadar takip ettim, Startup.cs'ta Global olarak etkinleştirmenin tüm 3 seçeneğini deniyorum, her denetleyicide Kuruyor ve her Eylemde Deniyorum.
Bu yöntemin ardından, Etki Alanları Arası çalışır, ancak yalnızca tek bir denetleyicide tek bir Eylem üzerinde (AccountController'a POST). Diğer her şey için, Microsoft.AspNetCore.Cors
ara katman yazılımı üstbilgileri ayarlamayı reddeder.
Ben yüklü Microsoft.AspNetCore.Cors
Nuget içinden ve versiyonudur1.1.2
Startup.cs içinde nasıl kurulum var
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
// Add Cors
services.AddCors(o => o.AddPolicy("MyPolicy", builder =>
{
builder.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader();
}));
// Add framework services.
services.AddMvc();
services.Configure<MvcOptions>(options =>
{
options.Filters.Add(new CorsAuthorizationFilterFactory("MyPolicy"));
});
...
...
...
}
// This method gets called by the runtime. Use this method to configure
//the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env,
ILoggerFactory loggerFactory)
{
loggerFactory.AddConsole(Configuration.GetSection("Logging"));
loggerFactory.AddDebug();
// Enable Cors
app.UseCors("MyPolicy");
//app.UseMvcWithDefaultRoute();
app.UseMvc();
...
...
...
}
Gördüğünüz gibi her şeyi söylediğim gibi yapıyorum. MVC'den önce iki kez Cors ekliyorum ve bu işe yaramadığında [EnableCors("MyPolicy")]
her denetleyiciyi bu şekilde koymaya çalıştım
[Route("api/[controller]")]
[EnableCors("MyPolicy")]
public class AdminController : Controller
Deneme 2 - Brute Forcing
https://andrewlock.net/adding-default-security-headers-in-asp-net-core/
Önceki denemede birkaç saat denedikten sonra, üstbilgileri manuel olarak ayarlamaya çalışarak bruteforce yapmaya çalışacağımı ve her yanıtta çalışmaya zorlayacağımı düşündüm. Bunu el ile her yanıta başlık eklemek için bu öğretici aşağıdaki yaptı.
Bunlar eklediğim başlıklar
.AddCustomHeader("Access-Control-Allow-Origin", "*")
.AddCustomHeader("Access-Control-Allow-Methods", "*")
.AddCustomHeader("Access-Control-Allow-Headers", "*")
.AddCustomHeader("Access-Control-Max-Age", "86400")
Bunlar denediğim ve başarısız olan diğer başlıklar
.AddCustomHeader("Access-Control-Allow-Methods", "GET, POST, PUT, PATCH, DELETE")
.AddCustomHeader("Access-Control-Allow-Headers", "content-type, accept, X-PINGOTHER")
.AddCustomHeader("Access-Control-Allow-Headers", "X-PINGOTHER, Host, User-Agent, Accept, Accept: application/json, application/json, Accept-Language, Accept-Encoding, Access-Control-Request-Method, Access-Control-Request-Headers, Origin, Connection, Content-Type, Content-Type: application/json, Authorization, Connection, Origin, Referer")
Bu yöntemle Siteler arası başlıklar düzgün bir şekilde uygulanıyor ve geliştirici konsolumda ve Postacı'da görünüyorlar. Sorun ancak geçerken olmasıdır Access-Control-Allow-Origin
çek webbrowser (sanırım) bir hissy uygun atar Access-Control-Allow-Headers
belirten415 (Unsupported Media Type)
Yani kaba kuvvet yöntemi de işe yaramıyor
En sonunda
Herkes bu işe aldı ve bir el ödünç olabilir, ya da sadece doğru yönde beni işaret edebiliyor mu?
DÜZENLE
Bu yüzden API çağrıları geçmek için, JQuery kullanmayı durdurmak ve bir Saf Javascript XMLHttpRequest
formatına geçmek zorunda kaldı .
Deneme 1
Ben önce koyarak Yöntem Microsoft.AspNetCore.Cors
dışında MindingData yanıt takip ederek işe başardı .Configure
app.UseCors
app.UseMvc
Ayrıca, options.AllowAnyOrigin()
joker karakter desteği için Javascript API Solution ile karıştırıldığında da çalışmaya başladı.
Deneme 2
Bu yüzden Deneme 2'yi (kaba zorlama) işe almayı başardım ... Wildcard'ın Access-Control-Allow-Origin
işe yaramadığı tek istisna dışında ve bu nedenle ona erişimi olan etki alanlarını manuel olarak ayarlamalıyım.
Bu WebAPI'nin herkese geniş olarak açılmasını istediğim için ideal değil, ancak en azından benim için ayrı bir sitede çalışıyor, yani bir başlangıç
app.UseSecurityHeadersMiddleware(new SecurityHeadersBuilder()
.AddDefaultSecurePolicy()
.AddCustomHeader("Access-Control-Allow-Origin", "http://localhost:3000")
.AddCustomHeader("Access-Control-Allow-Methods", "OPTIONS, GET, POST, PUT, PATCH, DELETE")
.AddCustomHeader("Access-Control-Allow-Headers", "X-PINGOTHER, Content-Type, Authorization"));
415 (Unsupported Media Type)
konuyla bir setContent-Type
isteği başlığını içinapplication/json
.