chenxin's blog
[原创]-identityserver4入门介绍

 

IdentityServer 是什么?

IdentityServer 是一个集认证和授权为一体的框架,借助 Identity Server 框架可以实现 中心认证服务、API 访问授权控制、单点登录、联合网关等功能。

其中 授权功能 是基于 OAuth 2.0 协议规范实现的,认证功能是基于 OpenID Connect(OIDC) 协议实现的。

IdentityServer 常用术语

认证/授权服务器

用于提供统一用户认证(统一登录、统一登出)、授权访问控制的服务器,并向客户端应用提供 身份令牌(Identity Token)、访问令牌(AcessToken)、对客户端发送给资源服务器的令牌进行有效性校验。

 

资源服务器

资源服务器 是 授权服务器要保护的对象,在这里存放的是要被保护的资源,通常指的是 API接口,但也可以是其他信息,资源服务器是客户端应用最终的访问目标,收到客户端的资源访问请求后会对请求进行校验,校验客户端是否已被授权服务器认证通过,如果认证信息检查通过,则检查是否具有对指定资源的访问授权。

 

客户端

也就是常说的第三方系统,客户端想要访问资源服务器之前,必须经过授权服务器的认证以及授权之后才允许访问资源服务器上的相关资源(如 API接口),这里以我的个人博客为例,我的个人博客接入了博客园登录功能,我的个人博客相对于 博客园认证/授权服务器来说就是客户端,我的个人博客要访问博客园的提供的相关 API ,必须通过博客园的认证服务器认证通过后,才能访问博客园相应API。

用户

用户指的是资源的拥有者,客户端应用要对资源服务器上的资源进行访问必须经过 用户的授权才能进行访问,还是以我的个人博客为例,我的个人博客接入了博客园登录功能,如果我要通过博客园来登录,我的个人博客就必须先获取我的博客园账号基础信息,但要获取博客园用户信息调用权限,则必须在博客园认证服务器经过我本人的登录后,我的个人博客才能被认证通过,进而获取 用户信息获取接口的访问权限。

 

Identity Server 职责

IdentityServer主要职责是对用户进行认证、发送访问令牌(AccessToken)、身份令牌(IdentityToken)给第三方应用,并提供一些列的接口给客户端调用 以便客户端进行获取用户信息、获取访问Token(根据刷新Token)、单点登出、AccessToken校验等操作,需要注意的是:Identity Server 并不负责实现API授权访问的具体控制逻辑,仅仅是管理第三方应用客户端具有哪些API访问权限,并把相关的API访问权限在 JWT Token 的声明(Claims)中体现出来,对于具体的API访问控制逻辑必须由各自客户端应用自己内部定制实现,同样的,Identity Server 认证服务器统一登录功能,登录成功后仅仅是认证服务器登录成功,对于客户端应用必须根据从认证服务器登录成功后回传的Identity Token 所包含的用户信息来实现客户端本地的登录逻辑,目前有 Microsoft.AspNetCore.Authentication.OpenIdConnect 这个库来实现客户端的登录。

 

Identity Server 客户端支持哪些类型

Identity Server 支持 Web应用、单页应用、移动原生应用、桌面应用等平台接入。

 

IdentityServer 认证、授权基本流程

用户 首次 访问 客户端 应用,客户端应用检查到未登录,将用户浏览器导航跳转到 认证服务器上,认证服务器检测到当前处于未登录状态,进一步跳转到认证服务器的统一登录页面,用户输入个人账号、密码,登录成功后,先生成认证服务器登录成功的 Cookie, 并向客户端发送 身份Token(Identity Token),资源访问Token(AccessToken), 客户端再进行本地登录,生成本地认证成功的Cookie,然后携带 身份Token、访问Token 去资源服务器上访问相应资源,资源服务器收到请求后,对Token进行认证(借助认证服务器),认证通过,则返回相应的资源。

 

Identity Server 框架相关名词解释

AccessToken: 也就是访问Token, 客户端应用要去访问资源服务器上的API等资源,必须将此Token发送给资源服务器,资源服务器收到AccessToken后,对其进行认证,认证通过后,再判断当前访问Token是否具有访问当前接口的权限,另外AccessToken可以根据需要来包含一些用户的基本信息(其实就是用户声明User Claim),可以通过ApiScope 的 UserClaims 属性来设置哪些用户声明需要被包含到AccessToken中去。

RefreshToken:刷新Token,可以借助刷新Token,获取新的AccessToken.

IdentityToken:身份Token,为JWT token格式,里面包含了用户的一些基本信息,具体包含哪些信息要看这个客户端应用在认证服务器上的配置情况,通常包含用户名、邮箱等信息,身份Token主要用于客户端应用身份认证使用。

IdentityResource :一个IdentityResource可以包含一个或者多个用户声明(Claim),相当于对用户的基础信息进行分组,认证服务器可以通过为客户端应用指定多个IdentityResource来允许客户端应用获取用户的多项基础信息,可以给Client的AllowedScopes属性中包含IdentityResource的名称来控制IdentityToken中应该包含哪些用户信息。

ApiScope:表示具体的API描述信息,可以指定该API依赖于哪个用户声明(User Claim),通过UserClaims属性指定,一个客户端应用具有指定ApiScope的访问权限,那么给其发放的AccessToken中也会包含ApiScope中请求的那些用户声明,资源服务器可以根据这些信息做业务逻辑。

ApiResouce:对ApiScope进行分组,如果客户端应用所允许访问的某个ApiScope在ApiResources 所包含的ApiScope里面(通过Scopes属性来指定ApiResource包含哪些ApiScope),那么为该客户端应用生成的AccessToken中的aud声明列表里面将会有该ApiResources的名称,另外,如果ApiResource的UserClaims属性中包含的UserClaim也在客户端允许请求的UserClaim列表里面,则该UserClaim也会生成到AccessToken中去。

Client:也就是上面说的客户端应用,IdentityServer 中用Client 来唯一标识接入IdentityServer的应用,Client的AllowedScopes属性可以用来指定多个IdentityResource的名称,以便在生成IdentityToken时包含IdentityResource里面指定的哪些用户声明(User Claim),也可以指定多个ApiScope的名称,用来指示客户端应用允许访问哪些Api

User Claim:也就是我们一直提到的用户声明,其实就是一个键值对(key value),用于表示用户的基础信息,如 邮箱:2782815239@qq.com,性别:男 等等之类的,身份Token,访问Token中都可以包含一个或者多个用户声明。

 

非特殊说明,本文版权归 陈新 所有,转载请注明出处.
本文标题:identityserver4入门介绍
(0)
(0)
微信扫一扫
支付宝扫一扫
写作不易,如果本文对你所有帮助,扫码请我喝杯饮料可以吗?
评论列表(0条)
还没有任何评论,快来发表你的看法吧!
{{item.userInfo.nickName}}{{item.userInfo.isBlogger?"(博主)":""}}
{{getUserType(item.userInfo.userType)}} {{formatCommentTime(item.commentDate)}}
回复
{{replyItem.userInfo.nickName}}{{replyItem.userInfo.isBlogger?"(博主)":""}}
@{{replyItem.reply.userInfo.nickName+":"}}
{{getUserType(replyItem.userInfo.userType)}} {{formatCommentTime(replyItem.commentDate)}}
回复
正在加载评论列表... 已经到底啦~~~
文章归档 网站地图 闽ICP备2020021271号-1 百度统计