asp.net core 是一个跨平台的高性能开源框架,可实现一下需求:1:创建Web应用程序和服务、loT应用和移动后端;2、在Windows、macOS和Linux上使用喜爱的开发工具;3、部署到云或本地;4、在.Net Core或.Net Framework上运行,是一个重设计的asp.net 4.x,微软重构了整个asp.net 体系结构,形成了更精简的模块化框架
asp.net core优点:
1、统一编程模型
2、支持针对可测试性进行构建
3、Razor Pages可以使用页面的编码方式更简单高效
4、支持Blazor框架,Blazor允许在浏览器中使用C#和JavaScript,共享全部使用.NET编写的服务器端和客户端用逻辑
5、能够在Windows、macOS和Linux上运行
6、支持开源代码和以社区为中心
7、集成新式客户端框架和开发工作流
8、支持使用GRPC协议远程调用
9、基于环境的云就绪配置系统
10、内置依赖注入
11、能够托管到kestrel、IIS、HTTP.sys、Nginx、Apache和Docker等服务器或容器中
12、支持轻型的高性能模块化HTTP请求管道
13、支持并行版本控制
14、支持新式Web开发工具,如Visual Stiudio Code
ASP.NET Core主要支持Web Pages项目、MVC项目和WebAPI项目,不支持基于WebForm框架的Web应用程序项目
二、ASP.NET Core中的应用启动
.net core本质上是一个独立的控制台应用程序,拥有内部自托管(Self-Hosted),由该服务器处理外部请求
调用CreateHostBuilder()方法创建IWebHostBuilder实例
调用Build()方法,IWebHostBuilder实例负责创建IWebHost实例对象
调用Run()方法,启动IWebHost实例
通过ConfigureWebHostDefaults()方法来使用Startup类中所定义的环境、中间件、服务配置
Startup类: 是应用程序的入口,可以设置配置,将应用程序中要使用的服务连接起来,开发者可以在Startup类中配置请求管道,该管道将用于处理应用程序的所有请求
ASP.NET 将基于命名空间选择以匹配项目的根命名空间有限,否者使用第一个按字母排列的命名空间中的类
Configure()方法: 指定应用程序将如何响应每一个HTTP请求,开发者可以配置每个请求都接收相同的响应,现实使用中应用程序却需要更多、更复杂功能、这些功能主要用过管道配置来实现,更复杂的管道配置可以封装到中间件(Middleware)中,通过扩展方法添加IApplicationBuilder上,Configure方法必须接受一个IApplicationBuilder参数
ConfigureService()方法: 配置应用程序内的服务,通过参数获取一个实现了IServiceCollection接口的实例,ConfigureService()方法需要在Configure()方法之前被调用
三、ASP.NET Core中的跨域请求
浏览器中的网页只能向本源网站发送请求,此限制称为相同源策略,防止恶意站点读取另一个站点中的敏感数据,如果要访问其他网站中的数据需要允许其他站点对开发者的应用进行跨域请求
.NET Core支持跨院资源共享(CORS)在ConfigureServices()中调用AddCors()方法添加跨域策略
{
app.UseCors() //将cors添加到应用请求中
}
四、ASP.NET Core依赖注入
依赖注入是实现对象及其合作者或依赖项之间松散耦合技术(高层模块不应该依赖于底层模块,两者都应该依赖于抽象),类要求在他们构造时向其提供抽象(接口)而不是引用特定实现,类通过它们的构造函数声明其依赖关系,允许它们遵循显示依赖原则,这种方法被称为构造函数注入
当系统被设计使用DI,很多类通过它们的构造函数(或属性)请求其依赖关系,有一个类被用来创建这些类及其相关的依赖关系很有帮助,这些类被称为容器(控制反转 Inversion of Control)或称为注入容器
依赖注入DI和控制反转IOC 是从不同的角度描述同一件事情,通过引入IOC容器并利用依赖关系注入的方式实现对象之间的解耦
依赖注入通过以下方式实现了解耦合性:1、使用接口或基类抽象化依赖关系实现;2、创建ProductService类实现接口IProductService中的方法3、注册服务容器中的依赖关系;4、将服务注入到使用它的类的构造函数中;
AddTransient | 每次从服务容器进行请求时创建 |
AddScoped | 以每个客户端请求(连接)一次就能创建服务 |
AddSingleton | 服务是在第一次请求时或运行Startup ConfigureServices并且使用服务注册指定实例时创建的,允许服务容器管理服务的生存周期 |
在中间件内使用有作用域的服务时,请将该服务注入至Invoke()方法或InvokeAsync()方法中,请不要通过构造函数注入的方式进行注入,因为它会导致服务的行为与单一实例类似
从单一实例解析有用的作用域的服务很危险,当处理后续请求时,它可能会导致服务处于不正确的状态
---------------------------------------------------------------------------------------------------------------------------
JWT是一个开放标准RFC 7519 是目前最流行的跨域认证解决方案,定义一种紧凑且自包含的方式,跨域认证等
结构:Header、Payload、Signature eg:xxxxx.yyyyy.zzzzz
header:由两部分组成令牌类型JWT和散列算法HMAC SHA256
playload:存放声明类型,Registered claims注册说明,Public claims公开说明,Private claims私有说明
对于已经签名的令牌,此消息尽管收到篡改保护,但任何人都可以阅读,除非加密,否则不要将密密信息存放在JWT的有效内容或标题元素中
Signature:验证发送请求者身份,由前两部分加密形成
JWT特点:1、默认是不加密的;2、不仅可用于认证,也可用于交换信息,3、缺点是服务器不保存Session状态,因此不能在使用过程中废止某个Token,或者更改Token权限,4、一旦泄露,任何人都可以获得该令牌权限
JWT工作原理:当用户使用它们的凭证登录成功时,Token将被保存在本地,也可以使用cookie,无论何时用户想要访问受保护的路由或资源,通常在请求Authorization字段中使用Bearerschema,这是一种无状态的身份验证机制,服务器受保护的路由将在授权头中检查有效的JWT,jwt是独立的,所有必要信息都在jwt中,目的减少多次查询数据库需求,这使使用者可以完全依赖无状态的数据API,甚至向下游服务提出请求,因此不会出现跨域资源共享CORS问题
使用已签名的令牌,令牌中包含所有信息也会暴露给用户或其他地方,在jwt中不应该在Playload里面加入任何敏感的数据,比如密码,如果将密码放入jwt中 那么怀有恶意的第三方将通过Base64解码知道用户的密码
因篇幅问题不能全部显示,请点此查看更多更全内容