Ⅰ .netcorewpf可以反编译
netcorewpf可以反编译。wpf、winform等框架生成的执行文件是可以被ILSPY等软件反编译的,只要将exe文件拖到ILSPY,源码就会被可以反编译。
Ⅱ asp.net婧愮爜锛堟繁鍏ユ帰绌跺叾鍐呴儴链哄埗锛
ASP.NET鏄寰杞鍏鍙告帹鍑虹殑涓娆网eb搴旂敤绋嫔簭寮鍙戞嗘灦锛屽畠𨰾ユ湁涓板瘜镄勫姛鑳藉拰寮哄ぇ镄勬墿灞曟э纴鍙浠ュ府锷╁紑鍙戣呭揩阃熸瀯寤洪珮鏁堢殑Web搴旂敤绋嫔簭銆傝孉SP.NET镄勬簮镰佸垯鏄鍏跺唴閮ㄦ満鍒剁殑镙稿绩锛岄氲繃娣卞叆鎺㈢┒ASP.NET婧愮爜锛屾垜浠鍙浠ユ洿濂藉湴浜呜ВASP.NET镄勫伐浣滃师鐞嗗拰瀹炵幇鏂瑰纺锛屼粠钥屾洿濂藉湴搴旂敤ASP.NET杩涜学eb寮鍙戙
銮峰彇ASP.NET婧愮爜
棣栧厛锛屾垜浠闇瑕佽幏鍙朅SP.NET镄勬簮镰併侫SP.NET镄勬簮镰佹槸寮婧愮殑锛屽彲浠ラ氲繃GitHub銮峰彇銆傚叿浣撴搷浣沧ラゅ备笅锛
1.镓揿紑GitHub缃戠珯锛屾悳绱⑩渁spnet钬濓纴杩涘叆aspnet浠揿簱椤甸溃銆
2.鍦ㄤ粨搴挞〉闱涓锛岀偣鍑烩淐loneordownload钬濇寜阍锛岄夋嫨钬淒ownloadZIP钬濋夐”锛屼笅杞絘spnet婧愮爜铡嬬缉鍖呫
3.瑙e帇涓嬭浇镄勫帇缂╁寘锛屽嵆鍙銮峰彇aspnet婧愮爜銆
ASP.NET婧愮爜缁撴瀯
ASP.NET婧愮爜鏄涓涓宸ㄥぇ镄勪唬镰佸簱锛屽寘钖浜呜稿氩瓙椤圭洰鍜屾ā鍧椼傚叾涓锛屾渶镙稿绩镄勫瓙椤圭洰鏄钬渁spnetcore钬濆拰钬渁spnetwebstack钬濄
钬渁spnetcore钬濇槸ASP.NETCore镄勬簮镰侊纴瀹冩槸ASP.NET镄勬渶鏂扮増链锛屽叿链夋洿楂樼殑镐ц兘鍜屾洿濂界殑璺ㄥ钩鍙版敮鎸併
钬渁spnetwebstack钬濇槸ASP.NETWebAPI镄勬簮镰侊纴瀹冩槸ASP.NET镄刉ebAPI妗嗘灦锛岀敤浜庢瀯寤篟ESTfulWeb链嶅姟銆
姝ゅ栵纴ASP.NET婧愮爜杩桦寘钖浜呜稿氩叾浠栫殑瀛愰”鐩鍜屾ā鍧楋纴濡傗淓ntityFramework钬濄佲沦ignalR钬濄佲泪dentity钬濈瓑锛岃繖浜涘瓙椤圭洰鍜屾ā鍧楅兘鏄疉SP.NET镄勯吨瑕佺粍鎴愰儴鍒嗐
ASP.NET婧愮爜瑙f瀽
鍦ㄦ繁鍏ユ帰绌禔SP.NET婧愮爜涔嫔墠锛屾垜浠闇瑕佸厛浜呜ВASP.NET镄勫伐浣滃师鐞嗗拰锘烘湰姒傚康銆
ASP.NET鏄涓涓锘轰簬MVC锛圡odel-View-Controller锛夋ā寮忕殑Web搴旂敤绋嫔簭妗嗘灦锛屽畠镄勫伐浣滃师鐞嗗彲浠ョ亩鍗曞湴鎻忚堪涓猴细
1.瀹㈡埛绔钖戞湇锷″櫒鍙戦佽锋眰銆
2.链嶅姟鍣ㄦ帴鏀惰锋眰锛屾牴鎹璇锋眰镄刄RL鍜孒TTP鏂规硶阃夋嫨瀵瑰簲镄凛ontroller銆
3.Controller鎺ユ敹璇锋眰锛屾牴鎹璇锋眰镄勫弬鏁板拰涓氩姟阃昏緫鐢熸垚Model銆
4.Controller灏哅odel浼犻掔粰View銆
5.View灏哅odel娓叉煋鎴怘TML椤甸溃锛屽苟杩斿洖缁椤㈡埛绔銆
鍦ˋSP.NET涓锛孋ontroller鍜孷iew閮芥槸鐢卞紑鍙戣呯紪鍐欑殑浠g爜锛岃孧odel鍒椤彲浠ユ槸浠庢暟鎹搴撱佹枃浠剁郴缁熴佺紦瀛樼瓑鏁版嵁婧愪腑銮峰彇镄勬暟鎹銆
ASP.NET婧愮爜鍒嗘瀽
浜呜В浜咥SP.NET镄勫伐浣滃师鐞嗗拰锘烘湰姒傚康涔嫔悗锛屾垜浠鍙浠ュ紑濮嬫繁鍏ユ帰绌禔SP.NET婧愮爜浜嗐
ASP.NET婧愮爜鏄涓涓闱炲父搴炲ぇ镄勪唬镰佸簱锛屾兜鐩栦简璁稿氢笉钖岀殑妯″潡鍜屽姛鑳姐傚湪杩欓噷锛屾垜浠鍙鑳藉瑰叾涓镄勪竴閮ㄥ垎杩涜岀亩鍗旷殑浠嬬粛銆
璺鐢
鍦ˋSP.NET涓锛岃矾鐢辨槸灏呜锋眰镄刄RL鏄犲皠鍒板瑰簲镄凛ontroller鍜孉ction镄勮繃绋嬨侫SP.NET镄勮矾鐢辩郴缁熸槸鐢盇SP.NETMVC妗嗘灦鎻愪緵镄勶纴瀹冨彲浠ユ牴鎹璇锋眰镄刄RL鍜孒TTP鏂规硶阃夋嫨瀵瑰簲镄凛ontroller鍜孉ction銆
鍦ˋSP.NET婧愮爜涓锛岃矾鐢辩郴缁熺殑镙稿绩浠g爜浣崭簬钬淢icrosoft.AspNetCore.Routing钬濆懡钖岖┖闂翠腑銆傚叾涓锛屾渶閲嶈佺殑绫绘槸钬淩outeBuilder钬濆拰钬淩outeCollection钬濄
钬淩outeBuilder钬濈被鐢ㄤ簬瀹氢箟璺鐢辫勫垯锛屽畠鎻愪緵浜嗕竴绯诲垪鏂规硶锛屽彲浠ユ牴鎹涓嶅悓镄刄RL妯℃澘銆丠TTP鏂规硶銆佽锋眰鍙傛暟绛夋浔浠跺畾涔夎矾鐢辫勫垯銆
钬淩outeCollection钬濈被鐢ㄤ簬瀛桦偍镓链夌殑璺鐢辫勫垯锛屽畠鎻愪緵浜嗕竴绯诲垪鏂规硶锛屽彲浠ユ牴鎹璇锋眰镄刄RL鍜孒TTP鏂规硶镆ユ垒瀵瑰簲镄凛ontroller鍜孉ction銆
涓闂翠欢
鍦ˋSP.NET涓锛屼腑闂翠欢鏄涓绉嶅勭悊HTTP璇锋眰鍜屽搷搴旂殑链哄埗銆侫SP.NET镄勪腑闂翠欢绯荤粺鏄鐢盇SP.NETCore妗嗘灦鎻愪緵镄勶纴瀹冨彲浠ュ皢HTTP璇锋眰鍜屽搷搴斾紶阃掔粰澶氢釜涓闂翠欢锛屾疮涓涓闂翠欢閮藉彲浠ュ硅锋眰鍜屽搷搴旇繘琛屽勭悊銆
鍦ˋSP.NET婧愮爜涓锛屼腑闂翠欢绯荤粺镄勬牳蹇冧唬镰佷綅浜庘淢icrosoft.AspNetCore.Builder钬濆懡钖岖┖闂翠腑銆傚叾涓锛屾渶閲嶈佺殑绫绘槸钬淎pplicationBuilder钬濄
钬淎pplicationBuilder钬濈被鐢ㄤ簬瀹氢箟涓闂翠欢绠¢亾锛屽畠鎻愪緵浜嗕竴绯诲垪鏂规硶锛屽彲浠ュ皢澶氢釜涓闂翠欢鎸夌収椤哄簭娣诲姞鍒扮¢亾涓锛屽苟灏咹TTP璇锋眰鍜屽搷搴斾紶阃掔粰杩欎簺涓闂翠欢杩涜屽勭悊銆
渚濊禆娉ㄥ叆
鍦ˋSP.NET涓锛屼緷璧栨敞鍏ユ槸涓绉嶅皢绫讳箣闂寸殑渚濊禆鍏崇郴浠庝唬镰佷腑鍒嗙诲嚭𨱒ョ殑链哄埗銆侫SP.NET镄勪緷璧栨敞鍏ョ郴缁熸槸鐢盇SP.NETCore妗嗘灦鎻愪緵镄勶纴瀹冨彲浠ヨ嚜锷ㄥ皢渚濊禆鍏崇郴娉ㄥ叆鍒扮被涓锛屼粠钥岀亩鍖栦唬镰佺殑缂栧啓鍜岀淮鎶ゃ
鍦ˋSP.NET婧愮爜涓锛屼緷璧栨敞鍏ョ郴缁熺殑镙稿绩浠g爜浣崭簬钬淢icrosoft.Extensions.DependencyInjection钬濆懡钖岖┖闂翠腑銆傚叾涓锛屾渶閲嶈佺殑绫绘槸钬沦erviceCollection钬濆拰钬沦erviceProvider钬濄
钬沦erviceCollection钬濈被鐢ㄤ簬瀹氢箟渚濊禆鍏崇郴锛屽畠鎻愪緵浜嗕竴绯诲垪鏂规硶锛屽彲浠ュ皢绫诲拰鍏跺瑰簲镄勬帴鍙f敞鍐屽埌渚濊禆娉ㄥ叆瀹瑰櫒涓銆
钬沦erviceProvider钬濈被鐢ㄤ簬銮峰彇渚濊禆鍏崇郴锛屽畠鎻愪緵浜嗕竴绯诲垪鏂规硶锛屽彲浠ユ牴鎹绫荤殑鎺ュ彛銮峰彇鍏跺瑰簲镄勫疄渚嬨
Ⅲ ASP.NET Core认证原理和实现
通常在应用程序中,安全分为前后两个步骤:验证和授权。验证负责检查当前请求者的身份,而授权则根据上一步得到的身份决定当前请求者是否能够访问期望的资源。
既然安全从验证开始,我们也就从验证开始介绍安全。
我们先从比较简单的场景开始考虑,例如在 Web API 开发中,需要验证请求方是否提供了安全令牌,安全令牌是否有效。如果无效,那么 API 端应该拒绝提供服务。在命名空间 Microsoft.AspNetCore.Authentication 下,定义关于验证的核心接口。对应的程序集是 Microsoft.AspNetCore.Authentication.Abstractions.dll。
在 ASP.NET 下,验证中包含 3 个基本操作:
验证操作负责基于当前请求的上下文,使用来自请求中的信息,例如请求头、Cookie 等等来构造用户标识。构建的结果是一个 AuthenticateResult 对象,它指示了验证是否成功,如果成功的话,用户标识将可以在验证票据中找到。
常见的验证包括:
在授权管理阶段,如果用户没有得到验证,但所期望访问的资源要求必须得到验证的时候,授权服务会发出质询。例如,当匿名用户访问受限资源的时候,或者当用户点击登录链接的时候。授权服务会通过质询来相应用户。
例如
质询操作应该让用户知道应该使用何种验证机制来访问请求的资源。
在授权管理阶段,如果用户已经通过了验证,但是对于其访问的资源并没有得到许可,此时会使用拒绝操作。
例如:
拒绝访问处理应该让用户知道:
在这个场景下,可以看到,验证需要提供的基本功能就包括了验证和验证失败后的拒绝服务两个操作。在 ASP.NET Core 中,验证被称为 Authenticate,拒绝被称为 Forbid。 在供消费者访问的网站上,如果我们希望在验证失败后,不是像 API 一样直接返回一个错误页面,而是将用户导航到登录页面,那么,就还需要增加一个操作,这个操作的本质是希望用户再次提供安全凭据,在 ASP.NET Core 中,这个操作被称为 Challenge。这 3 个操作结合在一起,就是验证最基本的要求,以接口形式表示,就是 IAuthenticationHandler 接口,如下所示:
验证的结果是一个 AuthenticateResult 对象。值得注意的是,它还提供了一个静态方法 NoResult() 用来返回没有得到结果,静态方法 Fail() 生成一个表示验证异常的结果,而 Success() 成功则需要提供验证票据。
通过验证之后,会返回一个包含了请求者票据的验证结果。
在 GitHub 中查看 AuthenticateResult 源码
那么验证的信息来自哪里呢?除了前面介绍的 3 个操作之外,还要求一个初始化的操作 Initialize,通过这个方法来提供当前请求的上下文信息。
在 GitHub 中查看 IAuthenticationHandler 定义
有的时候,我们还希望提供登出操作,增加登出操作的接口被称为 IAuthenticationSignOutHandler。
在 GitHub 中查看 IAuthenticationSignOutHandler 源码
在登出的基础上,如果还希望提供登录操作,那么就是 IAuthenticationSignInHandler 接口。
在 GitHub 中查看 IAuthenticationSignInHandler 源码
直接实现接口还是比较麻烦的,在命名空间 Microsoft.AspNetCore.Authentication 下,微软提供了抽象基类 AuthenticationHandler 以方便验证控制器的开发,其它控制器可以从该控制器派生,以取得其提供的服务。
通过类的定义可以看到,它使用了泛型。每个控制器应该有一个对应该控制器的配置选项,通过泛型来指定验证处理器所使用的配置类型,在构造函数中,可以看到它被用于获取对应的配置选项对象。
在 GitHub 中查看 AuthenticationHandler 源码
通过 InitializeAsync(),验证处理器可以获得当前请求的上下文对象 HttpContext。
最终,作为抽象类的 ,希望派生类来完成这个验证任务,抽象方法 HandleAuthenticateAsync() 提供了扩展点。
验证的结果是一个 AuthenticateResult。
而拒绝服务则简单的多,直接在这个抽象基类中提供了默认实现。直接返回 HTTP 403。
剩下的一个也一样,提供了默认实现。直接返回 HTTP 401 响应。
对于 JWT 来说,并不涉及到登入和登出,所以它需要从实现 IAuthenticationHandler 接口的抽象基类 AuthenticationHandler 派生出来即可。从 AuthenticationHandler 派生出来的 JwtBearerHandler 实现基于自己的配置选项 JwtBearerOptions。所以该类定义就变得如下所示,而构造函数显然配合了抽象基类的要求。
在 GitHub 中查看 JwtBearerHandler 源码
真正的验证则在 HandleAuthenticateAsync() 中实现。下面的代码是不是就很熟悉了,从请求头中获取附带的 JWT 访问令牌,然后验证该令牌的有效性,核心代码如下所示。
在 GitHub 中查看 JwtBearerHandler 源码
在 ASP.NET Core 中,你可以使用各种验证处理器,并不仅仅只能使用一个,验证控制器需要一个名称,它被看作该验证模式 Schema 的名称。Jwt 验证模式的默认名称就是 "Bearer",通过字符串常量 JwtBearerDefaults.AuthenticationScheme 定义。
在 GitHub 中查看 JwtBearerDefaults 源码
最终通过 AuthenticationBuilder 的扩展方法 AddJwtBearer() 将 Jwt 验证控制器注册到依赖注入的容器中。
在 GitHub 中查看 JwtBearerExtensions 扩展方法源码
一种验证处理器,加上对应的验证配置选项,我们再为它起一个名字,组合起来就成为一种验证架构 Schema。在 ASP.NET Core 中,可以注册多种验证架构。例如,授权策略可以使用架构的名称来指定所使用的验证架构来使用特定的验证方式。在配置验证的时候,通常设置默认的验证架构。当没有指定验证架构的时候,就会使用默认架构进行处理。
还可以
注册的验证模式,最终变成 AuthenticationScheme,注册到依赖注入服务中。
在 GitHub 中查看 AuthenticationScheme 源码
各种验证架构被保存到一个 IAuthenticationSchemeProvider 中。
在 GitHub 中查看 IAuthenticationSchemeProvider 源码
最终的使用是通过 来实现的,通过一个验证模式的字符串名称,可以取得所对应的验证控制器。
在 GitHub 中查看 源码
它的默认实现是 AuthenticationHandlerProvider,源码并不复杂。
在 GitHub 中查看 AuthenticationHandlerProvider 源码
验证中间件的处理就没有那么复杂了。
找到默认的验证模式,使用默认验证模式的名称取得对应的验证处理器,如果验证成功的话,把当前请求用户的主体放到当前请求上下文的 User 上。
里面还有一段特别的代码,用来找出哪些验证处理器实现了 ,并依次调用它们,看看是否需要提取终止请求处理过程。
在 GitHub 中查看 AuthenticationMiddle 源码
Ⅳ 个人web开发asp.netcore和php7之间如何选择
看到上面两个对.net的评论忍不住来答一下
PHP不太清楚,但现在的ASP.NETCore已今非昔比。
首先是运行效率上,ASP.NETCore很快。因为.NETCore是编译运行的,执行速度远高于解释执行的PHP,尤没手其是在多线程/异步环境下。
上图是主流编程语言运行效率横评,可以看出,.NETCore很明显是属于第二梯队,性能仅次于C/C++这种直接编译成汇编的语言。而PHP则是
第五梯队,甚至还不如node.js
跨平台不用说了,都是三跨。
生态上,虽然.NETCore目前还比不上Java的生态,但nuget也不是吃素的。现成的轮子还是比较多的。至于PHP的生态,不太清楚,但应该不会差
很多Java开发者比较喜欢抨击.net开发者,以为.net只需要拖拖控件,写一写event就行了。其实不然,这种拖控件的开发方式(webform)早已淘汰。现在的ASP.NETCore早已现代化。
ASP.NETCore优点:
生成WebUI和WebAPI的统一场景。
针对可测试性进行构建。
RazorPages可以使基于页面的编码方式更简单高效。
能够在Windows、macOS和Linux上进行开发和运行。
开放源代码和以社区为中心。
集成新式客户端框架和开发枯伍嫌工作流。
基于环境的云就绪配置系统。
内置依赖项注入。
轻型的高性能模块化HTTP请求管道。
能够在IIS、Nginx、Apache、Docker上进行托管或在自己的进程中进行自托管。
基于.NETCore运行时,可以使用并行应用版本控制。
由于答主没用过PHP,就不对PHP做过多评价,但PHP在橘桐目前也是炙手可热的语言之一,也是很多大公司的选择,而且PHP最大的优势就在于开发效率和用人成本上。