#ajax #asp.net-mvc
#ajax #asp.net-mvc
Вопрос:
Я пытаюсь выяснить, как предотвратить появление ошибки cors в инструментах разработчика. Я получаю ошибку cors, когда я использую приложение, но на другой вкладке / окне я выхожу из этого приложения, но затем возвращаюсь на другую вкладку и пытаюсь выполнить работу. Ниже приведен мой вызов ajax.
function RemoveScholarshipRequest(id, name) {
if (confirm("Are you sure you want to delete the scholarship request for " name "?")) {
var dataSource = $('#Pending').data('kendoGrid').dataSource;
$.ajax({
type: "POST",
url: '@Url.Action("RemoveRequest", "Admin")',
data: {id: id}
}).done(function (response, data, xhr) {
if (response.success) {
dataSource.read();
alert(response.responseText);
}
else if (!response.success) {
if (response.responseText === "Not Authenticated")
alert(response.responseText);
console.log("error", data.status);
//This shows status message eg. Forbidden
console.log("STATUS: " JSON.stringify(xhr.status));
}
}).fail(function (response) {
console.log(response);
console.log(JSON.stringify(response));
//window.location.href = "/forms/ScholarshipDisbursement/Admin/PendingRequests";
});
}
}
Действие контроллера, которое вызывает вышеупомянутый метод ajax, приведено ниже:
[AllowAnonymous]
[HttpPost]
public ActionResult RemoveRequest(string id)
{
if (!User.Identity.IsAuthenticated)
{
return Json(new { success = false, responseText = "Not Authenticated" }, JsonRequestBehavior.AllowGet);
}
if (User.IsInRole("Developer") || User.IsInRole("BannerAdmin"))
{
new ScholarshipRequestStore().DeleteScholarshipRequest(id);
return Json(new { success = true, responseText = "Successfully deleted" }, JsonRequestBehavior.AllowGet);
}
else
{
return Json(new { success = false, responseText = "You are not an authorized user" }, JsonRequestBehavior.AllowGet);
}
}
Один из способов обойти ошибку cors — это ввести AllowAnonymous в метод, а затем проверить аутентификацию в самом методе, но мне не очень нравится эта идея. Есть ли другой способ решить эту проблему?
Ответ №1:
Разрешить анонимный не решит эту проблему, вместо этого вам нужно отправить заголовок allow origin в вашем api. Вы можете сделать это, включив CORs в классе startup следующим образом
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();
...
...
...
}
а затем с помощью атрибута «Включить cors» на вашем контроллере
[EnableCors("MyPolicy")]
[AllowAnonymous]
[HttpPost]
public ActionResult RemoveRequest(string id)
прочтите это, чтобы лучше понять https://learn.microsoft.com/en-us/aspnet/core/security/cors?view=aspnetcore-2.2
Примечание: Я разрешил любому источнику взаимодействовать с API, вы можете указать любой источник, который вы хотите, например «https://example.com«
Ответ №2:
AllowAnonymous не разрешит запрос «из разных источников». Проблема, с которой вы сталкиваетесь, связана с тем, что при просмотре с вкладками в вашем браузере имеется общее хранилище аутентифицированных сеансов. При выходе из системы на вкладке 1 файл cookie сеанса удаляется, а затем вкладка 2 больше не аутентифицируется. Вот почему AllowAnonymous «работает», потому что без текущего сеанса аутентификации вы анонимный пользователь.
CORS, с другой стороны, — это когда вы разрешаете вызовы http://myservice.com поступать с другого хоста, напримерhttp://myclient.com . Анонимный доступ не окажет на это никакого влияния.