ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Ocelot之结合IdentityServer4认证一

2022-04-09 22:34:27  阅读:208  来源: 互联网

标签:app 认证 添加 Ocelot new 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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有