Ids4 认证保护 API 方案更新

时刻保持
学习的喜悦

可能你咋一看这个标题不知道什么意思,其实我也没想好怎么表达,因为是一个特别简单的小知识点。

先说下为什么突然说到了Ids4?

这几天大家都知道,我在视频《微服务之eShop讲解》,目前讲到了购物车微服务部分,看到了官方架构中用到了Ids4的认证平台,和保护资源Api,和我写的认证方案不一样,所以我就开始研究了下官方,发现了原因,所以想主要是一个项目更新的说明流水账,同时也是想再一次的强调官网的重要性。

再说下今天要说的内容是什么。

如果你经常看我的项目,或者跟着我的教程,肯定都知道我的BCVP项目,是集成了ASPNETCORE、VUE、IDS4三方的统一架构设计平台,而且之前的有一篇文章,我也说到了Ids4官网已经升级到了4.x——《【Ids4实战】最全的 v4 版本升级指南》。更新的内容还是很多的,绝大多数的更新还是ids4认证平台的,其实在其他的地方也有了些许的变化,今天说的就是关于受保护资源服务器的一个小更新,关于ProtectingAPIs这一章节的。

‍好啦,现在已经说明了来意,剩下的就是上代码了,下边提到的代码都是关于Blog.Core里的,自己可以更新查看。

1、之前版本是如何保护Api的

在Authentication_Ids4Setup.cs中,我定义了一个服务扩展,用来添加Ids4的认证服务,其中有两个部分,第一个部分就是添加认证服务:

services.AddAuthentication()

第二个部分就是相应的认证方案,只不过之前Ids4的3.x系列,有两个写法,

第一个就是基于AspNetCore服务的:

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc();


        services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
            .AddJwtBearer(options =>
            {
                // 认证服务器的根路径
                options.Authority = "https://ids.neters.club";


                // API资源名
                options.Audience = "blog.core.api";
            });
    }


    public void Configure(IApplicationBuilder app, ILoggerFactory loggerFactory)
    {
        app.UseAuthentication();
        app.UseMvc();
    }
}

还有一种是Ids4认证服务自己提供的一个处理程序方案:

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();
    }
}

这两个用哪一个呢,官方更建议使用下边这个,是他们自己封装的,但是其中的核心,还是基于微软的JWT类库封装的,

Ids4自己封装的类库,给出的理由是这样的:

  • support for both JWTs and reference tokens

  • extensible caching for reference tokens

  • unified configuration model

  • scope validation

我就简单的翻译下,使用这种方案,可以同时支持JWT和referencetoken的两个方案,还针对后者做了缓存,scope验证,统一配置模型等等。

而且我也在Blog.Core使用了该方案:

书写代码:

 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";


 })


但是这里有一个情况,就是必须添加ids4自己封装的nuget包:

<PackageReference Include="IdentityServer4.AccessTokenValidation" Version="3.0.1" />

这个nuget包也在GitHub上开源了,后来官方好像也发现了这个情况,既然要使用微软的,那就用吧,不用在api资源服务器里引用了,所以我们可以看这个GitHub仓库已经归档了:

而且在下边的README里也写了启用并停止更新了:

而且官方的最新文档里也悄悄的发生了变化。

2、最新版方案AddJwtBearer

从最新的Ids4官方文档https://docs.identityserver.io/en/latest/topics/apis.html中,也可以看出来,官方也已经取消了上边的那种方案,统一使用AddJwtBearer方法了,这里有两个好处:

1、可以和普通的jwt认证统一,因为之前是jwt用AddJwtBearer,ids4用的AddIdentityServerAuthentication。

2、可以取消Api资源服务中对Ids4的引入,比如那个nuget包。

所以,最终的代码是这样的:

 // 添加Identityserver4认证
 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 => { });


只不过这里只支持JwtTokens的模式,如果想要支持referenceTokens,需要先引用包:

<PackageReference Include="IdentityModel.AspNetCore.OAuth2Introspection" Version="4.0.1" />

然后

services.AddAuthentication("token")


    // JWT tokens
    .AddJwtBearer("token", options =>
    {
        options.Authority = Constants.Authority;
        options.Audience = "resource1";


        options.TokenValidationParameters.ValidTypes = new[] { "at+jwt" };


        // if token does not contain a dot, it is a reference token
        options.ForwardDefaultSelector = Selector.ForwardReferenceToken("introspection");
    })


    // reference tokens
    .AddOAuth2Introspection("introspection", options =>
    {
        options.Authority = Constants.Authority;


        options.ClientId = "resource1";
        options.ClientSecret = "secret";
    });

好啦,暂时就这么多吧,可能有些凌乱,具体查看项目代码吧,最后还是那句话,官网很重要。

 



BCVP开发者社区推荐

欢迎你来

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值