如何在 ASP.NET Razor Pages 中只为给定的路由(页面)启用 CORS?

How to enable CORS only for a given route (page) in ASP.NET Razor Pages?

上下文

我已经在启动时为我的所有路由成功启用了 CORS 并且它有效:

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

问题

我想尽可能不放松安全性,所以我想只允许 CORS 一个特定的页面,它在 /Pages/MyFolder/MyPage 中,并且可以在路由 /MyFolder/MyPage[= 中访问14=]

如果它是一个 ASP.MVC 核心 Web 应用程序,我会在控制器 class 或 Action 方法上使用 [EnableCors("MyAllowPolicy")]。但是,这是一个 ASP.NET Core 3.1 Pages Web 应用程序。

如何仅为 /Pages/MyFolder/MyPage 启用我的 CORS 策略?

目前我尝试过的:

到处都只找到这个样本:

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

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

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

        endpoints.MapRazorPages();
});

但这显然呈现了响应 "echo" 而不是我的页面内容...

How can I enable my CORS policy only for /Pages/MyFolder/MyPage?

您可以将 [EnableCors] 属性应用于 Razor 页面模型,以便为您在该特定页面模型中定义的特定处理程序方法启用 CORS class,如下所示。

<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

2)将 [EnableCors] 属性应用于 MyPageModel

此外,请注意Anti-forgery token验证会导致ajax请求失败,为了使您发送的ajax请求正常工作,您可以禁用防伪令牌验证(用于测试目的)。