Как обрабатывать несанкционированный вызов ajax - PullRequest
0 голосов
/ 14 марта 2019

Я пытаюсь выяснить, как предотвратить появление ошибки 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 наметод, а затем проверка на подлинность в самом методе, но мне не очень нравится эта идея.Есть ли другой способ решения этой проблемы?

Ответы [ 2 ]

1 голос
/ 15 марта 2019

Разрешить анонимный не решит эту проблему, вместо этого вам нужно отправить заголовок разрешения происхождения в вашем API. Вы можете сделать это, включив COR в классе запуска следующим образом

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();

        ...
        ...
        ...
    } 

и затем с помощью атрибута «Enable cors» на вашем контроллере

[EnableCors("MyPolicy")]
[AllowAnonymous]
 [HttpPost]
public ActionResult RemoveRequest(string id)

прочитайте это для лучшей идеи https://docs.microsoft.com/en-us/aspnet/core/security/cors?view=aspnetcore-2.2

Примечание: я разрешил любому источнику общаться с API, вы можете указать любой источник, какой захотите "https://example.com"

0 голосов
/ 14 марта 2019

AllowAnonymous не будет обрабатывать запрос "перекрестного происхождения". Проблема, которую вы получаете, связана с просмотром вкладок в вашем браузере, имеющим общее хранилище аутентифицированных сеансов. Когда вы выходите из системы на вкладке 1, cookie сеанса удаляется, а затем вкладка 2 больше не проходит проверку подлинности. Вот почему AllowAnonymous «работает», потому что без текущего сеанса с проверкой подлинности вы являетесь анонимным пользователем.

CORS, с другой стороны, это когда вы разрешаете звонить на http://myservice.com с другого хоста, например http://myclient.com. Анонимный доступ не влияет на это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...