引言

通常,服务所公开的资源和 API 必须仅限受信任的特定用户和客户端访问。那进行 API 级别信任决策的第一步就是身份认证——确定用户身份是否可靠。

在微服务场景中,身份认证通常统一处理。一般有两种实现形式:

  1. 基于API 网关中心化认证:要求客户端必须都通过网关访问微服务。(这就要求提供一种安全机制来认证请求是来自于网关。)

  2. 基于安全令牌服务(STS)认证:所有的客户端先从STS获取令牌,然后请求时携带令牌完成认证。

Identity Service就是使用第二种身份认证方式。

服务简介

Identity microservice 主要用于统一的身份认证和授权,为其他服务提供支撑。

提到认证,大家最熟悉不过的当属Cookie认证了,它也是目前使用最多的认证方式。但Cookie认证也有其局限性:不支持跨域、移动端不友好等。而从当前的架构来看,需要支持移动端、Web端、微服务间的交叉认证授权,所以传统的基于Cookie的本地认证方案就行不通了。我们就需要使用远程认证的方式来提供统一的认证授权机制。
而远程认证方式当属:OAuth2.0和OpenID Connect了。借助OAuth2.0和OpenID Connect即可实现类似下图的认证体系:

而如何实现呢,借助:

  1. ASP.NET Core Identity

  2. IdentityServer4

基于Cookie的认证和基于Token的认证的差别如下所示:

架构模式

从目录结构可以看出它是一套MVC单层架构的网站。我们可以单独进行运行和调试,也可以把它放进自己的项目中。

主要依赖:

1、HealthCheck 健康检查

2、WebHost

3、Entity Framework

4、Autofac

5、IdentityServer4

6、其中IdentityServer4.AspNetIdentity又用到了ASP.NET Core Identity

启动流程

Program.cs

Main函数:

BuildWebHost函数:

其中有一个UseHealthChecks,这是一个对项目健康的检查。

健康检查,其实这个名称已经很明确了,它是检查你的应用程序是否健康运行的一种方式。随着当前各类项目越来越多的应用程序正在转向微

服务式架构,健康检查就变得尤为关键。虽然微服务体系结构具有许多好处,但其中一个缺点就是为了确保所有这些服务都正常运行的操作开销

更高。你不在是监视一个庞大的整体项目的健康状况,而是需要监控许多不同服务的状态,甚至这些服务通常只负责一件事情。健康检查(Heatlh

Checks)通常与一些服务发现工具结合使用,如Consul  ,来监控您的微服务器,来观测您的服务是否健康运行。

健康检查有很多种不同的方法,但最常见的方法是将HTTP端点暴露给专门用于健康检查的应用程序。一般来说,如果一切情况都很好,你的服

务将返回200的状态码,然而任何非200的代码则意味着出现问题。例如,如果发生错误,你可能会返回500以及一些出错的JSON信息。

ASP.NET Core Identity && IdentityServer4简介

ASP.NET Core Identity用于构建ASP.NET Core Web应用程序的成员资格系统,包括成员资格,登录和用户数据(包括登录信息、角色和声明)。
ASP.NET Core Identity封装了User、Role、Claim等身份信息,便于我们快速完成登录功能的实现,并且支持第三方登录(Google、Facebook、QQ、Weixin等,支持开箱即用[第三方身份提供商列表]),以及双重验证,同时内置支持Bearer 认证(令牌认证)。

虽然ASP.NET Core Identity已经完成了绝大多数的功能,且支持第三方登录(第三方为其用户颁发令牌),但若要为本地用户颁发令牌,则需要自己实现令牌的颁发和验证逻辑。换句话说,我们需要自行实现OpenId Connect协议。

OpenID Connect 1.0 是基于OAuth 2.0协议之上的简单身份层,它允许客户端根据授权服务器的认证结果最终确认终端用户的身份,以及获取基本的用户信息。

而IdentityServer4就是为ASP.NET Core量身定制的实现了OpenId Connect和OAuth2.0协议的认证授权中间件。IdentityServer4在ASP.NET Core Identity的基础上,提供令牌的颁发验证等。

相关知识:

OAuth 2.0 简介

OpenID Connect 简介

Identity Server 4

认证流程

在ASP.NET Core中使用的是基于申明(Claim)的认证,而什么是申明(Cliam)呢?

Claim 是关于一个人或组织的某个主题的陈述,比如:一个人的名称,角色,个人喜好,种族,特权,社团,能力等等。它本质上就是一个键值对,是一种非常通用的保存用户信息的方式,可以很容易的将认证和授权分离开来,前者用来表示用户是/不是什么,后者用来表示用户能/不能做什么。在认证阶段我们通过用户信息获取到用户的Claims,而授权便是对这些的Claims的验证,如:是否拥有Admin的角色,姓名是否叫XXX等等。

认证主要与以下几个核心对象打交道:

  1. Claim(身份信息)

  2. ClaimsIdentity(身份证)

  3. ClaimsPrincipal (身份证持有者)

  4. AuthorizationToken (授权令牌)

  5. IAuthenticationScheme(认证方案)

  6. IAuthenticationHandler(与认证方案对应的认证处理器)

  7. IAuthenticationService (向外提供统一的认证服务接口)

那其认证流程是怎样的呢?

1、用户打开登录界面,输入用户名密码先行登录,服务端先行校验用户名密码是否有效,有效则返回用户实例(User)。

2、这时进入认证准备阶段,根据用户实例携带的身份信息(Claim),创建身份证(ClaimsIdentity),然后将身份证交给身份证持有者(ClaimsPrincipal)持有。

3、接下来进入真正的认证阶段,根据配置的认证方案(IAuthenticationScheme),使用相对应的认证处理器(IAuthenticationHandler)进行认证 。认证成功后发放授权令牌(AuthorizationToken)。该授权令牌包含后续授权阶段需要的全部信息。

授权流程

授权就是对于用户身份信息(Claims)的验证,,授权又分以下几种种:

  1. 基于Role的授权

  2. 基于Scheme的授权

  3. 基于Policy的授权

授权主要与以下几个核心对象打交道:

  1. IAuthorizationRequirement(授权条件)

  2. IAuthorizationService(授权服务)

  3. AuthorizationPolicy(授权策略)

  4. IAuthorizationHandler (授权处理器)

  5. AuthorizationResult(授权结果)

那授权流程是怎样的呢?

当收到授权请求后,由授权服务(IAuthorizationService)根据资源上指定的授权策略(AuthorizationPolicy)中包含的授权条件(IAuthorizationRequirement),找到相对应的授权处理器(IAuthorizationHandler )来判断授权令牌中包含的身份信息是否满足授权条件,并返回授权结果。

中间件集成

回过头来我们再来刷一遍startup代码中是怎么集成进Identity service的。

1. 首先是映射自定义扩展的User和Role

// 映射自定义的User,Roleservices.AddIdentity<ApplicationUser, IdentityRole>().AddEntityFrameworkStores<ApplicationDbContext>()//配置使用EF持久化存储.AddDefaultTokenProviders();//配置默认的TokenProvider用于变更密码和修改email时生成Token

2. 配置IdentityServer服务

使用AddConfigurationStoreAddOperationalStore扩展方法就是用来来指定配置数据和操作数据基于EF进行持久化。

3. 添加IdentityServer中间件

app.UseIdentityServer(); 

4. 预置种子数据

需要预置Client和Resource写在Config.cs文件中,他们又是中main函数中被MigrateDbContext使用的。

  • GetClients

  • IdentityResources

身份资源是用户ID、姓名或电子邮件地址等数据

  • ApiResources

5. 迁移数据库上下文

IdentityServer为配置数据和操作数据分别定义了DBContext用于持久化,配置数据对应ConfigurationDbContext,操作数据对应PersistedGrantDbContext。详细看main函数。

这篇文章使用了园子里『___知多少』文章对不少内容,表示感谢,原文链接eShopOnContainers 知多少[3]:Identity microservice。

相关文章:

  • eShopOnContainers 看微服务 ①:总体概览

  • eShopOnContainers 看微服务 ②:配置 启动

  • eShopOnContainers 知多少[1]:总体概览

  • eShopOnContainers 知多少[2]:Run起来

  • eShopOnContainers 知多少[3]:Identity Microservice

  • eShopOnContainers 知多少[4]:Catalog microservice

  • Catalog Service - 解析微软微服务架构eShopOnContainers(三)

  • eShopOnContainers 知多少[5]:EventBus With RabbitMQ

  • EventBus In eShop -- 解析微软微服务架构eShopOnContainers(四)

  • eShopOnContainers 是一个基于微服务的.NET Core示例框架

原文地址:https://www.cnblogs.com/tianyamoon/p/10081277.html


.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

eShopOnContainers 看微服务③:Identity Service相关推荐

  1. eShopOnContainers 看微服务④:Catalog Service

    服务简介 Catalog service(目录服务)维护着所有产品信息,包括库存.价格.所以该微服务的核心业务为: 产品信息的维护 库存的更新 价格的维护 架构模式 先看代码结构(下图). 主要依赖: ...

  2. eShopOnContainers 看微服务 ②:配置 启动

    一.什么是docker Docker 是一个开源项目,通过把应用程序打包为可移植的.自给自足的容器(可以运行在云端或本地)的方式,实现应用程序的自动化部署. 使用 Docker 的时候,需要创建一个应 ...

  3. eShopOnContainers 看微服务 ①:总体概览

    一.简介 eShopOnContainers是一个简化版的基于.NET Core和Docker等技术开发的面向微服务架构的参考应用. 该参考应用是一个简化版的在线商城/电子商务微服务参考示例应用. 其 ...

  4. 浅谈服务治理、微服务与Service Mesh(一二三)

    本文为转载#原文链接:易商阜极 引言 本系列文章将为大家介绍当下最流行的服务治理.微服务等相关内容,从服务治理.SOA.微服务到最新的服务网格(Service Mesh)进行综合介绍和分析.作为本系列 ...

  5. 微服务时代--service meshAGW

    转载自:https://zhuanlan.zhihu.com/p/61901608 Service Mesh Service Mesh作为下一代微服务技术的代名词,初出茅庐却深得人心一鸣惊人,大有一统 ...

  6. 从运维角度看微服务 k8s部署微服务【偏理论】【AL】

    从运维角度看微服务 & 部署微服务[偏理论] 1.微服务的特点 服务组件化: 每个服务独立开发.部署,有效避免一个服务的修改引起整个系统重新部署. 技术栈灵活: 约定通信方式,使得服务本身功能 ...

  7. 下一代微服务(service Mesh)

    有没有同学了解过Service Mesh. 什么是Service Mesh? 简单来说,它可以直接翻译成服务网格.它是一个基础设施层,用于处理服务之间的通信,并且负责请求的可靠传输.什么意思呢? se ...

  8. 下一代微服务!Service Mesh 2018年度总结

    作者团:敖小剑.崔秀龙.单家骏.宋净超.田晓亮.徐蓓.张超盟 \n 前言 \n 在2017年年底,在Service Mesh刚刚兴起之时,应InfoQ的邀请撰写过一篇名为 "Service ...

  9. 浅谈服务治理、微服务与Service Mesh(二) Spring Cloud从入门到精通到放弃

    引言 作为本系列文章的第二篇,本文主要为大家介绍下微服务概念中非常火热的Spring Cloud开发框架.由于网上关于Spring Cloud的文章多如牛毛,为了让大家阅读后能有不一样的收获,因此本文 ...

最新文章

  1. dvwa_xss_储存型
  2. Nginx教程-location配置
  3. 类加载器 jboss_JBoss AS 7类加载说明
  4. 请写一个java程序实现线程连接池功能_写一个java程序实现线程连接池的功能
  5. 微信小程序 promise 化
  6. 年入百万的表弟给我上一课:互联网思维该怎么接地气
  7. 系统分析与设计的三个发展阶段
  8. ubuntu下使用pip卸载包时出现Cannot uninstall scipy
  9. 微信支付宝刷步数_一劳永逸版(在用)
  10. if while的用法
  11. 关于使用TP-Link桥接小米路由器
  12. 计算机网络学习 - 网卡
  13. 外贸收款(解析重点)——上海赢支付wintopay
  14. TSC打印机ttp-247(java)
  15. 别再说你不会!java嵌入式开发教程
  16. opnet学习001,入门的好例子
  17. 腾讯安全ApkPecker上线DEX-VMP自动化脱壳服务
  18. 15款顶级的开源人工智能工具推荐
  19. lgo怎么打开o文件_GO语言文件的创建与打开实例分析
  20. openstack修改密码

热门文章

  1. Go开发Struct转换成map两种方式比较
  2. OPC Client “failed to execute OPCENUM” 解决方法
  3. 探索java世界中的日志奥秘
  4. javascript深拷贝和浅拷贝
  5. Mybatis-Generator(MBG)教程与Idea的MBG插件
  6. 对抗告警疲劳的8种方法
  7. 对C# 程序员来说现在是到目前为止最好的时代
  8. hdu 2579 BFS
  9. asp.net 得到上一页地址
  10. RIAMeeting第六次开发者交流活动。