文章编号:3236时间:2024-05-07人气:
ASP.NET Core 是 Microsoft 开发的一个免费开源的 Web 应用程序框架。它设计用于构建高性能、可扩展且安全的 Web 应用程序。
本文将介绍 ASP.NET Core 中的各种性能优化和安全功能。我们将探索如何使用这些功能来提高网站的速度、可靠性和安全性。
//使用 gzip 压缩public void ConfigureServices(IServiceCollection services){services.AddResponseCompression(options =>{options.MimeTypes = new[] { "text/css", "text/javascript", "text/plain", "text/html", "application/json" };});}
//使用 HTTPSpublic void ConfigureServices(IServiceCollection services){services.AddHttpsRedirection(options =>{options.HttpsPort = 443;});}
//防止 XSS 攻击public void ConfigureServices(IServiceCollection services){services.AddHtmlSanitizer(options =>{options.AllowedTags.Add("p");options.AllowedTags.Add("b");options.AllowedTags.Add("i");});}
//防止 SQL 注入攻击public object GetUserData(string username){using (var connection = new SqlConnection("connectionString")){using (var command = connection.CreateCommand()){command.CommandText = "SELECT FROM Users WHERE Username = @username";command.Parameters.AddWithValue("@username", username);using (var reader = command.ExecuteReader()){if (reader.Read()){return new User{Username = reader["Username"].ToString(),Email = reader["Email"].ToString()};}}}}return null;}
是微软公司推出的一款Web应用程序开发框架,它拥有丰富的功能和强大的扩展性,可以帮助开发者快速构建高效的Web应用程序。而的源码则是其内部机制的核心,通过深入探究源码,我们可以更好地了解的工作原理和实现方式,从而更好地应用进行Web开发。
获取源码
首先,我们需要获取的源码。的源码是开源的,可以通过GitHub获取。具体操作步骤如下:
1.打开GitHub网站,搜索“aspnet”,进入aspnet仓库页面。
2.在仓库页面中,点击“Cloneordownload”按钮,选择“DownloadZIP”选项,下载aspnet源码压缩包。
3.解压下载的压缩包,即可获取aspnet源码。
源码结构
源码是一个巨大的代码库,包含了许多子项目和模块。其中,最核心的子项目是“aspnetcore”和“aspnetwebstack”。
“aspnetcore”是的源码,它是的最新版本,具有更高的性能和更好的跨平台支持。
“aspnetwebstack”是的源码,它是的WebAPI框架,用于构建RESTfulWeb服务。
此外,源码还包含了许多其他的子项目和模块,如“EntityFramework”、“SignalR”、“Identity”等,这些子项目和模块都是的重要组成部分。
源码解析
在深入探究源码之前,我们需要先了解的工作原理和基本概念。
是一个基于MVC(Model-View-Controller)模式的Web应用程序框架,它的工作原理可以简单地描述为:
1.客户端向服务器发送请求。
2.服务器接收请求,根据请求的URL和HTTP方法选择对应的Controller。
接收请求,根据请求的参数和业务逻辑生成Model。
将Model传递给View。
将Model渲染成HTML页面,并返回给客户端。
在中,Controller和View都是由开发者编写的代码,而Model则可以是从数据库、文件系统、缓存等数据源中获取的数据。
源码分析
了解了的工作原理和基本概念之后,我们可以开始深入探究源码了。
源码是一个非常庞大的代码库,涵盖了许多不同的模块和功能。在这里,我们只能对其中的一部分进行简单的介绍。
路由
在中,路由是将请求的URL映射到对应的Controller和Action的过程。的路由系统是由框架提供的,它可以根据请求的URL和HTTP方法选择对应的Controller和Action。
在源码中,路由系统的核心代码位于“”命名空间中。其中,最重要的类是“RouteBuilder”和“RouteCollection”。
“RouteBuilder”类用于定义路由规则,它提供了一系列方法,可以根据不同的URL模板、HTTP方法、请求参数等条件定义路由规则。
“RouteCollection”类用于存储所有的路由规则,它提供了一系列方法,可以根据请求的URL和HTTP方法查找对应的Controller和Action。
中间件
在中,中间件是一种处理HTTP请求和响应的机制。的中间件系统是由框架提供的,它可以将HTTP请求和响应传递给多个中间件,每个中间件都可以对请求和响应进行处理。
在源码中,中间件系统的核心代码位于“”命名空间中。其中,最重要的类是“applicationBuilder”。
“ApplicationBuilder”类用于定义中间件管道,它提供了一系列方法,可以将多个中间件按照顺序添加到管道中,并将HTTP请求和响应传递给这些中间件进行处理。
依赖注入
在中,依赖注入是一种将类之间的依赖关系从代码中分离出来的机制。的依赖注入系统是由框架提供的,它可以自动将依赖关系注入到类中,从而简化代码的编写和维护。
在源码中,依赖注入系统的核心代码位于“”命名空间中。其中,最重要的类是“ServiceCollection”和“ServiceProvider”。
“ServiceCollection”类用于定义依赖关系,它提供了一系列方法,可以将类和其对应的接口注册到依赖注入容器中。
“ServiceProvider”类用于获取依赖关系,它提供了一系列方法,可以根据类的接口获取其对应的实例。
通常在应用程序中,安全分为前后两个步骤:验证和授权。 验证负责检查当前请求者的身份,而授权则根据上一步得到的身份决定当前请求者是否能够访问期望的资源。 既然安全从验证开始,我们也就从验证开始介绍安全。 我们先从比较简单的场景开始考虑,例如在 Web API 开发中,需要验证请求方是否提供了安全令牌,安全令牌是否有效。 如果无效,那么 API 端应该拒绝提供服务。 在命名空间 下,定义关于验证的核心接口。 对应的程序集是 。 在 下,验证中包含 3 个基本操作: 验证操作负责基于当前请求的上下文,使用来自请求中的信息,例如请求头、Cookie 等等来构造用户标识。 构建的结果是一个 AuthenticateResult 对象,它指示了验证是否成功,如果成功的话,用户标识将可以在验证票据中找到。 常见的验证包括: 在授权管理阶段,如果用户没有得到验证,但所期望访问的资源要求必须得到验证的时候,授权服务会发出质询。 例如,当匿名用户访问受限资源的时候,或者当用户点击登录链接的时候。 授权服务会通过质询来相应用户。 例如 质询操作应该让用户知道应该使用何种验证机制来访问请求的资源。 在授权管理阶段,如果用户已经通过了验证,但是对于其访问的资源并没有得到许可,此时会使用拒绝操作。 例如: 拒绝访问处理应该让用户知道: 在这个场景下,可以看到,验证需要提供的基本功能就包括了验证和验证失败后的拒绝服务两个操作。 在 Core 中,验证被称为 Authenticate,拒绝被称为 Forbid。 在供消费者访问的网站上,如果我们希望在验证失败后,不是像 API 一样直接返回一个错误页面,而是将用户导航到登录页面,那么,就还需要增加一个操作,这个操作的本质是希望用户再次提供安全凭据,在 Core 中,这个操作被称为 Challenge。 这 3 个操作结合在一起,就是验证最基本的要求,以接口形式表示,就是 IAuthenticationHandler 接口,如下所示: 验证的结果是一个 AuthenticateResult 对象。 值得注意的是,它还提供了一个静态方法 NoResult() 用来返回没有得到结果,静态方法 Fail() 生成一个表示验证异常的结果,而 Success() 成功则需要提供验证票据。 通过验证之后,会返回一个包含了请求者票据的验证结果。 在 GitHub 中查看 AuthenticateResult 源码 那么验证的信息来自哪里呢?除了前面介绍的 3 个操作之外,还要求一个初始化的操作 Initialize,通过这个方法来提供当前请求的上下文信息。 在 GitHub 中查看 IAuthenticationHandler 定义 有的时候,我们还希望提供登出操作,增加登出操作的接口被称为 IAuthenticationSignOutHandler。 在 GitHub 中查看 IAuthenticationSignOutHandler 源码 在登出的基础上,如果还希望提供登录操作,那么就是 IAuthenticationSignInHandler 接口。 在 GitHub 中查看 IAuthenticationSignInHandler 源码 直接实现接口还是比较麻烦的,在命名空间 下,微软提供了抽象基类 AuthenticationHandler 以方便验证控制器的开发,其它控制器可以从该控制器派生,以取得其提供的服务。 通过类的定义可以看到,它使用了泛型。 每个控制器应该有一个对应该控制器的配置选项,通过泛型来指定验证处理器所使用的配置类型,在构造函数中,可以看到它被用于获取对应的配置选项对象。 在 GitHub 中查看 AuthenticationHandler 源码 通过 InitializeAsync(),验证处理器可以获得当前请求的上下文对象 HttpContext。 最终,作为抽象类的 ,希望派生类来完成这个验证任务,抽象方法 HandleAuthenticateAsync() 提供了扩展点。 验证的结果是一个 AuthenticateResult。 而拒绝服务则简单的多,直接在这个抽象基类中提供了默认实现。 直接返回 HTTP 403。 剩下的一个也一样,提供了默认实现。 直接返回 HTTP 401 响应。 对于 JWT 来说,并不涉及到登入和登出,所以它需要从实现 IAuthenticationHandler 接口的抽象基类 AuthenticationHandler 派生出来即可。 从 AuthenticationHandler 派生出来的 JwtBearerHandler 实现基于自己的配置选项 JwtBearerOptions。 所以该类定义就变得如下所示,而构造函数显然配合了抽象基类的要求。 在 GitHub 中查看 JwtBearerHandler 源码 真正的验证则在 HandleAuthenticateAsync() 中实现。 下面的代码是不是就很熟悉了,从请求头中获取附带的 JWT 访问令牌,然后验证该令牌的有效性,核心代码如下所示。 在 GitHub 中查看 JwtBearerHandler 源码 在 Core 中,你可以使用各种验证处理器,并不仅仅只能使用一个,验证控制器需要一个名称,它被看作该验证模式 Schema 的名称。 Jwt 验证模式的默认名称就是 Bearer,通过字符串常量 定义。 在 GitHub 中查看 JwtBearerDefaults 源码 最终通过 AuthenticationBuilder 的扩展方法 AddJwtBearer() 将 Jwt 验证控制器注册到依赖注入的容器中。 在 GitHub 中查看 JwtBearerExtensions 扩展方法源码 一种验证处理器,加上对应的验证配置选项,我们再为它起一个名字,组合起来就成为一种验证架构 Schema。 在 Core 中,可以注册多种验证架构。 例如,授权策略可以使用架构的名称来指定所使用的验证架构来使用特定的验证方式。 在配置验证的时候,通常设置默认的验证架构。 当没有指定验证架构的时候,就会使用默认架构进行处理。 还可以 注册的验证模式,最终变成 AuthenticationScheme,注册到依赖注入服务中。 在 GitHub 中查看 AuthenticationScheme 源码 各种验证架构被保存到一个 IAuthenticationSchemeProvider 中。 在 GitHub 中查看 IAuthenticationSchemeProvider 源码 最终的使用是通过 IAuthenticationHandlerProvider 来实现的,通过一个验证模式的字符串名称,可以取得所对应的验证控制器。 在 GitHub 中查看 IAuthenticationHandlerProvider 源码 它的默认实现是 AuthenticationHandlerProvider,源码并不复杂。 在 GitHub 中查看 AuthenticationHandlerProvider 源码 验证中间件的处理就没有那么复杂了。 找到默认的验证模式,使用默认验证模式的名称取得对应的验证处理器,如果验证成功的话,把当前请求用户的主体放到当前请求上下文的 User 上。 里面还有一段特别的代码,用来找出哪些验证处理器实现了 IAuthenticationHandlerProvider,并依次调用它们,看看是否需要提取终止请求处理过程。 在 GitHub 中查看 AuthenticationMiddle 源码
跟踪页面执行
设置断点是页面调试过程中的常用手段 除此之外 还可以通过查看页面的跟踪信息进行错误排查以及性能优化 ASP NET中启用页面跟踪非常方便 只需在Page指令中加入Trace= True 属性即可
<%@ Page Language= C# Trace= true >跟踪信息可以分为两类
a 页面执行详细情况
其中主要包括页面生命周期中各事件列表 控件树列表(可以查看每个控件的HTML字节数以及ViewState字节数) Session状态 Application状态 Cookie集合 QueryString集合 服务器变量等信息
b 自定义跟踪信息
通过在页面代码中调用Trace Write()或Trace Warn()方法便可将指定内容写入跟踪信息中的 Trace Information 节 就算页面发生了错误 跟踪信息还是会显示出来 并且在发布应用程序时无需删除相关的跟踪代码 只需从Page指令中移除Trace属性即可
在服务器端控件中添加客户端属性
我们有时会向服务器端控件中添加一些特殊的属性 这类属性不需要服务器端的处理 只需简单的发送至客户端即可 我们不妨称其为客户端属性 例如HTML属性或自定义属性(可能用于实现某种特定的JavaScript功能) 可以通过以下几种方法达到这个目的
a 直接向控件添加客户端属性
其中的onmouseover是客户端属性 注意 编译器是允许这种写法的 但会显示警告
b 调用内置方法
可以通过调用WebControl Attributes Add()方法为控件添加客户端属性 如下所示
MyButton Attributes Add( onmouseover this style cursor= pointer );这也是最常用的方法
c 创建自定义控件
如果某个类型的服务器端控件中经常需要添加客户端属性 则可以考虑创建一个继承自该服务器端控件的自定义控件 其中包含特定的客户端属性
正是考虑到这一点 ASP NET 中为按钮控件(包括Button LinkButton ImageButton控件)提供了OnClientClick属性 可以这样写
MyButton OnClientClick = alert( Hello! ) ;真是贴心的功能!
表单数据的服务器端验证
将数据验证任务从服务器端迁移到客户端的过程促使了JavaScript的产生 这也是我们沿用至今的一种方式 但只有在保证客户端JavaScript正常运行的前提下 这种方式才能发挥其作用 不幸的是 总有一些例外 比如浏览器不支持JavaScript 或者用户刻意关闭了浏览器的JavaScript功能 这就导致了第一重防护失效 比较保险的做法是加入第二重防护 即对用户提交的数据进行服务器端验证 但这无疑将增加开发者的工作量
ASP NET 提供了一系列表单数据验证控件 可以非常轻松的完成客户端及服务器端的双重数据验证任务 但要使服务器端验证功能发挥作用 还需要用到Page IsValid属性 请看下面的例子
姓名 ator ID= RequiredFieldValidator ControlToValidate= txtName ErrorMessage= 请填写姓名! DISPlay= Dynamic runat= server >
这是一个HTML片段 其中有一个RequiredFieldValidator控件用于检查是否已填写姓名 下面是点击按钮时执行的服务器端代码:
protected void btnSubmit_Click(object sender EventArgs e){if (Page IsValid) //注意 不要遗漏对Page IsValid属性的判断{Response Write( 你的名字是 + txtName Text);}}
其中 要特别注意对Page IsValid属性的判断 只有页面中所有验证控件对数据的验证都成功时 Page IsValid属性才为True 这代表提交的数据为有效数据 可以进入下一步操作
跳过表单验证
在某些情况下 我们需要跳过表单中所有控件的验证 然而在另外一些情况下 我们却希望有选择的触发表单中某些控件的验证功能 分别来看看这两种情况
a 跳过所有验证
假设有个表单 其中除了各种数据录入控件外还有两个按钮 一个是提交按钮 另一个是取消按钮 同时表单中还有一些数据验证控件 我们希望当点击取消按钮的时候无需验证表单中数据的有效性 而是直接将页面提交至服务器并将其重定向到某个指定页面
要实现这个功能 可以利用按钮控件(包括Button LinkButton ImageButton控件)的CausesValidation属性 将该属性设为false即可跳过表单中的所有验证
b 触发某些验证
假设有个表单 被划分成两个功能区 一个用于用户登录 另一个用于用户注册 我们希望当点击登录按钮时只触发登录区的数据验证 当点击注册按钮时只触发注册区的数据验证
解决办法是将相关的数据验证控件和数据提交控件(按钮控件)加入同一个验证组 这一点是通过将各相关控件的ValidationGroup属性设为相同的值来实现的
保持滚动条位置
假设有个页面 其中以列表形式显示了一些数据记录 每次编辑其中的记录时都需要向服务器提交页面 为了提供良好的用户体验 我们希望每次编辑一条记录并保存后 滚动条位置都能保持不变 传统的做法是每次提交页面时将当前滚动条所在位置信息按某种方式(Hidden字段或QueryString)传给服务器端 当页面返回客户端时 由服务器端根据传入的位置信息以JavaScript形式重新设置滚动条位置
如果通过ASP NET来实现这一功能将变得非常简单 只需在Page指令中加入MaintainScrollPositionOnPostback= true 属性即可
<%@ Page Language= C# MaintainScrollPositionOnPostback= true >禁用不必要的ViewState
在ASP NET的运行机制中 ViewState起着重要的作用 ViewState经过编码后存入表单Hidden字段 每当页面回传至服务器时再进行解码 因此 ViewState的使用会带来两个问题 带宽的占用以及计算资源的消耗 好在不是所有控件都需要启用ViewState 我们完全可以禁用不必要的ViewState
ViewState默认是开启的 需要手动关闭
a 禁用页面ViewState
在Page指令中加入EnableViewState= false 属性即可
<%@ Page Language= C# EnableViewState= false >加入这个属性后 整个页面以及其中的所有控件都将无法使用ViewState 因此需谨慎使用
b 禁用控件ViewState
这是推荐的方式 将控件的EnableViewState属性设为False即可禁用其ViewState 这里有个简单的窍门
如果某个控件的状态不能由操作者改变 则可以禁用其ViewState 最典型的莫过于Label控件了 只能显示信息 无法操作
lishixinzhi/Article/program/net//内容声明:
1、本站收录的内容来源于大数据收集,版权归原网站所有!
2、本站收录的内容若侵害到您的利益,请联系我们进行删除处理!
3、本站不接受违法信息,如您发现违法内容,请联系我们进行举报处理!
4、本文地址:https://www.ed4.cn/article/5f8f3ae20d1369962dd2.html,复制请保留版权链接!
到期域名发掘,掌握过期域名的强大潜力什么是到期域名,到期域名是指未及时续费而即将被删除的域名,这些域名通常具有较高的价值,因为它们可以用于各种目的,包括,建立高权威网站进行反向链接构建执行域名重定向出售牟利如何发掘到期域名,有几种方法可以发掘到期域名,使用域名过期监控工具,如ExpiredDomains.net和DomCop,搜索有关...。
互联网资讯 2024-05-22 09:18:47
根据您的需求选择透明、匿名或高度匿名代理,透明代理透明代理不会隐藏您的真实IP地址,但会将您的Web流量通过其服务器进行路由,这意味着网站将能够看到您的真实IP地址,但无法看到您访问的具体网站,透明代理的优点包括,速度快易于设置免费或低成本透明代理的缺点包括,无法隐藏您的真实IP地址无法绕过地理限制无法保护您的隐私匿名代理匿名代理会隐...。
互联网资讯 2024-05-20 17:37:01
在中国,网站备案是一个非常重要的法定程序,所有在中国境内运营的网站都必须完成备案手续,否则将被关闭,网站备案过程中还存在许多常见问题,下面将详细分析这些问题,并提供解决办法,一、备案主体问题,1.企业备案和个人备案的区别,企业备案需要提供营业执照副本、组织机构代码证、法定代表人身份证等材料,而个人备案则需要提供个人身份证、联系方式等材...。
互联网资讯 2024-04-30 10:11:38
Apache虚拟主机设置技巧,优化网站性能,提升用户体验Apache是一个免费开放源代码的Web服务器软件,被广泛应用于服务器端的网站部署中,通过Apache,网站管理员可以轻松地搭建并管理网站,提供各种功能和服务,使用户能够访问网站并获得所需信息,在网站运行过程中,为了更好地提升用户体验,优化网站性能是至关重要的,虚拟主机是一种在一...。
互联网资讯 2024-04-15 11:49:19
服务器在网站运行中发挥着至关重要的角色,它可以被视为网站的,大脑,和,中枢,,负责处理用户发起的请求、存储网站数据、传输信息等操作,一个优秀的服务器不仅可以提供稳定的性能和快速的响应速度,还能保障网站的安全性和稳定性,服务器的作用是处理用户发送的请求,当用户在浏览器中输入网址或点击链接访问网站时,浏览器会向服务器发送请求,请求获取网站...。
互联网资讯 2024-04-10 10:19:36
网上备案是指在新媒体时代,对于网站、App、微信公众号等互联网信息服务提供者,需要按照国家规定进行备案登记,以确保其合法合规运营,同时,网络舆论引导则是指通过一系列措施和手段,引导和调控网络上的舆论和信息传播方向,维护社会稳定和国家利益,如何进行网上备案,以及如何进行网络舆论引导,是当前互联网环境下的重要议题,本文将就这两个方面进行详...。
互联网资讯 2024-04-04 11:28:17
国内代理服务器IP,如何选择最适合您的服务,在当今数字化时代,网络安全和隐私保护变得愈发重要,使用代理服务器可以帮助您匿名浏览互联网,保护个人信息免受恶意攻击,在国内,选择适合自己需求的代理服务器IP至关重要,了解不同类型的代理服务器IP是选择的关键,国内代理服务器IP主要包括HTTP代理、SOCKS代理和HTTPS代理,HTTP代理...。
互联网资讯 2024-03-19 09:00:40
如何在中国使用国外网站代理,如何在中国使用facebook,在中国使用国外网站代理,比如使用Facebook,是一项需要小心操作的任务,由于中国政府实施了严格的网络审查制度,访问国外网站成为一项挑战,通过使用VPN,虚拟专用网络,等代理工具,中国用户可以绕过防火墙,访问被封锁的国外网站,以下将详细介绍如何在中国使用国外网站代理,特别是...。
互联网资讯 2024-03-11 11:28:27
美国高防gia,探索美国高防空间的神秘之旅,美国高防GIA,探索美国高防空间的神秘之旅,美国高防GIA是一次引人入胜的探险之旅,将带领参与者探索美国最神秘和高度保密的空间,这次探索之旅为那些对未知有浓厚兴趣,愿意深入探寻未曾揭示于外界的秘密的冒险者们而设计,在文章中,我们将深入分析美国高防GIA这一活动,探讨其背后的神秘之处以及其对参...。
互联网资讯 2024-02-18 11:05:23
合租服务器会承担法律连带责任吗,合租服务器,灵活扩展,满足多种需求,合租服务器是指多个用户共同使用同一台服务器的一种服务形式,由于其灵活扩展和满足多种需求的特点,越来越多的企业和个人选择合租服务器作为他们的网站托管解决方案,一些用户可能会担心使用合租服务器是否会承担法律连带责任,从法律角度来看,合租服务器的法律责任主要取决于两个方面,...。
互联网资讯 2024-01-26 20:39:45
美国加州vista,美国加州VPS,专为中文编辑定制的高效工具,美国加州vista是一种专为中文编辑所定制的高效工具,它提供了一系列功能和服务,旨在优化编辑工作流程,提高工作效率,美国加州vista提供了一个用户友好的界面,使得中文编辑人员可以轻松地找到并使用各种编辑功能,通过简洁直观的设计,用户可以快速上手,节省了繁琐的操作步骤,使...。
互联网资讯 2024-01-11 01:39:59