Tips:本篇已加入,.Net core 3.1 使用IdentityServer4 实现 OAuth2.0 --阅读目录 可点击查看更多相关文章。html
原本这篇随笔,开始写以前我大概罗列了一下,准备仍是先带你们了解一下IdentityServer的一些概念,顺便解释一下以后实战篇会说起的一些名词,我从新翻了一遍官方文档后正好说到 startup,我以为 .net core Startup中,ios
Authentication 和 Authorization 有必要说一下,这两个看似差很少的单词,确实一开始我本身也傻傻分不清楚究竟是干吗的,那么如今言归正传,开始今天的随笔。程序员
学习一个技术最好的文档就是官方文档 https://identityserver4.readthedocs.io/en/3.1.0/ 若是英语阅读能力有限,能够网络上搜一下有没有大牛的中文翻译+案例演示,最终你们仍是要尝试阅读官方文档,有能力的甚至能够看一下源码(这一点我本身也在努力中)。web
那么从这篇文章开始说到作到,咱们看一下 英文的介绍: api
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等平台,能够在框架里定制一些功能,而且开源免费也能够在源代码层面进行修改,mvc
这样咱们能够省去不少时间去构造一个符合标准流程的受权服务,而且咱们相信一个成熟的开源项目在代码执行效率上也是你们公认的。
文档目录以下
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这个字符串。
先介绍一下我怎么记这两个东西的,记住一个单词:认证受权,字母顺序先c后z,而后拆开看 认证是c(Authentication)受权是z(Authorization),就像背口诀同样,再讲一下他俩作了什么:
你去公司上班前台给你发了门卡,而后你拿了门卡去刷卡开门,发门禁卡这步操做确定是比你去刷门禁卡先作的。
发门禁卡就是认证(前台已经识别了你的身份了你是这个公司的员工,才会发给你),刷卡开门就是受权(你会发现本身办公室的门能够刷开,老板办公室的刷不开,由于老板办公室这个资源你不能拥有)
我这里po一下以前asp.net的 认证和受权的代码:
我找了以前.net framework代码 认证都是本身实现的,好尴尬,那就不贴代码了,受权我贴一下代码:
有没有看到 重写的是 OnAuthorization 这个方法。
官网上我找了一下asp.net mvc的 HttpApplication 事件执行顺序:
按照如下顺序引起应用程序事件:
|
若是按照正规流程也是 认证在 受权以前处理。
重点关注 !毕竟咱们系列讲的是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]属性的时候系统就会报错。 |
是否是简单易懂,今天你学废了吗?
若是以为本篇随笔对你有帮助,请点击右下方的 【推荐👍】,或者给做者 【打赏】,感谢你们的支持,这将成为做者继续写做的动力。 |