## 如何在後端 API 加 header ### 法一:自訂 CORS 原則提供者 在 **startup.cs** 中加入 ```csharp // Configure() 內加 app.UseCors("CorsPolicy"); //ConfigureServices() 內加 services.AddCors(o => o.AddPolicy("CorsPolicy", p => p.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader())); ``` ### 法二:add at **web.config** only For IIS 7.5 ```htmlembedded <system.webServer> <httpProtocol> <customHeaders> <add name="Access-Control-Allow-Origin" value="http://www.yourSite.com" /> <add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE, OPTIONS"/> <add name="Access-Control-Allow-Headers" value="Origin, X-Requested-With, Content-Type, Accept" /> </customHeaders> </httpProtocol> ``` ### 法三:use package **Microsoft.AspNet.WebApi.Cors** 1. Install-Package **Microsoft.AspNet.WebApi.Cors** 2. Add this code in **WebApiConfig.cs** ```csharp public static void Register(HttpConfiguration config) { // Web API configuration and services // Web API routes config.EnableCors(); config.MapHttpAttributeRoutes(); config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional } ); } ``` 3. Add code in Api Controller ```csharp [EnableCors(origins: "*", headers: "*", methods: "*")] public class HomeController : ApiController { [HttpGet] [Route("api/Home/test")] public string test() { return ""; } } ``` ## http header 種類 * `Access-Control-Allow-Origin`:允許哪些網址可以跨網域使用此資源。 同源需要 schema(protocol) + host + port 都相同才行。schema:http, https Eg. http://web.com.tw 或給 * 允許所有來源可以跨域存取。 ex. `Access-Control-Allow-Origin: *` * `Access-Control-Allow-Credentials`:當前端API request需要帶cookies時,就須此屬性並將值設定為true,預設為false。另外,當此屬性設定為true時,`Access-Control-Allow-Origin`則不能設定為* ex. `Access-Control-Allow-Credentials:true` * `Access-Control-Allow-Methods`:支援的Method有哪些(POST, GET, PUT, DELETE...) ex. `Access-Control-Allow-Methods:POST, GET, PUT, DELETE` * `Access-Control-Allow-Headers`:允許哪些自定義的header ex. `Access-Control-Allow-Headers: Authorization` * `Access-Control-Max-Age`:preflight request的資訊(包含`Access-Control-Allow-Methods`和 `Access-Control-Allow-Headers` 可以cache的秒數上限(單位:秒)。每一個瀏覽器會有預設的最大值 ,當 `Access-Control-Max-Age` 大於預設值時,會優先採用預設值。 ex. `Access-Control-Max-Age: 600` // Cache results of a preflight request for 10 minutes * `Access-Control-Expose-Headers`:表示API Server允許瀏覽器存取response header的白名單 ex. `Access-Control-Expose-Headers:X-My-Custom-Header` //表示瀏覽器能夠存取response當中的 X-My-Custom-Header ## 相關網址 [API串接常見問題 - CORS - 鐵人賽系列篇](https://ithelp.ithome.com.tw/articles/10267360) [How to implement "Access-Control-Allow-Origin" header in asp.net](https://stackoverflow.com/questions/6516591/how-to-implement-access-control-allow-origin-header-in-asp-net) [自訂 CORS 原則提供者 - 官方網址](https://learn.microsoft.com/zh-tw/aspnet/web-api/overview/security/enabling-cross-origin-requests-in-web-api#custom-cors-policy-providers)