.net core 笔记
1、 跨域请求、源、同源
同源策略是浏览器的的安全策略,为了保护浏览器。
源:协议(http、https)+ip(域名)+端口
同源:协议(http、https)+ip(域名)+端口都相同
如果不同源,发起的请求可以到服务器,服务器也会正常响应,但是浏览器不允许使用响应的结果。
解决方法
A、 后台模拟http请求,因为跨域是浏览器在限制,后台不是浏览器
B、 服务端支持跨域(对特定方法内加跨域允许、使用AOP然后在方法前加特性、使用中间件全局支持)
C、 Jsonp:利用一些html标签或者js标签去发起请求,然后给定一个回调,比如<a>、<script>、<iframe>标签等,这些标签不受同源策略的限制
2、 依赖注入三种生命周期,针对ServiceA实例来说
A、 singleton(单例):对每次请求(一次请求里可能有多个地方需要ServiceA)里每个需要ServiceA的地方,提供同一个对象实例,下一次请求来也是相同的对象实例(日志)
B、 transient (瞬时):对每次请求(一次请求里可能有多个地方需要ServiceA)里每个需要ServiceA的地方,提供不同对象实例,下一次请求来也是不同的对象实例
C、 scope(作用域):对这一次请求(一次请求里可能有多个地方需要ServiceA)里每个需要ServiceA的地方,提供同一个对象实例,下一次请求来时就与上次不一样了(ef的context连接)
3、 Option配置数据(startup里绑定对象,其他类库或项目需要读取配置数据使用,需要读配置信息时使用依赖注入,注入到需要的地方)
A、 IOptions<配置信息对象>:速度最快,注入后不会再改变
B、 IOptionsMonitor<配置信息对象>:速度最慢,可以监听配置文件的数据变化,实时修改
C、 IOptionsSnapshot<配置信息对象>:速度介于上面两者之间,一次请求里不变,如果配置文件有修改,下次请求时才生效
4、 中间件,是管道(就是委托)的一部分,组装完之后,按顺序执行中间件逻辑代码,调用next执行下一个中间件,类似递归或者俄罗斯套娃
A、 App.use()普通使用,可以执行下一个中间件,但是如果不执行next,也是终结了请求
B、 App.run()终结中间件,不往下走流程了
C、 UseMiddleware<自定义middleware类>,上面两种都是把逻辑代码写在startup里,这种就是把逻辑代码写在类里面,比较通用,
自定义middleware类如果没有实现IMiddleware,则该中间件常驻内存,随进程释放,并且该中间件不用注册进ioc容器;
如果实现IMiddleware,则请求来才实例化,用完马上释放,但该中间件必须手动注册进ioc容器,并且该方式不能传参
5、 中间件主要切入请求管道中,而aop主要是切入方法前后,Filter就是一种实现aop的方式。
Filter也是一种特性
A、 普通特性,写一个类,继承AuthorizationFilter、ActionFilter、ResultFilter、ResouceFilter、ExceptionFilter,然后可以在方法上、控制器上、全局标记这个特性:[你写的Filter类]。这种方式filter无法传参,并且默认是有缓存的。
B、 Filter类如果想实现传参依赖注入(注入其他资源),可以使用全局注册、[ServiceFilter(typeof(你写的Filter类))]、[TypeFilter(typeof(你写的Filter类))]三种方式来实现注入,如果需要不缓存:[TypeFilter(typeof(你写的Filter类),IsReusable=false)]
6、 Jwt和auth2.0
A、 Jwt只是一种令牌生成技术,可以用来做鉴权。通常鉴权中心独立出来,里面保存了资源方所给的公钥,用公钥加密登录成功的用户信息生成一个token,得到该token的客户端就可以去请求资源服务器,资源服务器会使用公钥(对称可逆加密)或者私钥(非对称可逆加密)来解密验证该token的合法性和有效期。
B、 Auth2.0是一种授权的协议,只要授权方和被授权方遵守这个协议去写代码提供服务,那双方就是实现了OAuth模式
Jwt可以用来实现auth2.0。auth2.0一般用来支持第三方登录,如以下流程,其中第三方拿access code去找授权方获取token的时候,授权方就可以使用jwt来生成token
7、 鉴权授权
鉴权(authenticaton):从哪里解析用户信息,cookie还是jwt还是ids4还是url里获取,可以单一地方也可以配置多个地方,关键的类:scheme(方案,默认是cookie)、handle(鉴权处理者,根据scheme从来源解析用户信息)
授权(authorization):判断这个用户允许访问的资源(控制器、方法)。关键的类:policy(策略,各种要求,比如必须是某个角色、用户名是什么、必须有邮箱之类的规则)
8、 对称可逆加密、非对称可逆加密
对称加密:只有一个密钥,可以加密、解密,但因为密钥不能公开,不能支持第三方授权。HS256是其中一种加密算法
非对称加密:有一个私钥、一个公钥,私钥加密,公钥解密,公钥可以公开给第三方,所以支持第三方登录。RS256是其中一种加密算法
9、 Token滑动过期(客户端用着用着就过期)
A、 每次请求带token过来时,校验时先不检查token自带的过期时间,而是先把token写进redis并设置过期时间比如3分钟,如果redis没这个token了(表示3分钟之内这个token没有请求过来),再校验token自带的有效期。(该方案不常用)
B、 双token,用户登录时授权中心颁发两个token,一个AccessToken(在授权中心也缓存起来),一个RefreshToken(有效期比AccessToken长)。当AccessToken过期时,客户端使用RefreshToken请求授权中心接口,如果有效,返回给客户端新的AccessToken和RefreshToken。(通用方法)
10、 缓存
A、 客户端缓存:方法前加特性[ResponsCache(Duration=600)]、方法内直接往response里的headers加“Cache-Control”值、filter里修改header、中间件里修改headery
B、 Dns缓存:cdn
C、 反向代理缓存:nginx里可以配置针对特定请求缓存、也可以使用静态化(程序里使用中间件对要缓存的地址生成文件保存在本地,nginx配置监听到这个请求地址时先去本地找有没有这个文件)
D、 服务端缓存
A、 中间件缓存(action/filter/view都不执行),.netcore有自带缓存中间件,startup里配置AddResponseCaching、UseResponseCaching后,在action方法上加特性[ResponsCache(Duration=600)]
B、 Filter缓存-ResourceFilter(action不执行,但是result过程(把actionResult转成html或json)要执行,因为跳过action后,resourceFilter的executed方法之后还要执行result过程),filter定义一个字典,第一次把context.result保存进去
C、 本地缓存(进到action了),使用IMemoryCache
D、分布式缓存(进到action了),services.AddDistributedRedisCache
11、 线程安全集合