【问题标题】:How to enable CORS only for a given route (page) in ASP.NET Razor Pages?如何仅为 ASP.NET Razor 页面中的给定路由(页面)启用 CORS?
【发布时间】:2020-08-04 06:31:39
【问题描述】:

上下文

我已经在启动时成功为我的所有路由启用了 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 中访问

如果它是一个 ASP.MVC 核心 Web 应用程序,我会在 Controller 类或 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();
});

但这显然会呈现响应“回声”而不是我的页面内容...

【问题讨论】:

    标签: asp.net-core razor cors razor-pages


    【解决方案1】:

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

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

    <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 请求正常工作,您可以禁用防伪令牌验证(用于测试目的)。

    【讨论】:

      猜你喜欢
      • 2019-05-22
      • 2023-03-24
      • 2020-05-06
      • 1970-01-01
      • 2020-05-06
      • 2018-01-31
      • 2018-10-18
      • 2020-05-25
      • 2018-12-04
      相关资源
      最近更新 更多