Как обработать неавторизованный вызов ajax

#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 . Анонимный доступ не окажет на это никакого влияния.