asp.net core 系列之允許跨越訪問(Enable Cross-Origin Requests:CORS)

来源:https://www.cnblogs.com/Vincent-yuan/archive/2019/05/01/10798866.html
-Advertisement-
Play Games

這篇文章介紹如何允許跨域訪問 瀏覽器安全不允許不同功能變數名稱的網頁之間發送請求。這種限制叫做同源策略(the same-origin policy)。 同源策略可以防止一個惡意的站點讀取另一個站點的敏感數據。 有時候,你想允許網站發送跨域的請求到你的應用。 Cross Origin Resource Sh ...


 

這篇文章介紹如何允許跨域訪問

 

瀏覽器安全不允許不同功能變數名稱的網頁之間發送請求。這種限制叫做同源策略(the same-origin policy)。

同源策略可以防止一個惡意的站點讀取另一個站點的敏感數據。

有時候,你想允許網站發送跨域的請求到你的應用。

 

Cross Origin Resource Sharing ( CORS ) : 

  • 是一個W3C的標準;即允許放寬同源策略
  • 不是一個安全的功能,CORS 放寬了安全性。允許跨域,會讓API更不安全
  • 允許一個服務明確的允許一些跨域請求,而拒絕另外一些
  • 比早些的技術(例如JSONP)更安全,更靈活

 

1.那麼同源指的是什麼呢

如果兩個URLs是同源的,那麼它們有相同的協議,主機(功能變數名稱),埠

下麵兩個是同源的URLs:

  • https://example.com/foo.html
  • https://example.com/bar.html

下麵的這些相比於前面的兩個URL,有不同的源:

  • https://example.net – Different domain 不同的功能變數名稱
  • https://www.example.com/foo.html – Different subdomain 不同的子功能變數名稱
  • http://example.com/foo.html – Different scheme  不同的協議
  • https://example.com:9000/foo.html – Different port    不同的埠號

IE瀏覽器考慮同源問題的時候,不會考慮埠號

 

2.帶策略的CORS 和中間件

CORS中間件處理跨域請求。下麵的代碼允許指定的源能對整個應用進行跨域請求

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    readonly string MyAllowSpecificOrigins = "_myAllowSpecificOrigins";

    public IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {
     //AddCors方法的調用會把CORS服務加到應用的服務容器中(service container); services.AddCors(options
=> { options.AddPolicy(MyAllowSpecificOrigins, builder => { builder.WithOrigins("http://example.com", //CorsPolicyBuilder方法可以鏈式調用方法, "http://www.contoso.com"); }); }); services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2); } public void Configure(IApplicationBuilder app, IHostingEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } else { app.UseHsts(); } app.UseCors(MyAllowSpecificOrigins); //這個代碼會把CORS策略通過CORS中間件應用到這個應用的所有終端(endpoints);即把跨域作用到整個應用
//註意:1.UseCors必須在UseMvc之前被調用;2. URL末尾不能加/ ;這個url指的是
builder.WithOrigins(url)中的url



        app.UseHttpsRedirection();
        app.UseMvc();
    }
}

這段代碼做了下麵的操作

  • 設置策略名為_myAllowSpecificOrigins,這個名字是隨意取的
  • 調用UseCors 擴展方法來允許跨域
  • 調用帶有lambda表達式的 AddCors 方法。lambda表達式取得一個 CorsPlicyBuild對象,進行一些設置

 

CorsPolicyBuilder方法可以鏈式調用方法:

builder.WithOrigins("http://example.com",
                                "http://www.contoso.com")
                                .AllowAnyHeader()
                                .AllowAnyMethod();

 

測試跨域

 

3.使用[EnableCors]屬性設置允許跨域

[EnableCors]屬性提供了另一種方式設置跨域。即可以只設置選擇的終端,而不是所有的終端.

這裡不同於上面的那種方式,上面的方式是應用的所有終端都會被設置允許跨域;

而這裡只是設置了[EnableCors]屬性的終端;

 

使用[EnableCors]來指定預設的策略,而[EnableCors("{Policy String}")] 指定了特定的策略;

 

[EnableCors]屬性應用於:

  • Razor Page PageModel
  • Controller
  • Controller action method

 

你可以使用[EnableCors]屬性應用不同的策略到 controller/page-model/action 中;

當[EnableCors]屬性應用到 controller/page-model/action ,並且CORS在中間件被允許了(指【Enable("{Policy String}")】的方式),這兩種策略就都被使用了;

不推薦結合使用策略;使用[EnableCors]屬性或者中間件,而不是在相同的應用中使用兩個

 

下麵的代碼給每個方法使用了一種策略

[Route("api/[controller]")]
[ApiController]
public class WidgetController : ControllerBase
{
    // GET api/values
    [EnableCors("AnotherPolicy")]
    [HttpGet]
    public ActionResult<IEnumerable<string>> Get()
    {
        return new string[] { "green widget", "red widget" };
    }

    // GET api/values/5
    [EnableCors]        // Default policy.
    [HttpGet("{id}")]
    public ActionResult<string> Get(int id)
    {
        switch (id)
        {
            case 1:
                return "green widget";
            case 2:
                return "red widget";
            default:
                return NotFound();
        }
    }
}

 

下麵的代碼創建了一個跨越預設策略和一個名字叫“AnotherPolicy”的策略:

public class StartupMultiPolicy
{
    public StartupMultiPolicy(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddCors(options =>
        {
            options.AddDefaultPolicy(
                builder =>
                {
                   
                    builder.WithOrigins("http://example.com",
                                        "http://www.contoso.com");
                });

            options.AddPolicy("AnotherPolicy",
                builder =>
                {
                    builder.WithOrigins("http://www.contoso.com")
                                        .AllowAnyHeader()
                                        .AllowAnyMethod();
                });

        });

        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
    }

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseHsts();
        }

        app.UseHttpsRedirection();
        app.UseMvc();
    }
}

 

另,其實還有[DisableCors]屬性可以禁止CORS,這裡先暫時不做講解

 

 

...未完,待續

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 題目 "P2711 小行星" 解析 這道題挺巧妙的,乍一看是空間上的,無從下手,稍微轉換一下就可以了。 看到題目,求消除這些行星的最少次數,就是求最小割,也就是求最大流,考慮怎樣建圖。 考慮當我們消去一個面上的所有點時,我們消去這個面後,這個面就不會再被消了, 也就是只能被消一次 ,比如我們消去與$ ...
  • 思路 既然$x$的數量那麼小,我們就可以先把每個$x$搜索一遍。 枚舉x的時候不需要把$a,b,c$全枚舉一遍,只要枚舉其中的兩個就可以枚舉到當前 ...
  • (劍指offer)輸入一個遞增排序的數組和一個數字S,在數組中查找兩個數,使得他們的和正好是S,如果有多對數字的和等於S,輸出兩個數的乘積最小的。 思路:選定第一個數字,然後遍歷後面的數字求和並與S比較,需要n-1次,不行的話再選定第2,3,,,n個數字,需要n^2次,時間複雜度比較高。更簡單的方法 ...
  • day 20 02 模塊的導入 運行結果: 9. 兩種不同導入的優缺點: (1)import demo demo:裡面的名字都會導入 會占很多記憶體 裡面的命名空間和不是模塊裡面的命名空間是分開的,所以外面如果有和demo裡面相同的變數名,也是不會相互影響 (2)from demo import 變數 ...
  • 超級全局變數有9個特點是全局可用!頁面到處都能訪問到這個變數 $_GET獲得的是瀏覽器地址欄過來的數據,或者表單GET方式提交的數據 $_POST獲得的是表單POST方式提交的數據 $_REQUEST預設情況(具體情況要看php.ini的配置)獲得的是既包含POST過來的值,也包含GET方式獲得的值 ...
  • 併發與並行: 併發:多個任務交替執行 (一個人吃兩個饅頭,兩個交替啃) 並行:同時執行。(n個人吃n個饅頭) 速度快些。 線程與進程: 進程:進入到記憶體中的程式叫進程。 線程: 主線程: 執行主方法(main)的線程 單線程程式:Java程式中只有一個線程,從main方法開始,從上到下依次執行。 J ...
  • 4.30自我總結 一複習 1.查看數據類型 2.關於變數的一些補充 二.數據類型 1.數字類型 a)整型(int) 1.作用 表示年齡,身高,體重等等 2.定義 3.運算 b)浮點型(float) 1,作用 表示稱重,長度精確需要用到小數點時候等等 2.定義: 3.演算法與整數型相同 4.補充演算法 2 ...
  • 在開發極速飛艇源碼詳情咨詢Q166848365小程式的時候,我們總是期望用以往的技術規範和語法特點來書寫當前的小程式 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...