同源政策(Same Origin Policy)是瀏覽器的一種機制,用來限制限制其他域名存取自身網站的資源,避免被任意網頁讀取其他網站的敏感資料。
在同源政策的限制下,瀏覽器通常會限制AJAX Request發出到不同源的URL。但是有時候我們開發的API可能需要讓其他網站呼叫,或是內部前後端分離使用的是不同的域名,這時候就會需要CORS。
CORS(Cross-Origin Resource Sharing,中文:跨來源資源共用),用於讓網頁的受限資源能夠被其他域名的頁面存取的一種機制。使用CORS可以讓伺服器來決定自己的Web API 允許特定來源執行跨來源要求(Cross-Origin Requests),並拒絕其他來源要求。
在ASP.NET Core中有三種方式可以啟用 CORS:
CORS Middleware會處理跨原始來源的要求。
下列程式碼會將 CORS 原則套用至具有指定來源的所有應用程式端點:
下面範例將示範在Middleware中設定CORS的預設政策
在Startup.ConfigureServices
加入CORS的設定
services.AddCors(options =>
{
options.AddDefaultPolicy(builder =>
{
builder.WithOrigins("http://www.sample.com",
"http://www.demo.com");
});
});
並在Startup.Configure
中設定 CORS 的 Middleware
app.UseCors(); //加上後會套用到全域
備註:UseCors的呼叫必須放在之後 UseRouting ,但在之前UseAuthorization。
如此就可以做好最基礎的CORS設定,並套用在整個網站當中。
除了使用預設的政策之外,還能設定多組政策並為每個政策加入識別的名稱
下面範例將示範在Middleware中設定CORS的命名政策
在Startup.ConfigureServices
加入CORS的設定
services.AddCors(options =>
{
options.AddPolicy(name: "CustomPolicy1",
builder =>
{
builder.WithOrigins("http://www.sample.com",
"http://www.demo.com");
});
options.AddPolicy(name: "CustomPolicy2",
builder =>
{
builder.WithOrigins("http://homepage.com");
});
});
並在Startup.Configure
中設定 CORS 的 Middleware
app.UseCors("CustomPolicy1"); //加上後會套用到全域
其中的名稱可以任意命名,沒在Middleware中設定的政策則不會被套用至全域。
CORS的設定,除了套用在全域之外,還可以針對特定Controller或是Action進行設定。
以下範例就來介紹[EnableCors] 屬性如何使用,Startup中的設定就沿用上一個範例。
備註:必須先加入using Microsoft.AspNetCore.Cors;
[EnableCors("CustomPolicy2")]
[Route("api/[controller]")]
[ApiController]
public class SampleController : ControllerBase
{
[HttpGet("")]
public ActionResult GetModels()
{
...
}
[DisableCors]
[HttpGet("{id}")]
public ActionResult GetModelById(int id)
{
...
}
}
上方的範例,在Controller中加入[EnableCors("Policy 名稱")],設定便會套用到底下所有的Action中,如果是想針對某個Action也可以只在Action上套用[EnableCors("Policy 名稱")],便會只將指定的CORS設定套在Action上,此外,對於不想要使用CORS的地方,也可以設定[DisableCors]屬性。
CORS也可以針對特定的路徑做設定Startup.ConfigureServices
中的設置沿用上方範例
並從Startup.Configure()
中作出以下設定
...
app.UseCors();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapGet("/map",
context => context.Response.WriteAsync("map"))
.RequireCors("CustomPolicy1");
endpoints.MapControllers()
.RequireCors("CustomPolicy2");
});
透過RequireCors()
可以針對不同端點路由去做設定。
以下範例為設置CORS政策的選項方式
在Startup.ConfigureServices
中的CORS設定在加入選項內容:
services.AddCors(options =>
{
options.AddDefaultPolicy(
builder =>
{
builder.WithOrigins("http://www.sample.com")
.SetIsOriginAllowedToAllowWildcardSubdomains()
.AllowAnyHeader()
.AllowAnyMethod();
});
});
SetIsOriginAllowedToAllowWildcardSubdomains()
為設定子網域成為原始的來源AllowAnyHeader()
為允許所有Request HeaderAllowAnyMethod()
為允許所有Http Method
CORS政策的選項有以下幾種選擇
詳細選項可參考CORS 政策選項
CORS的設定其實可以針對非常細節的選項去設定,透過這些設定可以更仔細地對於資源做到更詳細的把控!
參考資料
在 ASP.NET Core 中啟用跨原始來源要求 (CORS)