日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

用ASP.NET Core 2.1 建立规范的 REST API -- 保护API和其它

發(fā)布時間:2023/12/4 asp.net 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 用ASP.NET Core 2.1 建立规范的 REST API -- 保护API和其它 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

預(yù)備知識:?

?用ASP.NET Core 2.0 建立規(guī)范的 REST API -- 預(yù)備知識?

?用ASP.NET Core 2.0 建立規(guī)范的 REST API -- 預(yù)備知識 (2) + 準(zhǔn)備項目

建立成熟度2級的 API請看這里:

用ASP.NET Core 2.0 建立規(guī)范的 REST API -- GET 和 POST,?用ASP.NET Core 2.0 建立規(guī)范的 REST API -- DELETE, UPDATE, PATCH 和 Log用ASP.NET Core 2.1 建立規(guī)范的 REST API -- 翻頁/排序/過濾等

HATEOAS:用ASP.NET Core 2.1 建立規(guī)范的 REST API -- HATEOAS

緩存和并發(fā):用ASP.NET Core 2.1 建立規(guī)范的 REST API -- 緩存和并發(fā)

本文所需項目代碼(右鍵另存, 后綴改為zip):?https://images2018.cnblogs.com/blog/986268/201806/986268-20180612151833673-1851218969.jpg

認(rèn)證和授權(quán)

認(rèn)證/身份驗證 Authentication, 是驗證想要訪問特定資源的人/系統(tǒng)的身份的過程.

授權(quán) Authorization, 是確認(rèn)已認(rèn)證的用戶擁有足夠的權(quán)限去做某些事的過程.

打個比喻: 認(rèn)證是一個人可以進(jìn)入到房間的權(quán)限, 而授權(quán)則表明這個人可以在房間內(nèi)做哪些事.

?

認(rèn)證的過程可以和應(yīng)用程序分開并且還可以被其它的服務(wù)使用, 但是授權(quán)的過程通常是針對某個應(yīng)用程序, 不同的角色會擁有不同的權(quán)限.

?

HTTP協(xié)議提供了一個協(xié)商訪問被保護(hù)資源的機(jī)制, 下圖就是HTTP認(rèn)證:

標(biāo)準(zhǔn)的認(rèn)證流程開始于一個訪問服務(wù)器被保護(hù)資源的匿名請求, HTTP服務(wù)器隨后處理了該請求并決定拒絕讓它訪問被保護(hù)的資源, 因為該請求沒有憑據(jù); 隨后HTTP Server發(fā)送了一個WWW-Authenticate Header回去, 這表示它需要這套認(rèn)證方案. 然后客戶端再次發(fā)送請求的時候包含了一個Authorization Header, 它的值符合HTTP Server的認(rèn)證方案. 當(dāng)服務(wù)器收到這次請求時, 它驗證了Authorization Header里的憑據(jù), 并讓請求通過了管道.

服務(wù)器可以提供多種認(rèn)證方案, 客戶端只需選擇其中一種即可, 上圖中使用的是Basic 認(rèn)證方案.?還有其它的認(rèn)證方案:

  • 匿名 Anonymous?也可以當(dāng)作是一種方案吧, 就當(dāng)作是授權(quán)給所有人好了

  • Basic 認(rèn)證方案, 它是一種比較老的方案, n年前經(jīng)常被使用. 它太簡單了, 它的值是含有用戶名和密碼組成的字符串, 并用冒號(:)連接, 并且編碼為Base64字符串. 例如username為dave, 密碼為1234, 那么Authorization Header的值就是:?Authorization: Basic?ZGF2ZToxMjM0.

  • Digest 認(rèn)證方案, 它作為Basic的代替者出現(xiàn)的. 服務(wù)器會給客戶端發(fā)送一個隨機(jī)字符串作為一個challenge(盤問, 質(zhì)疑, 挑戰(zhàn)), 這個隨機(jī)字符串叫做nonce(可以理解為臨時生成的字符串). 而客戶端通過發(fā)送一個帶有用戶名, 密碼, nonce和其它信息的hash來進(jìn)行認(rèn)證.

  • Bear 認(rèn)證方案, 它是最流行也是更安全的認(rèn)證方案. 它使用Bearer Tokens (承載令牌) 來訪問由OAuth 2.0協(xié)議保護(hù)的資源. 任何擁有bearer token的人都可以訪問相關(guān)的資源. bearer token的生命周期通常很短, 會過期. 例子: Authorization: Bearer:?eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c.

  • NTLM認(rèn)證方案, 它是NTLAN Manager的縮寫, 它是一種挑戰(zhàn)--響應(yīng)的方案, 要比Digest更安全. 這種方案使用Windows憑據(jù)來轉(zhuǎn)化盤問的數(shù)據(jù), 而不是使用編碼的憑據(jù).

  • Negotiate 認(rèn)證方案, 它會自動選擇NTLM方案和Kerberos協(xié)議中的一個, Kerboros協(xié)議比NTLM快.

后兩種方案都僅限于Windows系統(tǒng).

這幾種方案里Basic提供的保護(hù)程度/級別最低, 而Negotiate最高/強(qiáng).

ASP.NET Core可選擇的認(rèn)證提供商就很多了, 例如ASP.NET Core Identity. 但是它主要用于包含頁面的web應(yīng)用, 例如MVC或Razor Page, 并不適用于REST/Web API, 所以不介紹它了.

如果應(yīng)用部署在云上, 可以使用Azure Active Directory(AAD)?和?Azure Active Directory B2C (Azure AD B2C). 我沒用過, 就不介紹了.

第三方的認(rèn)證提供商有很多: AspNet.Security.OpenIdConnect.Server(ASOS),?IdentityServer4, OpenIddict, Pwdless.....

我一直在用Identity Server 4, 但是這里不會深入介紹, 這里主要介紹如何實現(xiàn)REST API, 如果有需要的話, 可以寫一系列關(guān)于Identity Server 4的文章.

?

選項很多, 但是要實現(xiàn)的話還需要了解JSON Web Tokens (JWT), 它是一個基于JSON的開放工業(yè)標(biāo)準(zhǔn), 它用于為雙方表示一些聲明. 它提供了一種緊湊的, 自包含的方式在雙方之間用JSON對象來傳輸信息.

JWT使用?HMAC secret?或?RAS公有和私有鍵對(key pair)?這兩種方式來進(jìn)行簽名.

JWT由三部分組成:?header,?payload,?signature. 形式如下面的偽代碼:?[X=base64(header)].[Y=base64(payload)].[signature([X].[Y])]?.

去這個網(wǎng)址可以更直觀的理解這三部分:?jwt.io

JWT token最終是一個字符串, 它的三個部分用點(.)分開, 前兩部分(header payload)是Base64編碼的字符串; 最后一部分是前兩個Base64字符串的組合, 也是用點(.)分開并進(jìn)行了簽名, 如下圖:

?

?使用Bearer方案和JWT的流程如下:

?

配置項目,?在Startup的ConfigureServices里:

如果使用Identity Server 4的話, 這里就可以不這樣寫了.

首先我們配置使用Bearer認(rèn)證方案, 然后通過AddJwtBearer設(shè)定一些參數(shù). Configuration里面的值可以放在appSettings.json里面或者其它地方:

然后在Configure方法里調(diào)用app.UseAuthentication()方法, 要在app.UseMvc()之前調(diào)用:

最后使用[Authorize]屬性標(biāo)簽把CountryController保護(hù)起來, 也可以應(yīng)用于Action級:

發(fā)送不帶Authorization Header的請求來測試:

返回 401 Unauthorized 未授權(quán).

返回的Header里面告訴我們應(yīng)該使用Bearer認(rèn)證方案.

?

下面我們需要一個可以生成JWT token的節(jié)點, 針對本文我就在本項目里建立這個節(jié)點吧:

請求token的地址是 /api/authentication, 請求token用的是Basic方案, Post方法里就是先解碼, 驗證用戶名和密碼, 成功后調(diào)用GenerateToken生成token.

那就按要求再次發(fā)送請求:

注意這里usename:password的base64編碼是:?dXNlcm5hbWU6cGFzc3dvcmQ=

現(xiàn)在我獲得了token, 然后我用token再次請求Country資源:

資源就可以正常的訪問了.

?

想要解析這個token, 需要到j(luò)wt.io:

箭頭處需要填上secret.

?

這個例子比較簡單, 實際應(yīng)用中還是使用Identity Server 4之類的東西吧.

?

使用HTTPS

根據(jù)官方文檔(https://docs.microsoft.com/en-us/aspnet/core/security/enforcing-ssl?view=aspnetcore-2.1&tabs=visual-studio#require-https), 它建議ASP.NET Core web應(yīng)用都應(yīng)該調(diào)用HTTPS重定向中間件, 這樣就可以把所有的HTTP請求轉(zhuǎn)換為HTTPS.

只需要在Startup的Configure方法里調(diào)用UseHttpsRedirection()方法即可:

而在ConfigureServices方法里可以配置這個中間件:

?

HSTS (HTTP 嚴(yán)格的傳輸安全協(xié)議)

web應(yīng)用通過使用特殊的響應(yīng)header可以選擇使用加強(qiáng)的安全協(xié)議OWASP(Open Web Application Security Project), HSTS(HTTP Strict Transport Security). 當(dāng)所支持的瀏覽器接收到這個header的時候, 瀏覽器就會阻止任何通過HTTP到指定域名的通信, 會使用HTTPS代替. 同時它也會阻止從瀏覽提的提示框點擊的HTTPS.

為實現(xiàn)這個只需要在Startup的Configure里使用:

?

?一般不建議在開發(fā)環(huán)境使用Hsts, 因為瀏覽器極有可能會緩存HSTS 的header. 默認(rèn)情況下,?UseHsts會排除本地回路的地址.

UseHsts會排除下列回路宿主:

  • localhost?: IPv4 回路地址.

  • 127.0.0.1?: IPv4 回路地址.

  • [::1]?: IPv6 回路地址.

可以在ConfigureServices方法里對它進(jìn)行配置:

這部分具體請查看文檔:?https://docs.microsoft.com/en-us/aspnet/core/security/enforcing-ssl?view=aspnetcore-2.1&tabs=visual-studio#http-strict-transport-security-protocol-hsts

?

CORS 跨域請求

配置注冊CORS需要在Startup的ConfigureServices方法完成:

針對整個應(yīng)用啟用CORS需要在Configure方法里調(diào)用下面的方法:

應(yīng)該盡早的調(diào)用該方法, 以便在它后邊注冊的節(jié)點都可以被跨域訪問.

這是第一種方法, 使用的是lambda表達(dá)式.

注意URL地址結(jié)尾不要有/, 它會引起錯誤.

這種方法使用的是CorsPolicyBuilder 類, 它擁有Fluent API, 可以串接方法調(diào)用:

?

第二種方法是使用策略.

在ConfigureServices里配置好命名的策略:

在Configure方法里使用該策略:

另外也可以不適用UseCors(), 而是在下面這幾種級別指定使用該策略:

Action級別:

Controller級別:

全局Controller級別:

這么用的話, 需要禁用CORS策略就:

?

關(guān)于CORS的具體配置, 還是請參考官方文檔:?https://docs.microsoft.com/en-us/aspnet/core/security/cors?view=aspnetcore-2.1

?

Rate Limiting 速率限制

速率限制是指限制被允許的請求到API(或某個特定的資源)。這樣就可以保護(hù)API,避免一些非正常使用的場景,例如網(wǎng)絡(luò)爬蟲或請求太多而導(dǎo)致API的性能嚴(yán)重下降,Dos和DDos。針對這點我們采取的節(jié)流策略是控制允許訪問API的請求的頻率/速率,它可以決定特定的請求是否被允許。

例如客戶端只允許每小時有100個請求到達(dá)API,也可以按天計算,還可以帶著IP地址一起限制。

響應(yīng)的Header可以用來表示速率限制,但是這些Header并不是HTTP標(biāo)準(zhǔn)。這些header都以X-Rate-Limit開頭。

  • X-Rate-Limit-Limit,?這個表示添加了限制并包含了限制的有效期。

  • X-Rate-Limit-Remaining,表示該客戶還剩下多少個被允許的請求。

  • X-Rate-Limit-Reset,提供關(guān)于何時限制會被重置的時間信息。

如果達(dá)到限制了,這些響應(yīng)會返回429 Too many requests?狀態(tài)碼。有可能會包含一個Retry-After 響應(yīng)Header,而響應(yīng)的body應(yīng)該包含解釋當(dāng)前狀態(tài)的細(xì)節(jié)信息。當(dāng)然這都是理論上要求的。

?

下面去實現(xiàn),首先安裝這個庫?AspNetCoreRateLimit?(https://github.com/stefanprodan/AspNetCoreRateLimit):

首先在Startup的ConfigureServices里面注冊,用到了MemoryCache:

這里配置的是IP限制,它允許有很多規(guī)則,這里我只用了一個:針對所有的資源,每5分鐘最多3次請求。

現(xiàn)在,我需要注冊一個策略存儲和速率限制計數(shù)器的存儲,這兩個是被中間件使用。所以還需要注冊這兩個服務(wù):

這里都使用的是Singleton單例,因為我們需要的是針對全局的請求來做操作。

接下來要在管道里添加中間件,它應(yīng)該放在靠前的位置,在日志和異常之后:

?

測試,發(fā)送一個請求看結(jié)果:

可以看到5分鐘內(nèi)還剩下兩次請求的配額。限制重置的時間大約在5分鐘之后。

發(fā)送請求超限之后,就會返回429:

Retry-After提示了再過294秒后可以再試試。。。

而響應(yīng)的body是這樣提示的:

?

我們再組合幾個其它的規(guī)則:

現(xiàn)在允許5分鐘10次請求,但是每10秒鐘最多只能有兩次請求。

第一次請求后:

5分鐘內(nèi)還剩9次,然后我10秒內(nèi)連續(xù)發(fā)送兩次請求,然后再發(fā)送一次請求:

這時超出了限制,Header里:

提示6秒后可以重試, 6秒后再次發(fā)送請求:

?

這個庫還是挺靈活強(qiáng)大的,更多功能還需要看官方文檔。

?

API 文檔

業(yè)界通常會使用Swagger OpenAPI來對RESTful API進(jìn)行格式化描述,而Swagger OpenAPI的當(dāng)前版本是v3.

ASP.NET Core有一個第三方庫Swashbuckle,它支持Swagger,但是只支持版本2,版本2有個重要的缺陷就是不支持Action重載,之前HATEOAS的文章里提到過我們需要使用這種重載。所以Swashbuckle暫時并不是完全合適,所以我就不裝它了。

就暫時不弄自動文檔了。。。

?

單元測試

需要使用到xUnit和Moq,這里不介紹了。

關(guān)于xUnit,我寫過幾篇文章,有興趣可以參考下:

http://www.cnblogs.com/cgzl/p/8283610.html

http://www.cnblogs.com/cgzl/p/8287588.html

http://www.cnblogs.com/cgzl/p/8438019.html

http://www.cnblogs.com/cgzl/p/8444423.html?

Moq的文章博客園應(yīng)該有,如果需要的話,我可以寫一下。

?

其它

其它可能需要了解的包括:POSTMAN/Newman自動化測試,CI,CD,GraphQL等等。我就不介紹了?

這個系列文章就到這了。

源碼(我還需要整理一下源碼,現(xiàn)在有點亂):https://github.com/solenovex/ASP.NET-Core-2.0-RESTful-API-Tutorial

相關(guān)文章:

  • 用ASP.NET Core 2.0 建立規(guī)范的 REST API -- 預(yù)備知識

  • 用ASP.NET Core 2.0 建立規(guī)范的 REST API -- 預(yù)備知識 (2) + 準(zhǔn)備項目

  • 用ASP.NET Core 2.0 建立規(guī)范的 REST API -- GET 和 POST

  • 用ASP.NET Core 2.0 建立規(guī)范的 REST API -- DELETE, UPDATE, PATCH 和 Log

  • 用ASP.NET Core 2.1 建立規(guī)范的 REST API -- 翻頁/排序/過濾等

  • 用ASP.NET Core 2.1 建立規(guī)范的 REST API -- 緩存和并發(fā)

原文地址: https://www.cnblogs.com/cgzl/p/9165388.html


.NET社區(qū)新聞,深度好文,歡迎訪問公眾號文章匯總 http://www.csharpkit.com

總結(jié)

以上是生活随笔為你收集整理的用ASP.NET Core 2.1 建立规范的 REST API -- 保护API和其它的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。