.net core api 跨域

什麼是跨域?javascript

跨域,指的是瀏覽器不能執行其餘網站的腳本。它是由瀏覽器的同源策略形成的,是瀏覽器對JavaScript施加的安全限制。php

所謂同源是指,域名,協議,端口均相同,不明白不要緊,舉個栗子:html

http://www.123.com/index.html 調用 http://www.123.com/server.PHP (非跨域)前端

http://www.123.com/index.html 調用 http://www.456.com/server.php (主域名不一樣:123/456,跨域)java

http://abc.123.com/index.html 調用 http://def.123.com/server.php (子域名不一樣:abc/def,跨域)jquery

http://www.123.com:8080/index.html 調用 http://www.123.com:8081/server.php (端口不一樣:8080/8081,跨域)ajax

http://www.123.com/index.html 調用 https://www.123.com/server.php (協議不一樣:http/https,跨域)json

請注意:localhost和127.0.0.1雖然都指向本機,但也屬於跨域。後端

瀏覽器執行javascript腳本時,會檢查這個腳本屬於哪一個頁面,若是不是同源頁面,就不會被執行。api

你能夠理解爲兩個域名之間不能跨過域名來發送請求或者請求數據,不然就是不安全的,這種不安全也就是CSRF(Cross-site request forgery),中文名稱:跨站請求僞造,也被稱爲:one click attack/session riding,縮寫爲:CSRF/XSRF。

一張圖解釋什麼是CSRF

跨域解決方案

能夠參考這篇文章:

https://www.cnblogs.com/wennice/p/7150461.html

因爲我後端用的是.net core api (.net core 2.2)在開發,開發中遇到的坑,記錄一下

最開始設置容許跨域,按網上的方法

在Startup 下 ConfigureServices 添加以下代碼,就是設置容許任何請求方法和網站跨域訪問

// 添加跨域訪問
            services.AddCors(options =>
            options.AddPolicy("AllowAnyOrigin",
                builder => builder.WithOrigins("*").AllowAnyMethod().AllowAnyHeader().AllowAnyOrigin().AllowCredentials()));

 

在Configure 方法 使用剛剛的配置項:

app.UseCors("AllowAnyOrigin");

發現控制器不拋異常,能夠跨域訪問,拋了異常 進入全局異常中間件裏面 ExceptionMiddleWare.cs

private static async Task WriteExceptionAsync(HttpContext context, Exception exception)
        {
            //返回友好的提示
            var response = context.Response;

            //狀態碼

            response.StatusCode = (int)HttpStatusCode.OK;
            response.ContentType = context.Request.Headers["Accept"];
            response.ContentType = "application/json";
            ApiResponseInfo apiResponse = new ApiResponseInfo();
            if (exception is ApiBaseException)
            {
                //用戶定義異常
                apiResponse.StatusCode = (exception as ApiBaseException).StatusCode;
                apiResponse.MessageText = (exception as ApiBaseException).MessageText;
            }
            else
            {
                apiResponse.StatusCode = "100000";
                apiResponse.MessageText = StatusCodesConfig.GetRemark(apiResponse.StatusCode);
                Log.LoggerUnit.Logger.WriteError("未知異常:", exception);
            }
            await response.WriteAsync(JsonConvert.SerializeObject(apiResponse)).ConfigureAwait(false);

        }
app.UseCors("AllowAnyOrigin"); 配置沒有生效,跨域的功能沒有了,前端ajax post 請求一直提示跨域問題報

Access to XMLHttpRequest at 'https://localhost:44357/api/**/GetPaging' from 
origin 'http://127.0.0.1:5500' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No
'Access-Control-Allow-Origin' header is present on the requested resource.

最後發現是以前設置了HTTP重定向app.UseHttpsRedirection();
沒有生效 須要設置HTTPS 的跨域功能,代碼以下:
app.UseHttpsRedirection().UseCors(builder =>
       builder.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader()); 
//或者
app.UseHttpsRedirection().UseCors("AllowAnyOrigin"); 

  

以後jquery.ajax 就能夠訪問了。


 

參考

https://www.cnblogs.com/wennice/p/7150461.html

相關文章
相關標籤/搜索