Dodałem również do przeglądarki wtyczkę CORS i dla opcji GET oraz INSERT jest ok, a dla DELETE niestety nie działa :(
Nic nie dodawaj do przeglądarki, to są headery, które serwer ma wysłać do przeglądarki, dzięki temu przeglądarka wie z jakich adresów może wykonywać zapytania pod te api, a z jakich ma nie zezwalać, domyślnie jest nie zezwalaj jeśli adres z jakiego wykonuje się zapytanie jest inny niż adres serwera.
Origins ustawiasz jako adres frontendu, gwiazda zezwala na dowolny adres.
using System.Web.Http;
using System.Web.Http.Cors;
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// Enable CORS for all origins, headers, and methods.
var cors = new EnableCorsAttribute("*", "*", "*");
config.EnableCors(cors);
// other configuration settings...
}
}
Można też atrybutem ustawić
using System.Web.Http;
using System.Web.Http.Cors;
[EnableCors("*", "*", "*")]
public class YourApiController : ApiController
{
// Your controller actions...
}
Akurat nie znam za bardzo c#, kod przekopiowałem do chatGPT.
CORS działa tylko w przeglądarkach jako zabezpieczenie użytkownika, bo tak z innej strony np. evil page, ktoś wyśle do twojego api zapytanie, a http only cookies authoryzujące potwierdzą tożsamość i tak wykonasz niebezpieczne zapytanie hakując użytkowników.
Też nie chroni to wszystkiego, a tylko przed niektórymi atakami.
Jak będą po stronie frontu trzymane credentialse to nic takiego się nie stanie, po to jest CORS, żeby ktoś z obcej strony POST.
Nadal nie działa mi coś :(
Program.cs dla ASP.NET Core (localhost:5000)
var MyAllowSpecificOrigins = "_myAllowSpecificOrigins";
builder.Services.AddCors(options =>
{
options.AddPolicy(name: MyAllowSpecificOrigins,
policy =>
{
policy.WithOrigins("http://localhost:44402",
"http://10.0.0.3:44402")
.AllowAnyHeader()
.AllowCredentials()
.AllowAnyMethod();
});
});
app.UseCors(MyAllowSpecificOrigins);
Ksiegowosc.cs - Controller - ASP.NET Core
[EnableCors("MyAllowSpecificOrigins")]
[HttpDelete("deletebill")]
public async Task<IActionResult> DeleteBill([FromBody] DeleteRecord body)
{
Response.Headers.Add("Access-Control-Allow-Origin", "*");
Response.Headers.Add("Access-Control-Allow-Headers", "*");
Response.Headers.Add("Access-Control-Allow-Methods", "DELETE,OPTIONS");
var record = await _dbContext.rachunki.FirstOrDefaultAsync(data => data.id == body.id);
_dbContext.rachunki.Remove(record);
await _dbContext.SaveChangesAsync();
var response = new { status = "OK" };
return Ok(response);
}
plik program.js dla frontendu (React) (localhost:44402)
fetch(sciezka_bazy + '/deletebill',params)
.then((response) => response.json())
.then((result) => {
if (result.k) {
Przycisk_Odswiez();
Swal.fire('Rekord został usunięty!', '', 'success');
}
})
.catch((error) => {
Swal.fire('Rekord nie został usunięty nie został dodany!', '', 'error');
console.error('Error:', error);
});
}
Na końcu w przeglądarce otrzymuje taki błąd:
Access to fetch at 'http://localhost:5000/ksiegowosc/deletebill' from origin 'http://localhost:44402' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: It does not have HTTP ok status.