IdentityServer4 介绍以及一些名词解释

Tips:本篇已加入,.Net core 3.1 使用IdentityServer4 实现 OAuth2.0 --阅读目录  可点击查看更多相关文章。

前言

本来这篇随笔,开始写之前我大概罗列了一下,准备还是先带大家了解一下IdentityServer的一些概念,顺便解释一下之后实战篇会提及的一些名词,我重新翻了一遍官方文档后正好说到 startup,我觉得 .net core Startup中,

Authentication 和 Authorization 有必要说一下,这两个看似差不多的单词,确实一开始我自己也傻傻分不清楚到底是干嘛的,那么现在言归正传,开始今天的随笔。

 


 

 

IdentityServer4介绍

学习一个技术最好的文档就是官方文档 https://identityserver4.readthedocs.io/en/3.1.0/  如果英语阅读能力有限,可以网络上搜一下有没有大牛的中文翻译+案例演示,最终大家还是要尝试阅读官方文档,有能力的甚至可以看一下源码(这一点我自己也在努力中)。

那么从这篇文章开始说到做到,我们看一下 英文的介绍: 

IdentityServer4 is an OpenID Connect and OAuth 2.0 framework for ASP.NET Core.

It enables the following features in your applications:

Authentication as a Service
Centralized login logic and workflow for all of your applications (web, native, mobile, services). IdentityServer is an officially certified implementation of OpenID Connect.
 
Single Sign-on / Sign-out
Single sign-on (and out) over multiple application types.
 
Access Control for APIs
Issue access tokens for APIs for various types of clients, e.g. server to server, web applications, SPAs and native/mobile apps.
 
Federation Gateway
Support for external identity providers like Azure Active Directory, Google, Facebook etc. This shields your applications from the details of how to connect to these external providers.
 
Focus on Customization
The most important part - many aspects of IdentityServer can be customized to fit your needs. Since IdentityServer is a framework and not a boxed product or a SaaS, you can write code to adapt the system the way it makes sense for your scenarios.
 
Mature Open Source
IdentityServer uses the permissive Apache 2 license that allows building commercial products on top of it. It is also part of the .NET Foundation which provides governance and legal backing.
 
Free and Commercial Support
If you need help building or running your identity platform, let us know. There are several ways we can help you out.

意思就是告诉大家 IdentityServer4 是一个 同时实现了OpenID Connect and OAuth 2.0(什么是OAuth2.0 这里我开一个传送门 可以看之前的博客) 的.netcore 框架 ,

注意看7个加粗的标题:作为服务进行身份验证  , 单点登录注销SSO , API资源的访问控制  ,对外部平台的支持    ,专注于定制 , 成熟的开源免费和商业支持

意思就是ID4 已经很成熟的一个身份认证框架,支持Azure,谷歌,facebook等平台,可以在框架里定制一些功能,并且开源免费也可以在源代码层面进行修改,

这样我们可以省去很多时间去构造一个符合标准流程的授权服务,并且我们相信一个成熟的开源项目在代码执行效率上也是大家公认的。

 

文档目录如下

 

 

 

INTRODUCTION 介绍 (理论概念)

QUICKSTARTS 快速开始(大部分文档都是有一个快速的可运行的demo案例)

TOPICS 话题 (比较着重的可以分类出来的点) 

ENDPOINTS (这个我不知道怎么翻译,就和我们常说的到这个服务端endpoint,startup中配置路由的endpoint差不多的概念)

REFERENCE 参考(一些名词的解释,就像我们看书的时候 下面的注释)

MISC 其他 

我分享一下我的学习方式:

1.基础概念肯定先看,我们至少要知道这个能做什么.

2.然后一开始可能接触原版文档对我来说会比较难,我也会网络上看一些国内的翻译一些demo,这个时候我已经大致能知道怎么用了

3.哪块东西不明白我才会针对性的在官网里搜索关键词,或者是哪一块我觉得demo里可能还有一些属性没说清楚我再看看文档

4.结合项目实战 :那当然有时候我会做一些技术储备,更多的是我碰到了什么问题需要在项目中用到,毕竟实践出真知

(强调:不是真实开发中都要用到最新的技术,适合场景的才是最好的,不要盲目一味的堆用新技术)

5.最最后,我会整理一下 x-mind ,在公司内做一些技术分享,这会很有用,因为你要授课,你就必须至少自己理清楚(也感谢腾讯直播,让我在公司内部做了一把直播)

 


 

 名词解释

之后的实战中我可能会提及一些名词,这里我先解释一下,或者告诉一下大家 哪些东西我缩写,简称成什么:

 

ID4 :之后IdentityServer4 我都会简称成 ID4 。

用户:真实的操作手机,微信,或者网站的人。

客户端:访问资源的程序,可能是web的,客户端的,或者时一个控制台程序(也可能时一个api 他要访问另一个资源api那么这个api以后的文章中我也会称为客户端)。

资源:那些受到保护的api接口就属于资源,比如用户要查询的数据,用户要做的数据操作,用户要看的图片。

认证授权服务器:ID4程序的所在服务器,办法令牌也是通过他,是否能够授权也是他,物理上可以和资源服务器是一个。

资源服务器:通常就是我们的网站后台,api后台,或者是文件服务器。

令牌:之后文章中涉及到的通过认证服务办法的包括JWT等的这些字符串。

授权头:http请求 Headers里面 key为Authorization 对应的value 之后都会直接写成授权头。

Schame/方案名: 授权头一般格式都是 Bearer xxxxxxxx  这个Bearer之后文章会直接用 Schame称呼。

Policy/规则: 规则名称 我们控制器上会加一个[Authorize] 这个标签可以支持一个参数policy ,类似  [Authorize("AuthJWT")] 这样可以针对 AuthJWT这个policy做单独的处理。

 

那么后面文章我会说 方案名是BenBearer的授权头, 意思就是   Authorization的value, Schame是BenBearer这个字符串。

 


 

Authentication 和 Authorization 

先介绍一下我怎么记这两个东西的,记住一个单词:认证授权,字母顺序先c后z,然后拆开看 认证是c(Authentication)授权是z(Authorization),就像背口诀一样,再讲一下他俩做了什么:

你去公司上班前台给你发了门卡,然后你拿了门卡去刷卡开门,发门禁卡这步操作肯定是比你去刷门禁卡先做的。

发门禁卡就是认证(前台已经识别了你的身份了你是这个公司的员工,才会发给你),刷卡开门就是授权(你会发现自己办公室的门可以刷开,老板办公室的刷不开,因为老板办公室这个资源你不能拥有)

 

我这里po一下之前asp.net的 认证和授权的代码:

我找了之前.net framework代码 认证都是自己实现的,好尴尬,那就不贴代码了,授权我贴一下代码:

 

 

 有没有看到 重写的是 OnAuthorization 这个方法。

官网上我找了一下asp.net mvc的 HttpApplication 事件执行顺序:

按照以下顺序引发应用程序事件:

  1. BeginRequest

  2. AuthenticateRequest

  3. PostAuthenticateRequest

  4. AuthorizeRequest

  5. PostAuthorizeRequest

  6. ResolveRequestCache

  7. PostResolveRequestCache

    事件之后 PostResolveRequestCache 和 PostMapRequestHandler 事件之前,事件处理程序 (这是与创建的请求 URL) 对应的页面。 如果服务器在集成模式下运行 IIS 7.0,并且至少 .NET Framework 版本3.0,则 MapRequestHandler 会引发事件。 如果服务器在经典模式下运行 IIS 7.0 或 IIS 的早期版本,则无法处理此事件。

  8. PostMapRequestHandler

  9. AcquireRequestState

  10. PostAcquireRequestState

  11. PreRequestHandlerExecute

    执行事件处理程序。

  12. PostRequestHandlerExecute

  13. ReleaseRequestState

  14. PostReleaseRequestState

    PostReleaseRequestState引发事件后,任何现有响应筛选器都将筛选输出。

  15. UpdateRequestCache

  16. PostUpdateRequestCache

  17. LogRequest.

    此事件在 IIS 7.0 集成模式下受支持,并且至少 .NET Framework 3。0

  18. PostLogRequest

    此事件支持 IIS 7.0 集成模式,并且至少支持 .NET Framework 3。0

  19. EndRequest

 

 如果按照正规流程也是 认证在 授权之前处理。

 重点关注 !毕竟我们系列讲的是netcore 下面看下netcore中,授权认证是怎么处理的

netcore的启动的一个核心文件 startup (再开一个传送门,之后会针对netcore核心做一个系列,先预留坑位)中进行认证授权的注入以及使用

ConfigureServices 方法中(这个方法里面做的事情主要是将服务注入到容器中)进行认证的注入

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

  //注入授权Handler
  services.AddSingleton<IAuthorizationHandler, PermissionHandler>();
  services.AddSingleton(permissionRequirement);

services.AddAuthorization(options =>
{
  options.AddPolicy(policyName,
  policy => policy.Requirements.Add(permissionRequirement));
}) .AddAuthentication(options
=> {   options.DefaultScheme = defaultScheme; }) .AddJwtBearer(defaultScheme, o => {   //不使用https   o.RequireHttpsMetadata = isHttps;   o.TokenValidationParameters = tokenValidationParameters; });

大致意思就是做了认证授权处理的一些逻辑 授权头自己定了方案名,授权有自己的规则,也有自己的一些环境变量,controller里 [Authorize("AuthJWT")] 这样的标签我就能解析出来

并且 PermissionHandler 这个类就是重写了如何去授权。具体实战再细说。

最后 Configure 方法中去使用认证和授权的中间件,否则刚才的注入都白搭

app.UseHttpsRedirection();

app.UseAuthentication();
app.UseRouting();

app.Use(next => context =>
{
    context.Request.EnableBuffering();
    return next(context);
});

//add by benjamin 使用跨域
app.UseCors("AllowAll");

app.UseAuthorization();

 

注意!!

在.net 2.1中是没有UseAuthorization方法的,

在3.0之后微软明确的把授权功能提取到了Authorization中间件里,所以我们需要在UseAuthentication之后再次UseAuthorization。

否则,当你使用授权功能比如使用[Authorize]属性的时候系统就会报错。

 

 

 

 

 

是不是简单易懂,今天你学废了吗?

 如果觉得本篇随笔对你有帮助,请点击右下方的 【推荐👍】,或者给作者 【打赏】,感谢大家的支持,这将成为作者继续写作的动力。
posted @ 2020-09-16 22:08  Benjamin杰明  阅读(794)  评论(3编辑  收藏  举报