標籤:sub targe ons microsoft 實踐 config dir detail 安全
官方說明
- CORS means Cross-Origin Resource Sharing.
- Refer What is "Same Origin" Part
- Detailed Procedure
具體實踐
- 需要引入 Microsoft.AspNetCore.Mvc.Cors 包
- Cors配置
- Startup.cs檔案ConfigureServices方法中,將Cors服務放到容器中
- services.AddCors(options); 傳一個options,指定名字並配置它,這個時候跨域並沒有起作用。
- options可以對Origin、Header、Method進行指定,這些配置方式是fluent api。
- AllowAnyOrigin()表示允許任意的源、要求標頭、請求方式。
- 以配置AllowAnyOrigin()為例,回應標頭裡會有Access-Control-Allow-Origin:*
- WithOrigins(string[] origins)入參為允許存取的源、要求標頭、請求方式。
- 以配置AllowAnyOrigin()為例,回應標頭裡會有Access-Control-Allow-Origin:http://diagd.gridsumdissector.com
- AllowCredentials(),Response Header裡會有Access-Control-Allow-Credentials:true
- Cors生效(三選一,推薦第一種)
- Startup.cs檔案Config方法,給全域加上允許跨域,則所有的配置裡允許的資源(多為controller中的介面)都可以跨域訪問。
- app.UseCors("CorsPolicy"); //這裡“CorsPolicy”是自訂的名字,在options中設定。
- Startup.cs檔案ConfigureServices方法,給全域加上允許跨域,效果同上。
- services.Configure(options => options.Filters.Add(new CorsAuthorizationFilterFactory("CorsPolicy"))); //“CorsPolicy”同上。
- 在指定controller或方法上標註[EnableCors("CorsPolicy")],允許這些資源跨域訪問。//“CorsPolicy”同上上。
- 注意事項
- 由於前端通常都會將withCredential設定為true,所以配置時必須AllowCredentials()。
- XMLHttpRequest的withCredentials標誌設定為true,則cookies可以隨著請求發送。這時,如果伺服器端的響應中,如果沒有返回Access-Control-Allow-Credentials: true的回應標頭,那麼瀏覽器將不會把響應結果傳遞給發出請求的指令碼程式,以保證資訊的安全。
- Access-Control-Allow-Origin這個頭不允許使用萬用字元,即必須指定允許的網域,用WithOrigins(string[] origins)方法,origins建議在appsettings.json檔案配置。
- 如果一個目標網域設定成了允許任意域的跨域請求,這個請求又帶cookie的話,則請求不合法,瀏覽器會屏蔽掉返回的結果。(即如果需要實現帶cookie的跨域請求,需要明確的配置允許來源的域,使用任意域的配置是不合法的。)這是cors模型最後一道防線。假如沒有這個限制的話,那麼javascript就可以擷取返回資料中的csrf token,以及各種敏感性資料。這個限制極大的降低了cors的風險。
- 在appsettings.json中配置origins時,務必指定scheme、domain、subdomain、port,且末尾千萬不要加反斜線。"http://localhost:6395"
1.NET Core Web Api跨域問題