怎么做美瞳网站,论文中引用网站怎么写,360安全网址,下载班级优化大师app前言哈喽大家好#xff0c;马上就要年末了#xff0c;距离新的一年#xff0c;只有50天了#xff0c;春节是75天。在这个时节内#xff0c;天气逐渐变凉#xff0c;但是大家的心肯定很热吧#xff0c;因为发生了两件大事#xff1a;1、双十一买买买#xff0c;在这个让… 前言哈喽大家好马上就要年末了距离新的一年只有50天了春节是75天。在这个时节内天气逐渐变凉但是大家的心肯定很热吧因为发生了两件大事1、双十一买买买在这个让人激动又纠结的一天大家有没有被像 “高考命题组” 般的优惠方案搞得云里来雾里去最终我选择了 不买东西优惠100% 的最优解方案其实是 Q I O N G 第二声。2、还有一个特别轰动的当属前两天上海举办的 中国.NET开发者峰会可以这样读NET Conf(c,o,n ,f)真的特别轰动各路大神齐聚只可惜我当时正在开启微讲堂为了履行我上次公众号点赞的诺言——10小时入门net core的远程视频授课。 言归正传曾几何时在某微信群讨论 Http 状态码的时候被某大佬给怼了一下具体的内容就不说了反正现在的返回状态码无非就那两个方案一个是用 RESTFul 风格完全通过 http状态码来处理另一个就是通过 自定义返回内容比如json的格式把状态信息放到返回内容里边最终我没有听从他的意见还是坚持我自己的风格状态码自定义格式具体的内容我都会在下面详细的说明的恰逢QQ群里有一个小伙伴也说到了关于封装状态码的问题其实我已经写了只不过他的更优雅更漂亮所以我就用他的方案了 投稿人QQ群菜工 、 飞非→飛 主题封装授权认证的自定义返回格式。代码Blog.Core 主分支具体内容详见下文。 一、两种返回格式的思考在上边的文章中呢我和某大佬基于返回格式简单的表明了下个人的立场其实我自己也懂无非就那么两个情况 1、完全基于 HTTP 返回格式状态码说这个可能有点儿抽象我举个例子大家就懂了namespace Microsoft.AspNetCore.Http
{ public static class StatusCodes { public const int Status100Continue 100; public const int Status101SwitchingProtocols 101; public const int Status102Processing 102; public const int Status200OK 200; // 等等等等 public const int Status400BadRequest 400; public const int Status401Unauthorized 401; public const int Status402PaymentRequired 402; public const int Status403Forbidden 403; public const int Status404NotFound 404; public const int Status405MethodNotAllowed 405; public const int Status406NotAcceptable 406; public const int Status414RequestUriTooLong 414; public const int Status414UriTooLong 414; public const int Status415UnsupportedMediaType 415; public const int Status416RangeNotSatisfiable 416; public const int Status416RequestedRangeNotSatisfiable 416; public const int Status417ExpectationFailed 417; public const int Status418ImATeapot 418; public const int Status419AuthenticationTimeout 419; public const int Status421MisdirectedRequest 421; public const int Status422UnprocessableEntity 422; public const int Status423Locked 423; public const int Status424FailedDependency 424; // 等等等等 public const int Status500InternalServerError 500; public const int Status501NotImplemented 501; public const int Status502BadGateway 502; public const int Status503ServiceUnavailable 503; public const int Status504GatewayTimeout 504; public const int Status505HttpVersionNotsupported 505; public const int Status506VariantAlsoNegotiates 506; public const int Status507InsufficientStorage 507; public const int Status508LoopDetected 508; public const int Status510NotExtended 510; public const int Status511NetworkAuthenticationRequired 511; }
} 上边的就是官方给定的 Http 状态码我删了一些大家可以看出来官方给的特别多也特别的全已经能满足我们平时开发的所有需要完全没问题而且呢这样还有一个好处就是比如前端的项目比如 VUE 可以根据 http 状态码来进行拦截器进行封装而不用看返回结果了单单从 statuscode 上就直接统一拦截这样看似特别完美那为啥还会有第二种解决方案呢请继续往下看。 2、自定义返回格式内容上边的方法真的就特别完美么首先拦截器这个优点并不是只能用在拦截 http statuscode 上针对具体的返回内容也可以拦截。其次大家可能偶尔会遇到过这个情况就是访问微信或者什么的时候会出现提示 “5003 xxxxxx异常”大家可以看一下这个返回状态码http 是没有的。而且websocket 也并没有那些所谓的 404 、503吧这个时候就需要我们去自定义比如这样的 这就是第二种解决方案这两种方案其实一直都存在我们的平时开发过程中的当然我是都在用的我目前自己的开源项目里用的是第一种解决方案偶尔也会有第二种公司的某些项目里用的是第二种因为有时候状态信息太多必须去自定义所以这两种方案我都是支持的也不用说这个不对那个错误而且我也同时用了这两个。 那既然两种都支持如果两个我都想用怎么封装一下呢没问题我就在 Blog.Core 项目里对 授权认证 返回格式封装一下大家看看吧原理我以后会在直播里讲这里就不细说了直接讲操作步骤。 二、自定义授权认证返回格式1、复杂的策略授权那既然说到了返回格式肯定得有一个场景那我就用我的复杂策略授权 PermissionHandler.cs 来举例子大家平时也都用过我在本周三的直播中会详细说明这个复杂策略授权的运行机制到时候也会有录屏大家到时候看看就知道了这里不细说。简单来说就是获取当前 token 的角色信息和访问的URL地址做匹配和判断判断是否有权限有就 succeed没有就 failed这里可能是 401 也可能是403。当没有登录的时候就是 没有登录或者token过期的时候我们就 failed会自动返回 401当token还有效但是不匹配Role 和 URL 的时候我们返回 failed会自动返回 403 状态码 这里截图部分代码注意下这里如果你之前写其他返回内容了要删掉只保留 failed 和 return 但是虽然是返回 401 和 403了他们是这样的这种不好看而且也没有具体的响应 Message不太友好 所以我们就需要自定义返回内容的格式。 2、定义响应实体类我这里写了一个很 low 的类具体就是那个意思大家看看即可有更优雅的可以帮忙说说或者提交个 PR 这个实体类是用来返回响应内容的如何使用请往下看。 3、定义响应处理器那我们既然自定义了响应内容就需要定义响应处理器方法就是继承抽象类 AuthenticationHandlerTOptions 然后重写方法 这里很简单只是重写了两个异步方法然后将内容 Response 出去即可。 4、替换默认Scheme方案在上边我们说到了我们的认证服务 services.AddAuthentication() 它自己有一套返回格式和内容就是上边截图的内容那我们要修改就需要给替换掉 // 开启Bearer认证 services.AddAuthentication(o { o.DefaultScheme JwtBearerDefaults.AuthenticationScheme; o.DefaultChallengeScheme nameof(ApiResponseHandler); o.DefaultForbidScheme nameof(ApiResponseHandler); }) // 添加JwtBearer服务 .AddJwtBearer(o { o.TokenValidationParameters tokenValidationParameters; o.Events new JwtBearerEvents { OnAuthenticationFailed context { // 如果过期则把是否过期添加到返回头信息中 if (context.Exception.GetType() typeof(SecurityTokenExpiredException)) { context.Response.Headers.Add(Token-Expired, true); } return Task.CompletedTask; } }; }) .AddSchemeAuthenticationSchemeOptions, ApiResponseHandler(nameof(ApiResponseHandler), o { }); 这个大家要注意一下我已经把 Starup 中的服务都提取出来了一共十个这样大家在学习的时候更方便。到目前为止我们就已经修改完成了我们可以看看效果 不仅使用了 HTTP 的 StatusCode 状态码同时也可以自定义返回内容两个方案都兼容了具体自己项目如何去使用就看自己的需求了。 三、预告这两天重新开始写 IdentityServer4 了打算将我们的项目统一整合到 Ids 的授权服务中心里同时也会录一个视频教程因为 Blog.Core 的视频教程已经完结下一个是 Blog.IdentityServer 的视频教程。如果你有什么问题或者疑问或者想了解的请留言评论。 四、Github Giteehttps://github.com/anjoy8/Blog.Corehttps://gitee.com/laozhangIsPhi/Blog.Core