其他分享
首页 > 其他分享> > Ocelot之结合IdentityServer4认证一

Ocelot之结合IdentityServer4认证一

作者:互联网

Ocelot之结合IdentityServer4认证一

前言

上章节介绍了Ocelot之基于Polly熔断,这节介绍.NET Core平台下Ocelot之结合IdentityServer4认证。

环境

Win10+VS2022 +.NET5.0 + Ocelot17.0.0.0 + Consul 1.6.1.1+IDS4

OAuth2.0(协议)

 

系统从而产生一个短期的进入令牌,用来代替密码,供第三方应用使用。

规范了下授权的流程,五种模式:

l 客户端凭证(client credentials)

l 密码式(password)

l 隐藏式(implicit)

l 授权码(authorization-code)

l 混合式(Hybrid)

IdentityServer4

IdentityServer4 是一个 OpenID Connect 和 OAuth 2.0 框架用于 ASP.NET Core 。IdentityServer4 在你的应用程序中集成了基于令牌认证、单点登录、API访问控制所需的所有协议和扩展点。

项目实现

在上节“Ocelot之基于Polly熔断”的项目实现上继续改造。

 

3.1 创建IDS4项目

1. 创建项目

dotnet CLI快速安装模板Identityserver模板

dotnet new -i IdentityServer4.Templates 

 

创建IdentityServery 项目

dotnet new is4empty -n IdentityServer_ResourceOwnerPasswordCredentials  

 

2.引用IdentityServer4依赖

3.修改端口

在Properties\launchSettings.json文件中更改它。

 

 

 

这里修改为:

 "applicationUrl": "https://localhost:5001;http://localhost:5000"

 

4.定义API接口的活动范围API Scope

API 是系统中要保护的资源。资源定义可以通过多种方式加载。模板已经创建了 Config.cs。打开它,将代码更新为如下所示:

 public static IEnumerable<ApiScope> ApiScopes =>

            new ApiScope[]

            { new ApiScope("api1", "My API")};

 

 

5.添加用户

就像基于内存存储的资源(即范围 Scopes)和客户端一样,对于用户也可以这样做。

TestUser类型表示一个测试用户及其身份信息。 Config.cs文件中添加以下代码以创建用户:

 public static List<TestUser> GetUsers()

        {

            return new List<TestUser>

            {

                new TestUser

                {

                    SubjectId = "1",

                    Username = "alice",

                    Password = "password"

                },

                new TestUser

                {

                    SubjectId = "2",

                    Username = "bob",

                    Password = "password"

                },

                new TestUser

                {

                    SubjectId = "3",

                    Username = "yak",

                    Password = "yakpassword"

                }

            };

        }

 

 

             

6.配置身份服务器

在Startup文件中配置身份服务器,加载资源和客户端,然后将测试用户注册到 IdentityServer中。代码如下:

 public void ConfigureServices(IServiceCollection services)

        {

            var builder = services.AddIdentityServer()

                .AddInMemoryIdentityResources(Config.GetIdentityResources())

                .AddInMemoryApiScopes(Config.ApiScopes)

                .AddInMemoryClients(Config.GetClients())

                .AddTestUsers(Config.GetUsers());

            builder.AddDeveloperSigningCredential();

        }

 

 

 

AddTestUsers扩展方法在背后做了以下几件事:

(1)为资源所有者密码授权添加支持

(2)添加对用户相关服务的支持,这服务通常为登录 UI 所使用

(3)为基于测试用户的身份信息服务添加支持

 

7.添加客户端定义

可以通过修改AllowedGrantTypes属性简单地添加对已有客户端授权类型的支持。

通常要为资源所有者用例创建独立的客户端,添加以下代码到你配置中的客户端定义中

public static IEnumerable<Client> GetClients()

        {

            return new List<Client>

            {

                // resource owner password grant client

                new Client

                {

                    ClientId = "yakclient",

                    AllowedGrantTypes = GrantTypes.ResourceOwnerPassword,

                    ClientSecrets =

                    {

                        new Secret("yaksecret".Sha256())

                    },

                    AllowedScopes = { "api1", IdentityServerConstants.StandardScopes.OpenId, IdentityServerConstants.StandardScopes.Profile }//需要额外添加

                }

            };

        }

 

 

 

3.2 修改接口服务

1. 在接口控制器上添加认证特性。

 

 

 

  [Authorize]

   [ApiController]

    [Route("[controller]")]

public class WeatherForecastController : ControllerBase

............

 

2. 添加Microsoft.AspNetCore.Authentication.JwtBearer依赖

添加依赖后,Yak.Ocelot.Api项目文件下添加了下面代码。

  <ItemGroup>

  <PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="5.0.0" />

  </ItemGroup>

 

2. 修改Startup文件,添加认证代码。

public void ConfigureServices(IServiceCollection services)

        {

            // IdentityServer

            // 注册认证相关组件和配置defaultScheme为Bearer

            services.AddAuthentication("Bearer")

              .AddJwtBearer("Bearer", options =>

              {

                  options.Authority = "http://localhost:8000";

                  // 在验证token时,不验证Audience

                  options.TokenValidationParameters = new TokenValidationParameters

                  {

                      ValidateAudience = false

                  };

                  options.RequireHttpsMetadata = false; // 不适用Https

              });

            services.AddAuthorization(options =>

            {

                options.AddPolicy("api1Scope", policy =>

                {

                    policy.RequireAuthenticatedUser();

                    policy.RequireClaim("scope", "Yak.Ocelot.Api");

                });

            });

          services.AddSingleton(Configuration.GetSection("Consul").Get<ConsulOption>());

            services.AddControllers();

        }

 

        public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IHostApplicationLifetime lifetime, ConsulOption consulOption)

        {

            if (env.IsDevelopment())

            {

                app.UseDeveloperExceptionPage();

            }

            // 注册

            app.RegisterConsul(lifetime, consulOption);

            app.UseRouting();

 

            app.UseAuthentication();//先鉴权,没有鉴权,授权是没有意义的

            app.UseAuthorization();//后授权

            app.UseEndpoints(endpoints =>

            {

                endpoints.MapControllers();

            });

        }

 

3.3 启动Consul

这里是Win10系统,下载相应的Consul后,在文件夹下创建启动BAT文件用于启动Consul,双击启动。

3.4 服务发现

启动“Yak.Ocelot.Api”项目,查看到服务已经注册到Consul中。

 

 

 

 

 

3.5 调试

1. 启动网关服务

运行网关项目“Yak.Ocelot.Gateway”。

 

 

 

2. 启动接口服务

运行网关项目“Yak.Ocelot.Api”,通过接口自己的端口http://localhost:6000/Weather访问WebAPI天气接口服务。没有授权,返回码401。

 

 

 

 

3. 取Token

访问IDS4服务获取Token,地址:http://localhost:8000/connect/token

参数:

grant_type:password

client_id:yakclient

client_secret:yaksecret

username:yak

password:yakpassword

 

 

 

 

 

 

4. 通过网关访问接口服务

通过网关地址http://localhost:5000/Weather

访问WebAPI天气接口服务,返回401未认证。

 

 

 

添加Token认证后访问

 

 

 

 

 

 

总结

这节例子介绍了接口服务结合IDS4提供了认证,网关仅仅提供了路由。后面介绍网关结合IDS4提供认证。

鸣谢

https://www.cnblogs.com/zhangnever/p/13198176.html

https://www.cnblogs.com/Zhang-Xiang/p/10437488.html

源码

https://github.com/yandaniugithub/NETCore

 

标签:app,认证,添加,Ocelot,new,IdentityServer4
来源: https://www.cnblogs.com/yakniu/p/16124008.html