Как включить CORS только для данного маршрута (страницы) в ASP. NET Razor Pages? - PullRequest
0 голосов
/ 21 апреля 2020

Контекст

Я успешно включил CORS для всех своих маршрутов при запуске , и он работает :

services.AddCors(options =>
{
    options.AddPolicy("MyAllowPolicy",
        builder =>
        {
            builder.WithOrigins("https://www.sample.hostname.com")
                .AllowAnyMethod()
                .AllowAnyMethod();
        });
});
// ...
app.UseCors("MyAllowPolicy");

Вопрос

Я хотел бы быть как можно менее защищенным, поэтому я хотел бы разрешить CORS только определенную c страницу, которая находится в / Pages / MyFolder / MyPage и доступна в маршруте / MyFolder / MyPage

Если бы это было базовое веб-приложение ASP. MVC, я бы использовал [EnableCors("MyAllowPolicy")] либо в классе Controller, либо в методе Action. Однако это веб-приложение ASP. NET Core 3.1 Pages.

Как включить политику CORS только для / Pages / MyFolder / MyPage?

Что я До сих пор пробовал:

Куда бы я ни посмотрел, я нашел только этот пример:

app.UseCors(); // void parameter
//...

app.UseEndpoints(endpoints =>
{
    endpoints.MapGet("/MyFolder/MyPage",
        context => context.Response.WriteAsync("hello"))
        .RequireCors("MyAllowPolicy");

        endpoints.MapControllers()
                 .RequireCors("MyAllowPolicy");

        endpoints.MapRazorPages();
});

, но это, очевидно, делает ответ "эхо" вместо содержимого моей страницы ...

1 Ответ

0 голосов
/ 26 апреля 2020

Как включить политику CORS только для / Pages / MyFolder / MyPage?

Вы можете применить атрибут [EnableCors] к PageModel Razor Page, чтобы включить CORS для указания c метод (ы) обработчика, который вы определяете в этом указанном c классе PageModel, как показано ниже.

<script>
    $(function () {
        $.ajax({
            type: "POST",
            url: "https://xxx/MyFolder/MyPage?handler=ShowMes",
            contentType: "application/json",
            data: JSON.stringify("hello world"),
            success: function (data) {
                console.log(data);
            }
        });
    })
</script>

метод обработчика

[EnableCors("MyAllowPolicy")]
public class MyPageModel : PageModel
{
    public void OnGet()
    {

    }

    public ActionResult OnPostShowMes([FromBody]string mes)
    {
        //code logic here

        return Content($"You sent '{mes}'");
    }
}

Результат теста

1) Не включить CORS

enter image description here

2) Применить атрибут [EnableCors] к MyPageModel

enter image description here

Кроме того, обратите внимание: Проверка токена защиты от подделки * Проверка 1031 * может привести к сбою запроса ajax, чтобы запрос ajax успешно отправлен, вы можете отключить функцию защиты от подделки проверка токена (для тестирования).

...