如何在 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请求正常工作,您可以禁用防伪令牌验证(用于测试目的)。
上下文
我已经在启动时为我的所有路由成功启用了 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请求正常工作,您可以禁用防伪令牌验证(用于测试目的)。