国产精品久久福利_亚洲成人网久久久_国产丝袜美腿一区二区三区_亚洲三级小视频_6080国产精品一区二区_欧美日韩精品一区二区_欧美第一区第二区_亚洲欧美色婷婷

首頁 | 資訊 | 財經 | 公益 | 彩店 | 奇聞 | 速遞 | 前瞻 | 提點 | 網站相關 | 科技 | 熱點 | 生活 |
.NET Core 允許跨域的兩種方式實現(IIS 配置、C# 代碼實現) 環球看熱訊

發稿時間:2023-06-28 19:33:22 來源: 博客園
〇、前言

當把開發好的 WebApi 接口,部署到 Windows 服務器 IIS 后,postman 可以直接訪問到接口并正確返回,這并不意味著任務完成,畢竟接口嘛是要有交互的,最常見的問題莫過于跨域了。


【資料圖】

若前端文件是在當前接口文件下的 wwwroot 文件夾下,那么接口的訪問就沒問題,因為是同協議(http、https)、同地址(域名)、同端口,不存在跨域問題。

但是,若前端和接口不是部署在一起的,那么一般都會存在跨域問題,本文將通過兩種方式介紹如何使接口允許跨域請求。

一、IIS 配置實現1、生效范圍

如下圖:

1 位置為 IIS 根目錄,在此屬性中配置“HTTP響應標頭”時,作用域為“網站”下級目錄中的全部應用。若后面修改了單個應用的 Headers,當更新應用文件后,修改會被還原。

2 位置是指定某一網站,在此屬性中配置“HTTP響應標頭”時,作用域為當前應用,不對其他同級應用有影響。

2、常用的配置項共有四個
HTTP 響應標頭是否必含解釋
Access-Control-Allow-Origin* 或 http://IP:Port允許跨域請求的地址,* 代表允許全部,若指定地址則僅支持填入一個
Access-Control-Allow-HeadersContent-Type當接口僅提供 Get 請求時,可省略;另外客戶端添加的自定義請求頭,需再次進行允許配置
Access-Control-Allow-MethodsPOST, GET, OPTIONS, PUT, DELETE, UPDATE此處列出了全部常用的方法名,可根據需要可適當刪除個別值
Access-Control-Allow-Credentials默認為 false,可配置為 true允許客戶端攜帶驗證信息,例如 cookie 之類的。為 true 時,不允許 Origin 設置為“*”
二、C# 代碼實現1、配置示例

主要是通過在 Startup.cs 文件中的 ConfigureServices() 方法添加跨域服務策略(services.AddCors()),然后在 Configure() 方法中將跨域策略加入到 HTTP 請求管道(HTTP request pipeline)中。

先列舉一個實例,.Net 5.0 配置兼容預檢請求,如下代碼:

public void ConfigureServices(IServiceCollection services){    // ...    // 添加跨域策略    services.AddCors(options =>    {        // 配置默認策略和中間件:options.AddDefaultPolicy(policy =>{policy.WithOrigins("");});app.UseCors(); // 將自動應用于所有控制器終結點        options.AddPolicy("CorsPolicyName0519", policy =>        {            policy            //.AllowAnyOrigin() // AllowAnyOrigin 允許任何源地址的訪問            .WithOrigins("http://IP:Port") // 僅允許一個地址訪問            //.WithOrigins(new string[]{"http://IP1:Port1","http://IP2:Port2","http://IP3:Port3"}) // 支持同時允許多個指定地址的訪問            //.AllowAnyHeader() // 允許任何的Header頭部標題            .WithHeaders("Account", "ClientType", "OrgId", "Token", "Department", "EntAuthVebr") // 自定義請求頭            //.AllowAnyMethod() // 允許任何方法            .WithMethods(HttpMethods.Options, HttpMethods.Get, HttpMethods.Post, HttpMethods.Put, HttpMethods.Delete) // 允許的謂詞方法            //.AllowCredentials() // 允許跨源請求發送憑據 允許時 Origin 不允許為“*”            .SetPreflightMaxAge(TimeSpan.FromHours(24)); // 設置預檢請求的最大緩存時間        });    });}public void Configure(IApplicationBuilder app, IWebHostEnvironment env){    // ...    app.UseCors("CorsPolicyName0519"); // 添加 CORS 中間件,允許跨域訪問    // ...}

跨域請求策略可以同時配置多個。

使用[EnableCors] 屬性可以有針對性的啟用同一個 CORS。也可以對需要 CORS 的終結點配置指定的策略名稱,來實現最佳控制。

[EnableCors] 指定默認策略。[EnableCors("{Policy String}")] 指定命名策略。

[EnableCors] 屬性可應用于:控制器、控制器操作方法、Razor Page PageModel。

將 [EnableCors] 屬性應用于控制器、操作方法或頁面模型,并將中間件加入到管道來啟用 CORS 時, 將這兩種策略將同時生效。

與 [EnableCors] 相反的,[DisableCors] 屬性標識禁用跨域策略。

通常,UseStaticFiles 在 之前 UseCors調用 。 使用 JavaScript 跨站點檢索靜態文件的應用必須在 UseStaticFiles 之前調用 UseCors。

2、關于 設置允許的發送請求的源地址 WithOrigins()

.AllowAnyOrigin:允許具有任何協議(http 或 https)的所有源的 CORS 請求。也就是說任何網站都可以向應用發出跨域請求,會導致跨網站請求偽造,因此并不安全。

.WithOrigins("http://IP1:Port1","http://IP2:Port2"):允許同時配置多個指定地址。(參數類型實際為:new string[]{ })

但是要配置具體的請求地址比較多時,全部通過 string[] 列出的話很不優雅,此時就需要通過通配符域來達到配置多地址的目的。

例如,當需求為允許多個地址(例如:*.example.com、https://*.example.net 同一后綴的多個域名通配符)時,就可以用到如下配置:

SetIsOriginAllowedToAllowWildcardSubdomains:將策略的 IsOriginAllowed 屬性設置為一個函數,當計算是否允許源時,此函數允許源匹配已配置的通配符域。

services.AddCors(options =>{    options.AddPolicy(name: MyAllowSpecificOrigins,        policy =>        {            policy                .WithOrigins("https://*.example.com","https://*.example.net") // 等效于:new string[]{"地址1","地址2"}                .SetIsOriginAllowedToAllowWildcardSubdomains();        });});
3、關于 設置允許的 HTTP 方法 WithMethods()

這個就沒啥好說的了,需要那種就配置進去好了。

常用的就三種:Get、Post、Options。另外不常用的有六種:Put、Delete、Patch、Trace、Connect、Head。詳見:HTTP 請求方法

4、關于設置允許的請求頭 WithHeaders()

.AllowAnyHeader():允許任何名稱的 Header 屬性。這種情況下,很容易出現非默認的請求頭,導致觸發預檢請求 Options,影響系統性能,下文章節會著重介紹。

.WithHeaders(HeaderNames.ContentType, HeaderNames.UserAgent):指定允許多個請求頭。(參數類型實際為:new string[]{ })

當客戶端需要添加指定的請求頭,需要在 WithHeaders() 方法中全部配置上。

5、關于設置允許的響應頭 WithExposedHeaders()

默認情況下,瀏覽器不會向應用公開所有響應頭。默認可用的響應頭包括:Cache-Control、Content-Language、Content-Type、Expires、Last-Modified、Pragma。

.WithExposedHeaders(HeaderNames.Server,HeaderNames.Status):允許同時配置多個響應頭。(參數類型實際為:new string[]{ })

6、設置允許跨源域請求發送憑據 AllowCredentials()

憑據需要在 CORS 請求中進行特殊處理。 默認情況下,瀏覽器不會使用跨源域請求發送憑據。 憑據包括 cookie 和 HTTP 身份驗證方案。 要使用跨源請求發送憑據,客戶端必須將 Credentials 設置為 true,默認情況下為 false。

.AllowCredentials():允許跨源請求發送憑據。

HTTP 響應包含一個 Access-Control-Allow-Credentials 頭,它告訴瀏覽器服務器允許跨源請求的憑據。

如果瀏覽器發送憑據,但響應不包含有效的 Access-Control-Allow-Credentials 頭,則瀏覽器不會向應用公開響應,而且跨源請求會失敗。

允許跨源憑據會帶來安全風險。另一個域中的網站可以在用戶不知情的情況下代表用戶將登錄用戶的憑據發送到應用。

CORS 規范還指出,如果存在 Access-Control-Allow-Credentials 頭,則將源 Origins 設置為“*”(所有源)是無效的,如下圖報錯提示:

參考:https://learn.microsoft.com/zh-cn/aspnet/core/security/cors?view=aspnetcore-6.0#cors-with-named-policy-and-middleware

https://learn.microsoft.com/zh-cn/aspnet/core/security/cors?view=aspnetcore-6.0#set-the-allowed-origins

三、關于預檢請求 Options1、什么是預檢請求?

“發送非簡單跨域請求前的預檢請求”,若該請求未正常返回,瀏覽器會阻止后續的請求發送。

注:Chrome 和 Microsoft Edge 瀏覽器不會在 F12 工具的 Network 選項卡上顯示 OPTIONS 請求,需要額外配置,打開地址:chrome://flags/#out-of-blink-cors 或 edge://flags/#out-of-blink-cors,禁用,重啟生效;Firefox 瀏覽器默認顯示 OPTIONS 請求。

如下圖,是一個預檢請求的 headers 信息:

2、什么情況下會觸發預檢請求

預檢請求(Options)屬于實際請求(Get、Post 等)之外的操作,僅在部分情況下觸發。

想達到不觸發 Options 方法的目的,需同時滿足下面三個條件:

請求方法為 GET、POST 或 HEAD。應用不會設置 Content-Type、Content-Language、Accept、Accept-Language 或 Last-Event-ID 以外的請求頭。Content-Type 頭(如果已設置)具有以下三個值之一:application/x-www-form-urlencoded、multipart/form-data、text/plain

預檢請求可能包含以下 Headers:

Access-Control-Request-Method/Methods:將用于實際請求的 HTTP 方法。Access-Control-Request-Headers:應用在實際請求上設置的請求頭的列表。 如前文所述,這不包含瀏覽器設置的標頭,如 User-Agent、Host、Content-Length 等。

如果預檢請求被拒絕,應用將返回 200 OK 響應,但不會設置 CORS 頭,瀏覽器后續也就不會嘗試跨源請求。

3、預檢請求的 [HttpOptions] 屬性

當使用適當的策略啟用 CORS 時,ASP.NET Core 通常會自動響應 CORS 預檢請求。 但在某些情況下, 例如通過終結點路由使用 CORS,是不會自動響應的。

以下是官網給出的實例,分別是帶參數的 Options 請求和不帶參數兩種:

詳見官網:https://learn.microsoft.com/zh-cn/aspnet/core/security/cors?view=aspnetcore-6.0#tcer

[Route("api/[controller]")][ApiController]public class TodoItems2Controller : ControllerBase{    // OPTIONS: api/TodoItems2/5    [HttpOptions("{id}")]    public IActionResult PreflightRoute(int id)    {        return NoContent();    }    // OPTIONS: api/TodoItems2     [HttpOptions]    public IActionResult PreflightRoute()    {        return NoContent();    }}
4、設置預檢過期時間 SetPreflightMaxAge()

Access-Control-Max-Age 頭指定對預檢請求的響應可以緩存多長時間。

此方法的目的是在第一次預檢請求成功后,將預檢結果緩存一段時間,從而避免重復的預檢請求,提升應用性能。

代碼配置跨域策略時,可通過 .SetPreflightMaxAge() 來實現,如下代碼:

// 添加跨域策略services.AddCors(options =>{    options.AddPolicy("CorsPolicyName007", policy =>    {        policy        .WithOrigins("http://127.0.0.1:7000" , "http://127.0.0.1:8000" )        .SetPreflightMaxAge(TimeSpan.FromHours(24)) // 設置預檢請求的最大緩存時間        ;    });});

參考:https://learn.microsoft.com/zh-cn/aspnet/core/security/cors?view=aspnetcore-6.0#tcer

標簽:

責任編輯:mb01

網站首頁 | 關于我們 | 免責聲明 | 聯系我們

生活晚報網版權所有

Copyright @ 1999-2017 www.gaofoto.cn All Rights Reserved豫ICP備2022016495號-7

聯系郵箱:939 674 669@qq.com    

99九九热只有国产精品| 啦啦啦中文高清在线视频| 成人免费一区二区三区视频 | 午夜电影一区二区三区| 亚洲一二三专区| 一区二区三区四区视频精品免费 | 在线免费观看黄色网址| 精品人伦一区二区三区蜜桃免费| 高清av一区二区| 国产成人澳门| 亚洲毛片在线看| 亚洲国产aⅴ天堂久久| 亚洲图片欧美一区| 亚洲精品网站在线观看| 国产精品hd| 羞羞视频在线观看一区二区| 污视频网站在线| 国产一区日韩二区欧美三区| 欧美+日本+国产+在线a∨观看| 激情小说一区| 精品国产一区二区三区不卡蜜臂| 成人亚洲一区二区| 欧美成人一品| 一道本一区二区| 91一区二区三区在线观看| av网站一区二区三区| 国产欧美视频一区二区| 日韩专区中文字幕一区二区| 成人av资源电影网站| 欧美成人三区| 国产三级在线免费观看| 欧美巨大另类极品videosbest| 色综合久久综合网| 欧美日本国产| 2018av在线| www.中文字幕久久久| 暖暖在线中文免费日本| 超碰成人av| 九色网友自拍视频手机在线| 亚洲欧美精品一区| 亚洲免费福利视频| 国产精品女主播av| 日韩影院精彩在线| 久久精品在线| 国产精品最新自拍| 成人黄色a**站在线观看| 一区二区久久久久| 亚洲精品一区二区在线观看| 国产在线制服美女| 在线免费观看污| 青娱乐极品盛宴一区二区| 电影亚洲一区| 国产盗摄一区二区| 一个人免费视频www在线观看| 亚洲激情在线观看| 日韩视频国产视频| 亚洲aaa精品| 欧美日韩大陆在线| 欧洲色大大久久| 国产精一区二区三区| 色综合咪咪久久网| 日韩伦理在线| 激情小视频在线观看| 精品视频久久久久久久| 精品国产乱码久久久久久图片 | 欧美日韩国产三级| 亚洲欧美日韩一区在线| 欧美aaaaaaa| 欧美一区久久| 99久久99久久综合| 欧美亚洲日本一区| 电影在线一区| 精品福利网址导航| 免费日韩av片| 精品一区二区三区免费观看| 国产在线一区观看| 国产成人久久精品77777最新版本| 国产一二精品视频| 久久久99精品久久| 欧美日韩中国免费专区在线看| 日韩国产欧美精品在线| 777久久久精品| 精品久久久久久久久久国产| 国产精品麻豆久久久| 久久久久久久综合日本| 国产精品一二三区在线| www.26天天久久天堂| 日本在线视频一区二区三区| 综合天堂久久久久久久| 奇米777欧美一区二区| 国产在线国偷精品免费看| 亚洲欧洲精品一区二区三区不卡 | 国产福利在线播放麻豆| 激情久久一区二区| 成人18视频在线观看| 亚洲va欧美va人人爽成人影院| 我要色综合中文字幕| 成人国产精品一级毛片视频| 久久网站免费观看| 亚洲一区二区三区| 亚洲情侣在线| 国语精品一区| 成人午夜电影网站| 亚洲跨种族黑人xxx| 在线xxxx| 国产一二三区在线观看| 国产精品毛片无码| 日本亚洲三级在线| 一区二区三区中文字幕电影| 麻豆国产一区二区| 国产喂奶挤奶一区二区三区| 欧美自拍偷拍一区| 国产在线观看av| 日韩欧美二区| 色88888久久久久久影院按摩| 日本蜜桃在线观看视频| 日韩高清电影一区| 精品视频久久久| 农村妇女一区二区| 久久精品五月| 亚洲欧美一区二区视频| 精品乱码亚洲一区二区不卡| 亚洲成人三级| 久久电影在线| 日本va欧美va欧美va精品| 91影院在线观看| 欧美三级视频在线播放| 牛牛精品视频在线| 欧美一区二区麻豆红桃视频| 欧美大片专区| 精品久久久中文| 尤物视频在线看| 秋霞国产午夜精品免费视频| 欧美性猛交xxxx久久久| 黄色片在线播放| 国产成人77亚洲精品www| 视频一区二区中文字幕| 精品婷婷伊人一区三区三| 福利视频在线导航| 中文在线中文资源| 秋霞午夜鲁丝一区二区老狼| 欧美另类变人与禽xxxxx| 91三级在线| 精品国产一区二区三区香蕉沈先生| 美女在线视频一区| 欧美日韩国产一区在线| 亚洲男人天堂2024| 欧美大片黄色| 午夜精彩国产免费不卡不顿大片| 国产精品初高中害羞小美女文 | 亚洲激情在线| 国产99久久久国产精品潘金| 五月综合激情网| 在线中文字幕视频| 欧美二三四区| 久久久久97| 日本亚洲视频在线| 亚洲欧美另类图片小说| 色哟哟日韩精品| 在线综合亚洲欧美在线视频| 又爽又大又黄a级毛片在线视频| 日韩精品美女| 成人高清电影网站| 国产高清不卡一区| 亚洲影院久久精品| 日韩激情av在线播放| 成人免费黄色网页| 巨大黑人极品videos精品| 久久99精品久久久久久欧洲站 | 亚洲欧美一区二区三区| 露出调教综合另类| 国产精品欧美久久久久无广告 | 日本视频在线免费观看| 久久不见久久见中文字幕免费| 91美女片黄在线观看| 亚洲成人网在线观看| 在线看的网站你懂| 精品久久在线| 在线观看日韩av电影| 亚洲欧美日韩一区二区三区在线观看| 日韩av一区在线| 免费在线毛片网站| 国产一区 二区| 极品少妇xxxx精品少妇| 午夜伦理一区二区| 亚洲网站情趣视频| 亚洲精品一区二区在线播放∴| 中文在线一区| 亚洲精品第一国产综合野| 在线观看日韩av先锋影音电影院| 日韩成人激情在线| 亚洲天堂av影院| 午夜宅男久久久| 天天色图综合网| 日韩子在线观看| 欧美 日韩 国产精品免费观看| 久久亚洲精精品中文字幕早川悠里 | 亚洲精品wwwww| 一个色免费成人影院| 欧美日韩你懂得|