热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Ocelot之结合IdentityServer4认证一

Ocelot之结合IdentityServer4认证一前言上章节介绍了Ocelot之基于Polly熔断,这节介绍.NETCore平台下Ocelot之结合IdentityServer

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 ApiScopes =>

            new ApiScope[]

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


 

 


5.添加用户

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

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








 public static List GetUsers()

        {

            return new List

            {

                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 GetClients()

        {

            return new List

            {

                // 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项目文件下添加了下面代码。








  

  

  


 


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

            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

 



推荐阅读
  • r2dbc配置多数据源
    R2dbc配置多数据源问题根据官网配置r2dbc连接mysql多数据源所遇到的问题pom配置可以参考官网,不过我这样配置会报错我并没有这样配置将以下内容添加到pom.xml文件d ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • 本文讨论了在openwrt-17.01版本中,mt7628设备上初始化启动时eth0的mac地址总是随机生成的问题。每次随机生成的eth0的mac地址都会写到/sys/class/net/eth0/address目录下,而openwrt-17.01原版的SDK会根据随机生成的eth0的mac地址再生成eth0.1、eth0.2等,生成后的mac地址会保存在/etc/config/network下。 ... [详细]
  • 使用eclipse创建一个Java项目的步骤
    本文介绍了使用eclipse创建一个Java项目的步骤,包括启动eclipse、选择New Project命令、在对话框中输入项目名称等。同时还介绍了Java Settings对话框中的一些选项,以及如何修改Java程序的输出目录。 ... [详细]
  • 大坑|左上角_pycharm连接服务器同步写代码(图文详细过程)
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了pycharm连接服务器同步写代码(图文详细过程)相关的知识,希望对你有一定的参考价值。pycharm连接服务 ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了markdown[软件代理设置]相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 安装mysqlclient失败解决办法
    本文介绍了在MAC系统中,使用django使用mysql数据库报错的解决办法。通过源码安装mysqlclient或将mysql_config添加到系统环境变量中,可以解决安装mysqlclient失败的问题。同时,还介绍了查看mysql安装路径和使配置文件生效的方法。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • flowable工作流 流程变量_信也科技工作流平台的技术实践
    1背景随着公司业务发展及内部业务流程诉求的增长,目前信息化系统不能够很好满足期望,主要体现如下:目前OA流程引擎无法满足企业特定业务流程需求,且移动端体 ... [详细]
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • 本文详细介绍了使用C#实现Word模版打印的方案。包括添加COM引用、新建Word操作类、开启Word进程、加载模版文件等步骤。通过该方案可以实现C#对Word文档的打印功能。 ... [详细]
  • Summarize function is doing alignment without timezone ?
    Hi.Imtryingtogetsummarizefrom00:00otfirstdayofthismonthametric, ... [详细]
author-avatar
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有