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
更多相關文章
  • 題目連接 Problem There is a tree with n nodes. For each node, there is an integer value ai, (1≤ai​≤1,000,000,000 for 1≤i≤n). There is q queries which are ...
  • re.findall 匹配到正則表達式的字元,匹配到的每個字元存入一個列表,返回一個匹配到的所有字元列表 一. 匹配單個字元 import re # \w 匹配所有字母、數字、下劃線 re.findall('\w','abcd_123 *-') # 結果為:['a', 'b', 'c', 'd', ...
  • va_arg巨集,是頭文件 stdarg.h 中定義的,獲取可變參數的當前參數。 #define va_arg(list, mode) ((mode*)(list+=sizeof(mode)))[-1] 這個-1操作,是返回當前指針前一個值。如果你熟悉c++中記憶體模型就應該明白。array 在記憶體棧或 ...
  • 在Python Web開發中,我們一般使用Flask、Django等web框架來開發應用程式,生產環境中將應用部署到Apache、Nginx等web伺服器時,還需要uWSGI或者Gunicorn。一個完整的部署應該類似這樣: 要弄清這些概念之間的關係,就需要先理解WSGI協議。 WSGI是什麼 WS ...
  • 這一節主要講如何測試跨域問題 你可以直接在官網下載示例代碼,也可以自己寫,我這裡直接使用官網樣例進行演示 樣例代碼下載: Cors 一.提供服務方,這裡使用的是API 1.創建一個API項目。或者直接下載樣例代碼 2.像之前講的那樣設置允許CORS,例如: 使用的時候,註意 WithOrigins( ...
  • 關於 IIS Express 常用設置 站點綁定 IIS Express Web 伺服器預設只綁定了 的主機名,這就意味著無法通過內網或其他自定義功能變數名稱進行訪問,可通過如下操作添加其他綁定。 在Web宿主項目中的 .vs 目錄中的 config 子目錄中,有名為“ applicationhost.co ...
  • NetCore sdk並不是每個版本都支持VS2017工具,也不是每個版本的sdk版本號和Runtime版本號都一樣,這就需要我們在創建某個版本的net core應用時註意: 1. 使用不同版本的vs時需要對照官網的說明,看是否支持對應版本的vs,比如最新的sdk版本2.2.203版本,就不支持VS ...
  • 廢話少說,先上代碼 public static Dictionary<Type, Type[]> GetImpleAndInterfaces(string assemblyName,string suffix) { if (!String.IsNullOrEmpty(assemblyName)) { ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...