游戏电视苹果数码历史美丽
投稿投诉
美丽时装
彩妆资讯
历史明星
乐活安卓
数码常识
驾车健康
苹果问答
网络发型
电视车载
室内电影
游戏科学
音乐整形

ASP。NETCore认证原理和实现

  通常在应用程序中,安全分为前后两个步骤:验证和授权。验证负责检查当前请求者的身份,而授权则根据上一步得到的身份决定当前请求者是否能够访问期望的资源。
  既然安全从验证开始,我们也就从验证开始介绍安全。验证的核心概念
  我们先从比较简单的场景开始考虑,例如在WebAPI开发中,需要验证请求方是否提供了安全令牌,安全令牌是否有效。如果无效,那么API端应该拒绝提供服务。在命名空间Microsoft。AspNetCore。Authentication下,定义关于验证的核心接口。对应的程序集是Microsoft。AspNetCore。Authentication。Abstractions。dll。验证接口IAuthenticationHandler
  在ASP。NET下,验证中包含3个基本操作:Authenticate验证
  验证操作负责基于当前请求的上下文,使用来自请求中的信息,例如请求头、Cookie等等来构造用户标识。构建的结果是一个AuthenticateResult对象,它指示了验证是否成功,如果成功的话,用户标识将可以在验证票据中找到。
  常见的验证包括:基于Cookie的验证,从请求的Cookie中验证用户基于JWTBearer的验证,从请求头中提取JWT令牌进行验证Challenge质询
  在授权管理阶段,如果用户没有得到验证,但所期望访问的资源要求必须得到验证的时候,授权服务会发出质询。例如,当匿名用户访问受限资源的时候,或者当用户点击登录链接的时候。授权服务会通过质询来相应用户。
  例如基于Cookie的验证会将用户重定向到登录页面基于JWT的验证会返回一个带有wwwauthenticate:bearer响应头的401响应来提醒客户端需要提供访问凭据
  质询操作应该让用户知道应该使用何种验证机制来访问请求的资源。Forbid拒绝
  在授权管理阶段,如果用户已经通过了验证,但是对于其访问的资源并没有得到许可,此时会使用拒绝操作。
  例如:Cookie验证模式下,已经登录但是没有访问权限的用户,被重定向到一个提示无权访问的页面JWT验证模式下,返回403在自定义验证模式下,将没有权限的用户重定向到申请资源的页面
  拒绝访问处理应该让用户知道:它已经通过了验证但是没有权限访问请求的资源
  在这个场景下,可以看到,验证需要提供的基本功能就包括了验证和验证失败后的拒绝服务两个操作。在ASP。NETCore中,验证被称为Authenticate,拒绝被称为Forbid。在供消费者访问的网站上,如果我们希望在验证失败后,不是像API一样直接返回一个错误页面,而是将用户导航到登录页面,那么,就还需要增加一个操作,这个操作的本质是希望用户再次提供安全凭据,在ASP。NETCore中,这个操作被称为Challenge。这3个操作结合在一起,就是验证最基本的要求,以接口形式表示,就是IAuthenticationHandler接口,如下所示:publicinterfaceIAuthenticationHandler{TaskInitializeAsync(AuthenticationSchemescheme,HttpContextcontext);TaskAuthenticateAsync();TaskChallengeAsync(AuthenticationProperties?properties);TaskForbidAsync(AuthenticationProperties?properties);}
  验证的结果是一个AuthenticateResult对象。值得注意的是,它还提供了一个静态方法NoResult()用来返回没有得到结果,静态方法Fail()生成一个表示验证异常的结果,而Success()成功则需要提供验证票据。
  通过验证之后,会返回一个包含了请求者票据的验证结果。namespaceMicrosoft。AspNetCore。Authentication{publicclassAuthenticateResult{。。。。。。publicstaticAuthenticateResultNoResult(){returnnewAuthenticateResult(){Nonetrue};}publicstaticAuthenticateResultFail(Exceptionfailure){returnnewAuthenticateResult(){Failurefailure};}publicstaticAuthenticateResultSuccess(AuthenticationTicketticket){if(ticketnull){thrownewArgumentNullException(nameof(ticket));}returnnewAuthenticateResult(){Ticketticket,Propertiesticket。Properties};}publicstaticAuthenticateResultSuccess(AuthenticationTicketticket){if(ticketnull){thrownewArgumentNullException(nameof(ticket));}returnnewAuthenticateResult(){Ticketticket,Propertiesticket。Properties};}。。。。。。}}
  在GitHub中查看AuthenticateResult源码
  那么验证的信息来自哪里呢?除了前面介绍的3个操作之外,还要求一个初始化的操作Initialize,通过这个方法来提供当前请求的上下文信息。
  在GitHub中查看IAuthenticationHandler定义支持登录和登出操作的验证接口
  有的时候,我们还希望提供登出操作,增加登出操作的接口被称为IAuthenticationSignOutHandler。publicinterfaceIAuthenticationSignOutHandler:IAuthenticationHandler{TaskSignOutAsync(AuthenticationProperties?properties);}
  在GitHub中查看IAuthenticationSignOutHandler源码
  在登出的基础上,如果还希望提供登录操作,那么就是IAuthenticationSignInHandler接口。publicinterfaceIAuthenticationSignInHandler:IAuthenticationSignOutHandler{TaskSignInAsync(ClaimsPrincipaluser,AuthenticationProperties?properties);}
  在GitHub中查看IAuthenticationSignInHandler源码实现验证支持的抽象基类AuthenticationHandler
  直接实现接口还是比较麻烦的,在命名空间Microsoft。AspNetCore。Authentication下,微软提供了抽象基类AuthenticationHandler以方便验证控制器的开发,其它控制器可以从该控制器派生,以取得其提供的服务。namespaceMicrosoft。AspNetCore。Authentication{publicabstractclassAuthenticationHandlerTOptions:IAuthenticationHandlerwhereTOptions:AuthenticationSchemeOptions,new(){protectedAuthenticationHandler(IOptionsMonitorTOptionsoptions,ILoggerFactorylogger,UrlEncoderencoder,ISystemClockclock){Loggerlogger。CreateLogger(this。GetType()。FullName);UrlEncoderencoder;Clockclock;OptionsMonitoroptions;}}。。。。。。}
  通过类的定义可以看到,它使用了泛型。每个控制器应该有一个对应该控制器的配置选项,通过泛型来指定验证处理器所使用的配置类型,在构造函数中,可以看到它被用于获取对应的配置选项对象。
  在GitHub中查看AuthenticationHandler源码
  通过InitializeAsync(),验证处理器可以获得当前请求的上下文对象HttpContext。publicasyncTaskInitializeAsync(AuthenticationSchemescheme,HttpContextcontext)
  最终,作为抽象类的,希望派生类来完成这个验证任务,抽象方法HandleAuthenticateAsync()提供了扩展点。summaryAllowsderivedtypestohandleauthentication。summaryreturnsTheseecrefAuthenticateResult。returnsprotectedabstractTaskHandleAuthenticateAsync();
  验证的结果是一个AuthenticateResult。
  而拒绝服务则简单的多,直接在这个抽象基类中提供了默认实现。直接返回HTTP403。protectedvirtualTaskHandleForbiddenAsync(AuthenticationPropertiesproperties){Response。StatusCode403;returnTask。CompletedTask;}
  剩下的一个也一样,提供了默认实现。直接返回HTTP401响应。protectedvirtualTaskHandleChallengeAsync(AuthenticationPropertiesproperties){Response。StatusCode401;returnTask。CompletedTask;}Jwt验证处理器是如何实现的?
  对于JWT来说,并不涉及到登入和登出,所以它需要从实现IAuthenticationHandler接口的抽象基类AuthenticationHandler派生出来即可。从AuthenticationHandler派生出来的JwtBearerHandler实现基于自己的配置选项JwtBearerOptions。所以该类定义就变得如下所示,而构造函数显然配合了抽象基类的要求。namespaceMicrosoft。AspNetCore。Authentication。JwtBearer{publicclassJwtBearerHandler:AuthenticationHandlerJwtBearerOptions{publicJwtBearerHandler(IOptionsMonitorJwtBearerOptionsoptions,ILoggerFactorylogger,UrlEncoderencoder,ISystemClockclock):base(options,logger,encoder,clock){}。。。。。。}}
  在GitHub中查看JwtBearerHandler源码
  真正的验证则在HandleAuthenticateAsync()中实现。下面的代码是不是就很熟悉了,从请求头中获取附带的JWT访问令牌,然后验证该令牌的有效性,核心代码如下所示。stringauthorizationRequest。Headers〔HeaderNames。Authorization〕;Ifnoauthorizationheaderfound,nothingtoprocessfurtherif(string。IsNullOrEmpty(authorization)){returnAuthenticateResult。NoResult();}if(authorization。StartsWith(Bearer,StringComparison。OrdinalIgnoreCase)){tokenauthorization。Substring(Bearer。Length)。Trim();}Ifnotokenfound,nofurtherworkpossibleif(string。IsNullOrEmpty(token)){returnAuthenticateResult。NoResult();}。。。。。。principalvalidator。ValidateToken(token,validationParameters,outvalidatedToken);
  在GitHub中查看JwtBearerHandler源码注册Jwt验证处理器
  在ASP。NETCore中,你可以使用各种验证处理器,并不仅仅只能使用一个,验证控制器需要一个名称,它被看作该验证模式Schema的名称。Jwt验证模式的默认名称就是Bearer,通过字符串常量JwtBearerDefaults。AuthenticationScheme定义。namespaceMicrosoft。AspNetCore。Authentication。JwtBearer{summaryDefaultvaluesusedbybearerauthentication。summarypublicstaticclassJwtBearerDefaults{summaryDefaultvalueforAuthenticationSchemepropertyintheJwtBearerAuthenticationOptionssummarypublicconststringAuthenticationSchemeBearer;}}
  在GitHub中查看JwtBearerDefaults源码
  最终通过AuthenticationBuilder的扩展方法AddJwtBearer()将Jwt验证控制器注册到依赖注入的容器中。publicstaticAuthenticationBuilderAddJwtBearer(thisAuthenticationBuilderbuilder)builder。AddJwtBearer(JwtBearerDefaults。AuthenticationScheme,{});publicstaticAuthenticationBuilderAddJwtBearer(thisAuthenticationBuilderbuilder,stringauthenticationScheme,stringdisplayName,ActionJwtBearerOptionsconfigureOptions){builder。Services。TryAddEnumerable(ServiceDescriptor。SingletonIPostConfigureOptionsJwtBearerOptions,JwtBearerPostConfigureOptions());returnbuilder。AddSchemeJwtBearerOptions,JwtBearerHandler(authenticationScheme,displayName,configureOptions);}
  在GitHub中查看JwtBearerExtensions扩展方法源码验证架构Schema
  一种验证处理器,加上对应的验证配置选项,我们再为它起一个名字,组合起来就成为一种验证架构Schema。在ASP。NETCore中,可以注册多种验证架构。例如,授权策略可以使用架构的名称来指定所使用的验证架构来使用特定的验证方式。在配置验证的时候,通常设置默认的验证架构。当没有指定验证架构的时候,就会使用默认架构进行处理。
  还可以对于authenticate,challenge,以及forbid操作使用不同的验证架构使用策略来组合多种验证架构
  注册的验证模式,最终变成AuthenticationScheme,注册到依赖注入服务中。publicclassAuthenticationScheme{publicstringName{get;}publicstring?DisplayName{get;}〔DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes。PublicConstructors)〕publicTypeHandlerType{get;}}
  在GitHub中查看AuthenticationScheme源码使用验证处理器IAuthenticationSchemeProvider
  各种验证架构被保存到一个IAuthenticationSchemeProvider中。publicinterfaceIAuthenticationSchemeProvider{TaskIEnumerableGetAllSchemesAsync();TaskGetSchemeAsync(stringname);voidAddScheme(AuthenticationSchemescheme);voidRemoveScheme(stringname);}
  在GitHub中查看IAuthenticationSchemeProvider源码IAuthenticationHandlerProvider
  最终的使用是通过IAuthenticationHandlerProvider来实现的,通过一个验证模式的字符串名称,可以取得所对应的验证控制器。publicinterfaceIAuthenticationHandlerProvider{TaskIAuthenticationHandler?GetHandlerAsync(HttpContextcontext,stringauthenticationScheme);}
  在GitHub中查看IAuthenticationHandlerProvider源码
  它的默认实现是AuthenticationHandlerProvider,源码并不复杂。publicclassAuthenticationHandlerProvider:IAuthenticationHandlerProvider{publicIAuthenticationSchemeProviderSchemes{get;}privatereadonlyDictionarystring,IAuthenticationHandlerhandlerMapnewDictionarystring,IAuthenticationHandler(StringComparer。Ordinal);publicAuthenticationHandlerProvider(IAuthenticationSchemeProviderschemes){Schemesschemes;}publicasyncTaskIAuthenticationHandler?GetHandlerAsync(HttpContextcontext,stringauthenticationScheme){if(handlerMap。TryGetValue(authenticationScheme,outvarvalue)){returnvalue;}varschemeawaitSchemes。GetSchemeAsync(authenticationScheme);if(schemenull){returnnull;}varhandler(context。RequestServices。GetService(scheme。HandlerType)??ActivatorUtilities。CreateInstance(context。RequestServices,scheme。HandlerType))asIAuthenticationHandler;if(handler!null){awaithandler。InitializeAsync(scheme,context);handlerMap〔authenticationScheme〕handler;}returnhandler;}}
  在GitHub中查看AuthenticationHandlerProvider源码Authentication中间件AuthenticationMiddleware
  验证中间件的处理就没有那么复杂了。
  找到默认的验证模式,使用默认验证模式的名称取得对应的验证处理器,如果验证成功的话,把当前请求用户的主体放到当前请求上下文的User上。
  里面还有一段特别的代码,用来找出哪些验证处理器实现了IAuthenticationHandlerProvider,并依次调用它们,看看是否需要提取终止请求处理过程。usingSystem;usingSystem。Threading。Tasks;usingMicrosoft。AspNetCore。Http;usingMicrosoft。Extensions。DependencyInjection;namespaceMicrosoft。AspNetCore。Authentication{publicclassAuthenticationMiddleware{privatereadonlyRequestDelegatenext;publicAuthenticationMiddleware(RequestDelegatenext,IAuthenticationSchemeProviderschemes){if(nextnull){thrownewArgumentNullException(nameof(next));}if(schemesnull){thrownewArgumentNullException(nameof(schemes));}nextnext;Schemesschemes;}publicIAuthenticationSchemeProviderSchemes{get;set;}publicasyncTaskInvoke(HttpContextcontext){context。Features。SetIAuthenticationFeature(newAuthenticationFeature{OriginalPathcontext。Request。Path,OriginalPathBasecontext。Request。PathBase});GiveanyIAuthenticationRequestHandlerschemesachancetohandletherequestvarhandlerscontext。RequestServices。GetRequiredServiceIAuthenticationHandlerProvider();foreach(varschemeinawaitSchemes。GetRequestHandlerSchemesAsync()){varhandlerawaithandlers。GetHandlerAsync(context,scheme。Name)asIAuthenticationRequestHandler;if(handler!nullawaithandler。HandleRequestAsync()){return;}}vardefaultAuthenticateawaitSchemes。GetDefaultAuthenticateSchemeAsync();if(defaultAuthenticate!null){varresultawaitcontext。AuthenticateAsync(defaultAuthenticate。Name);if(result?。Principal!null){context。Userresult。Principal;}}awaitnext(context);}}}
  在GitHub中查看AuthenticationMiddle源码参考资料https:docs。microsoft。comenusaspnetcoresecurityauthentication?viewaspnetcore5。0

燕氏观点图解山西大学城(10所大学)山西省重点高校太原理工大学占地2045亩,前身是创立于1902年的国立山西大学堂西学专斋,是我国最早成立的三所国立大学之一。百余年来,太原理工大学秉承敢为人先、敢于创新、勇于竞……雪铁龙家族快乐星球SUV,有颜有型的全新C3XR受年轻人青睐东京奥运会期间,中国代表队斩获88枚奖牌,除了激烈的竞技体育让人们摇旗呐喊之外,一群年轻小将在赛场外圈粉无数,这个夏天,杏哥、芭比娃娃、油焖大虾成为网络热搜词,拿金牌拿到手软的……为什么中年男人这么艰辛,开网约车和送外卖的忙碌,说明生存不易最近,网约车司机、外卖小哥的很多话题,引发了网络的热议。他们的生存状况,一些知名平台调查和统计数据,都在向我们传递着一个非常残酷的现实中年人的生存艰辛。特别是今年5月份,清华大……北海警方打掉一潜逃外地1040传销团伙抓获犯罪嫌疑人30名9月17日,广西壮族自治区北海市公安局在云南省昆明市、楚雄市和元谋县三地警方配合下,对侦办的重特大传销专案进行集中收网,共抓获涉嫌组织、领导传销活动人员30名,扣押手机、银行卡……家用纯电SUV,2022款大蚂蚁是你的款吗?据悉,奇瑞新能源2022款大蚂蚁即将于10月28日正式上市。新车在原有的五款车色基础上,又新增2款主流潮色南沙蓝、伊犁紫。七种车色任选,尽情定义你的个人风格!从外观来看,……智能空气开关生产制造商山东卓文信息科技有限公司智能空气开关生产制造商卓文科技卓文科技是一家专业生产家用智能空气开关厂家,主要产品智能断路器、通讯电源,智慧用电软件平台等系列产品,产品质量稳定可靠,售后完善,证书齐全,……如何选择合适的家用灭火器目前,随着家用电器增多,生活中用火、用电、用气日益频繁,家庭火灾发生率也急剧攀升。笔者据消防部门了解到,我国家庭火灾形势非常严峻,平均每天都有发生,并呈逐步上升趋势。几乎所有的……顶层阁楼缺点太多!只能当储藏室吗?不妨打造多功能家庭影院在常人眼中,顶层阁楼的缺点相当明显,比如空间的不规则、矮小,隔热、通风等诸多问题,通常都会被设计成书房或杂物室。但如果我们加以合理利用,其空间的作用会更为丰富。比如打造成多功能……卖凉皮的小本生意也能做到风声水起,他的营销秘诀是什么?在炎热的夏天里,凉皮对与一些不想吃饭的人,莫过于最大的慰藉。一份凉皮的生意能做多大,今天要讲的餐饮老板不简单,硬是用凉皮创造了一个销售奇迹。案例说明张老板以前在厂里……云货优选的ampampquot好货ampampquot必须闯对于云货优选的用户来说,在上面买到性价比的品牌好货,已经成为一种习惯。但却很少有人去深究,为什么云货优选能长期保持输出高质量的商品。近期,一家准备入驻云货优选的服装品牌就近距离……老锅教你超频AMD处理器篇本文仅依靠手中有的DIY组件讲解装机超频的选择推荐,无法针对具体某款CPU和内存进行定制化讲解。不同款CPU体质各有不同,超频能力也都不同,并不能保证所有的处理器都能按照本教程……手把手教你子网划分1、子网划分作用A、计算网络号,通过网络号选择正确的网络设备连接终端设备B、清楚IP地址四段点分十进制数和子网掩码,对应的网络号是什么C、交换机是用来连接相同……
宝马首款纯电SUV,豪华与科技并存,前脸设计彪悍但暗藏玄机?在新能源车普及的当下,越来越多的世界主流车企开始争先恐后地推车电动车,来迎合而各种政策和当今的潮流,今天的主角宝马,就推出了自己的首款纯电动SUViX。这款车是在宝马基于全新设……失眠了,安眠药该不该吃?会不会产生依赖感?看看药师怎么说睡觉是人们几乎每天都会经历的事情,但是有很多人都存在睡眠障碍,有的人是因为工作压力大或者当天很兴奋导致一段时间的睡眠不佳,而有一部分人则需要服用睡眠药才能入睡。还有一部分睡眠不……肩颈按摩仪CE认证颈椎按摩仪能够促进血液循环和新陈代谢、缓解颈椎疼痛、携带方便,深受办公室白领、司机等久坐和长时间站立人群喜爱。欧盟对于产品安全十分重视,肩颈按摩仪要想进入欧盟市场必须取得……面对质疑,联想大佬的傲慢无视到底是在保护联想还是在毁灭联想?联想既不是政府机关,也不是国企,所以他没有义务回答一般公众的疑问。这是一。第二,国企改制、国有资产管理、公司经营管理,这些问题都不是一份解释函可以说清楚的。有兴趣的……两千元电竞小金刚性能可期!小金刚二代显示器,玩的就是棱角分明如果你是一名玩家,如果你的游戏水平相当了得,那么就会有越来越长的平台期这没错吧?那么能让你变得更强的就只有依靠物理提升了吧?一台适合游戏的显示器没准是个不错的选择了。对于很多受……5G用户突破4亿大关,是什么在阻碍你升级?关于5g的问题,一直都很火!我觉得主要还是5g套餐资费和基站覆盖率的原因,现在5g手机已经很普遍了,5g入门机器1000多一点就能到手,可选择性非常多。我这里去年就……蓝底车牌将成历史?新牌样式大革新数字升为六位更具国际范近日,网上曝光了一组全新样式的小型汽车号牌和临时行驶车号牌,采用了新的白底黑字和蓝白渐变黑字的设计,配以标注性的文字、数字和图样,看起来更有国际范了。同时,后面的数字字母部分升……从下个月起Win7安装安全更新要付费了转眼Windows10已经推出了三年半的时间,Windows7更是快10年了。此前微软已经明确表明,2015年1月13日将会停止对Windows7主流更新支持,2020年1月1……税收优惠被取消,互联网公司的好日子到头了?记者程璐陆柯言编辑崔鹏中国互联网公司多年来享受的税收优惠,以及凭借成本优势快速扩张的时代,可能都要结束了。上周,阿里巴巴财报显示,集团上季度缴纳的所得税为60……极氪001下线了但极氪要走的路还很长10月19日,极氪001正式下线。成立仅7个月后,极氪汽车就迎来了交付。这个由吉利董事长李书福亲自挂帅、吉利CEO安聪慧全权负责的吉利高端新能源品牌步子迈的相当快。……北通宙斯游戏手柄,让电脑秒变游戏机最畅快的游戏体验,莫过于使用游戏手柄来打游戏。依稀记得小时候,趁着爸妈不在家,叫上小伙伴在家偷偷玩红白机。虽然偶尔也会被家长发现,胖揍一顿。不过儿时的回忆轻松又美好。时光寸寸,……618年中大促,好音质耳机音响购物攻略今年的618年中大促可谓是万众期待,相比平日的降价促销,每年的大促总是给了网民们十足的惊喜。以前只有双11、双12错过了心仪的商品就只能遗憾地等上一年,而如今618年中大促让剁……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网