Ids4 认证保护 API 方案更新
壹
時(shí)刻保持
學(xué)習(xí)的喜悅
可能你咋一看這個(gè)標(biāo)題不知道什么意思,其實(shí)我也沒(méi)想好怎么表達(dá),因?yàn)槭且粋€(gè)特別簡(jiǎn)單的小知識(shí)點(diǎn)。
先說(shuō)下為什么突然說(shuō)到了Ids4?
這幾天大家都知道,我在視頻《微服務(wù)之eShop講解》,目前講到了購(gòu)物車(chē)微服務(wù)部分,看到了官方架構(gòu)中用到了Ids4的認(rèn)證平臺(tái),和保護(hù)資源Api,和我寫(xiě)的認(rèn)證方案不一樣,所以我就開(kāi)始研究了下官方,發(fā)現(xiàn)了原因,所以想主要是一個(gè)項(xiàng)目更新的說(shuō)明流水賬,同時(shí)也是想再一次的強(qiáng)調(diào)官網(wǎng)的重要性。
再說(shuō)下今天要說(shuō)的內(nèi)容是什么。
如果你經(jīng)常看我的項(xiàng)目,或者跟著我的教程,肯定都知道我的BCVP項(xiàng)目,是集成了ASPNETCORE、VUE、IDS4三方的統(tǒng)一架構(gòu)設(shè)計(jì)平臺(tái),而且之前的有一篇文章,我也說(shuō)到了Ids4官網(wǎng)已經(jīng)升級(jí)到了4.x——《【Ids4實(shí)戰(zhàn)】最全的 v4 版本升級(jí)指南》。更新的內(nèi)容還是很多的,絕大多數(shù)的更新還是ids4認(rèn)證平臺(tái)的,其實(shí)在其他的地方也有了些許的變化,今天說(shuō)的就是關(guān)于受保護(hù)資源服務(wù)器的一個(gè)小更新,關(guān)于ProtectingAPIs這一章節(jié)的。
?好啦,現(xiàn)在已經(jīng)說(shuō)明了來(lái)意,剩下的就是上代碼了,下邊提到的代碼都是關(guān)于Blog.Core里的,自己可以更新查看。
1、之前版本是如何保護(hù)Api的
在Authentication_Ids4Setup.cs中,我定義了一個(gè)服務(wù)擴(kuò)展,用來(lái)添加Ids4的認(rèn)證服務(wù),其中有兩個(gè)部分,第一個(gè)部分就是添加認(rèn)證服務(wù):
services.AddAuthentication()第二個(gè)部分就是相應(yīng)的認(rèn)證方案,只不過(guò)之前Ids4的3.x系列,有兩個(gè)寫(xiě)法,
第一個(gè)就是基于AspNetCore服務(wù)的:
public class Startup {public void ConfigureServices(IServiceCollection services){services.AddMvc();services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme).AddJwtBearer(options =>{//?認(rèn)證服務(wù)器的根路徑options.Authority?=?"https://ids.neters.club";// API資源名options.Audience = "blog.core.api";});}public void Configure(IApplicationBuilder app, ILoggerFactory loggerFactory){app.UseAuthentication();app.UseMvc();} }還有一種是Ids4認(rèn)證服務(wù)自己提供的一個(gè)處理程序方案:
public class Startup {public void ConfigureServices(IServiceCollection services){services.AddMvc();services.AddAuthentication(IdentityServerAuthenticationDefaults.AuthenticationScheme).AddIdentityServerAuthentication(options =>{//?identityserver根路徑options.Authority = "https://ids.neters.club";//?API資源名options.ApiName = "blog.core.api";});}public void Configure(IApplicationBuilder app, ILoggerFactory loggerFactory){app.UseAuthentication();app.UseMvc();} }這兩個(gè)用哪一個(gè)呢,官方更建議使用下邊這個(gè),是他們自己封裝的,但是其中的核心,還是基于微軟的JWT類(lèi)庫(kù)封裝的,
Ids4自己封裝的類(lèi)庫(kù),給出的理由是這樣的:
support for both JWTs and reference tokens
extensible caching for reference tokens
unified configuration model
scope validation
我就簡(jiǎn)單的翻譯下,使用這種方案,可以同時(shí)支持JWT和referencetoken的兩個(gè)方案,還針對(duì)后者做了緩存,scope驗(yàn)證,統(tǒng)一配置模型等等。
而且我也在Blog.Core使用了該方案:
書(shū)寫(xiě)代碼:
services.AddAuthentication(o =>{o.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;o.DefaultChallengeScheme = nameof(ApiResponseHandler);o.DefaultForbidScheme = nameof(ApiResponseHandler);}).AddIdentityServerAuthentication(options =>{options.Authority = Appsettings.app(new string[] { "Startup", "IdentityServer4", "AuthorizationUrl" });options.RequireHttpsMetadata = false;options.ApiName = Appsettings.app(new string[] { "Startup", "IdentityServer4", "ApiName" });options.SupportedTokens = SupportedTokens.Jwt;options.ApiSecret = "api_secret";})但是這里有一個(gè)情況,就是必須添加ids4自己封裝的nuget包:
<PackageReference Include="IdentityServer4.AccessTokenValidation" Version="3.0.1" />這個(gè)nuget包也在GitHub上開(kāi)源了,后來(lái)官方好像也發(fā)現(xiàn)了這個(gè)情況,既然要使用微軟的,那就用吧,不用在api資源服務(wù)器里引用了,所以我們可以看這個(gè)GitHub倉(cāng)庫(kù)已經(jīng)歸檔了:
而且在下邊的README里也寫(xiě)了啟用并停止更新了:
而且官方的最新文檔里也悄悄的發(fā)生了變化。
2、最新版方案AddJwtBearer
從最新的Ids4官方文檔https://docs.identityserver.io/en/latest/topics/apis.html中,也可以看出來(lái),官方也已經(jīng)取消了上邊的那種方案,統(tǒng)一使用AddJwtBearer方法了,這里有兩個(gè)好處:
1、可以和普通的jwt認(rèn)證統(tǒng)一,因?yàn)橹笆莏wt用AddJwtBearer,ids4用的AddIdentityServerAuthentication。
2、可以取消Api資源服務(wù)中對(duì)Ids4的引入,比如那個(gè)nuget包。
所以,最終的代碼是這樣的:
// 添加Identityserver4認(rèn)證services.AddAuthentication(o =>{o.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;o.DefaultChallengeScheme = nameof(ApiResponseHandler);o.DefaultForbidScheme = nameof(ApiResponseHandler);}).AddJwtBearer(options =>{options.Authority = Appsettings.app(new string[] { "Startup", "IdentityServer4", "AuthorizationUrl" });options.RequireHttpsMetadata = false;options.Audience = Appsettings.app(new string[] { "Startup", "IdentityServer4", "ApiName" });}).AddScheme<AuthenticationSchemeOptions, ApiResponseHandler>(nameof(ApiResponseHandler), o => { });只不過(guò)這里只支持JwtTokens的模式,如果想要支持referenceTokens,需要先引用包:
然后
好啦,暫時(shí)就這么多吧,可能有些凌亂,具體查看項(xiàng)目代碼吧,最后還是那句話,官網(wǎng)很重要。
?
BCVP開(kāi)發(fā)者社區(qū)推薦
歡迎你來(lái)
總結(jié)
以上是生活随笔為你收集整理的Ids4 认证保护 API 方案更新的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Jekins持续集成在ERP研发中的应用
- 下一篇: dotNet Core 3.1 使用 A