【.NET Core 3.0】 46 ║ 授权认证:自定义返回格式

前言

哈喽大家好,马上就要年末了,距离新的一年,只有50天了,春节是75天。

640?wx_fmt=png

在这个时节内,天气逐渐变凉,但是大家的心肯定很热吧,因为发生了两件大事:

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 主分支

具体内容:详见下文。

640?wx_fmt=png

 

 

 

 

一、两种返回格式的思考

在上边的文章中呢,我和某大佬基于返回格式简单的表明了下个人的立场,其实我自己也懂,无非就那么两个情况:

 

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;	}	
}

640?wx_fmt=png

 

 

 上边的就是官方给定的 Http 状态码,我删了一些,大家可以看出来,官方给的特别多,也特别的全,已经能满足我们平时开发的所有需要,完全没问题,而且呢,这样还有一个好处,就是比如前端的项目,比如 VUE ,可以根据 http 状态码来进行拦截器进行封装,而不用看返回结果了,单单从 statuscode 上,就直接统一拦截,这样看似特别完美,那为啥还会有第二种解决方案呢,请继续往下看。

 

2、自定义返回格式内容

上边的方法真的就特别完美么,首先,拦截器这个优点,并不是只能用在拦截 http statuscode 上,针对具体的返回内容也可以拦截。

其次,大家可能偶尔会遇到过这个情况,就是访问微信或者什么的时候,会出现提示 “5003 xxxxxx异常”,大家可以看一下,这个返回状态码,http 是没有的。

而且,websocket 也并没有那些所谓的 404 、503吧,这个时候就需要我们去自定义,比如这样的:

640?wx_fmt=png

 

 

 这就是第二种解决方案,这两种方案其实一直都存在我们的平时开发过程中的,当然我是都在用的,我目前自己的开源项目里,用的是第一种解决方案,偶尔也会有第二种,公司的某些项目里,用的是第二种,因为有时候状态信息太多,必须去自定义,所以这两种方案我都是支持的,也不用说这个不对,那个错误,而且我也同时用了这两个

 

那既然两种都支持,如果两个我都想用,怎么封装一下呢,没问题,我就在 Blog.Core 项目里,对 授权认证 返回格式封装一下,大家看看吧,原理我以后会在直播里讲,这里就不细说了,直接讲操作步骤。

 

 

二、自定义授权认证返回格式

1、复杂的策略授权

那既然说到了返回格式,肯定得有一个场景,那我就用我的复杂策略授权 PermissionHandler.cs 来举例子,大家平时也都用过,我在本周三的直播中,会详细说明这个复杂策略授权的运行机制,到时候也会有录屏,大家到时候看看就知道了,这里不细说。

简单来说,就是获取当前 token 的角色信息和访问的URL地址,做匹配和判断,判断是否有权限,有,就 succeed,没有就 failed(这里可能是 401 ,也可能是403)。

当没有登录的时候,就是 没有登录,或者token过期的时候,我们就 failed,会自动返回 401;

当token还有效,但是不匹配Role 和 URL 的时候,我们返回 failed,会自动返回 403 状态码;

 

这里截图部分代码,注意下,这里如果你之前写其他返回内容了,要删掉,只保留 failed 和 return:

640?wx_fmt=png

 

 

 

 

但是,虽然是返回 401 和 403了,他们是这样的,这种不好看,而且也没有具体的响应 Message,不太友好

640?wx_fmt=png

 

 

 

所以我们就需要自定义返回内容的格式。

 

2、定义响应实体类

我这里写了一个很 low 的类,具体就是那个意思,大家看看即可,有更优雅的可以帮忙说说,或者提交个 PR:

 

这个实体类,是用来返回响应内容的,如何使用,请往下看。

 

3、定义响应处理器

那我们既然自定义了响应内容,就需要定义响应处理器,方法就是继承抽象类 AuthenticationHandler<TOptions> ,然后重写方法:

640?wx_fmt=gif

640?wx_fmt=gif

 

这里很简单,只是重写了两个异步方法,然后将内容 Response 出去即可。

 

 

4、替换默认Scheme方案

在上边我们说到了,我们的认证服务 services.AddAuthentication() 它自己有一套返回格式和内容,就是上边截图的内容,那我们要修改,就需要给替换掉:

640?wx_fmt=png

 

 

 

// 开启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;	}	};	})	.AddScheme<AuthenticationSchemeOptions, ApiResponseHandler>(nameof(ApiResponseHandler), o => { });

 

这个大家要注意一下,我已经把 Starup 中的服务都提取出来了,一共十个,这样大家在学习的时候,更方便。

到目前为止,我们就已经修改完成了,我们可以看看效果:

640?wx_fmt=png

 

 

不仅使用了 HTTP 的 StatusCode 状态码,同时也可以自定义返回内容,两个方案都兼容了,具体自己项目如何去使用,就看自己的需求了。

 

 

三、预告

这两天重新开始写 IdentityServer4 了,打算将我们的项目统一整合到 Ids 的授权服务中心里,同时也会录一个视频教程,因为 Blog.Core 的视频教程已经完结,下一个是 Blog.IdentityServer 的视频教程。

如果你有什么问题,或者疑问,或者想了解的,请留言评论。

 

四、Github && Gitee

https://github.com/anjoy8/Blog.Core

https://gitee.com/laozhangIsPhi/Blog.Core

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/313071.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mmdnn TensorFlow is outdated

不仅要更新 tf 还要 python import tensorflow as tf print(tf.__path__) 将其export 到PYTHONPATH当中

.NET Core 如何生成真正的ICO图标

点击上方蓝字关注“汪宇杰博客”导语前一阵我终于完成了博客系统动态生成favicon的功能。众所周知&#xff0c;favicon肯定有一个ico格式的图标&#xff0c;其余可以用 png manifest 的方式输出。然而这个ICO格式让我小收福报&#xff0c;今天就给大家分享一下解决办法。.NET自…

error: ‘CUDNN_CONVOLUTION_FWD_ALGO_WINOGRAD’ was not declared in this scope

cudnn版本问题 cuda8.0cudnn5.1可取 还应修改 Makefile.config当中cuda的路径

Visual Studio Online 东半球首秀,亮相 .NET Conf 2019 中国峰会

佷高兴能参加 .NET Conf 并演讲。看到 NET 社区这么活跃&#xff0c;也是非常开心&#xff01;这次我演讲的主题是《Visual Studio Code —— .NET 开发利器》。找找我在哪&#xff1f;更多关于 Visual Studio Online 的四种开发模式&#xff0c;可以阅读这篇文章&#xff1a;最…

mmdnn tensorflow 转 caffe

参考 https://github.com/Microsoft/MMdnn/blob/master/mmdnn/conversion/tensorflow/README.md#how-to-prepare-your-model-and-conversion-parameters 查看可用模型&#xff1a; How to prepare your model and conversion parameters You can refer Slim Model Extracto…

.NET Core 3.0 部署在docker上运行

自从.NET Core3.0发布之后&#xff0c;写了几篇关于.NET Core 3.0的文章&#xff0c;有助于你快速入门.NET Core3.0。本篇文章主要讲解如何一步步创建一个mvc项目&#xff0c;然后发布并部署在Docker上运行。需要你本地有docker环境1.创建一个站点创建一个ASP.NET Core Web应用…

Deeplab unexpected label

另一种可能的原因是&#xff0c;输入图像尺寸不当&#xff0c;比如奇数偶数不对&#xff0c;导致进入网络中需要补或resize&#xff0c;这样就造成了不确定的label值。

2019 .NET China Conf:路一直都在,社区会更好

这个周末&#xff0c;我从成都飞到了上海参加了首届由社区组织而非官方&#xff08;比如Microsoft&#xff09;组织的.NET开发者峰会&#xff08;.NET Conf&#xff09;。为此&#xff0c;我特意请了两天的假&#xff08;周五周六&#xff0c;对&#xff0c;我们是大小周&#…

“开源、共享、创新”, 中国最具前景开发者峰会落幕魔都

点击蓝字关注我们作者&#xff1a;张善友编辑&#xff1a;吴珊珊校正&#xff1a;潘淳、许豪、刘腾飞、朱兴亮、郑和阳、张潇、韩骏问卷制作&#xff1a;杨乐2019年&#xff0c;注定会是 .NET Core 社区发展的关键一年&#xff0c;诸多重大事件在这一年发生&#xff01;正如大家…

tensorflow atrous convoltion

conv2d_same 就是专门针对 atrous convolution 的 dilation 进行的卷积 https://blog.csdn.net/u013200703/article/details/79300217 def conv2d_same(inputs, num_outputs, kernel_size, stride, rate1, scopeNone): if stride 1: return slim.conv2d(inputs, num_o…

GitHub 2019年度报告,用户超4000万

GitHub 发布了 2019 年年度报告《The State of the Octoverse》&#xff0c;下边来看看一些主要数据。全球用户超过 4 千万 目前 GitHub 上有超过 4000 万开发人员&#xff0c;其中有 80&#xff05; 来自美国以外的地区。去年一年里有 1000 万新加入的开发者&#xff0c;2019 …

如何基于k8s快速搭建TeamCity(YAML分享)

前言最近有朋友基于之前的博客《Docker最全教程之使用TeamCity来完成内部CI、CD流程&#xff08;十七&#xff09;》搭建TeamCity时出现了一些问题&#xff0c;由于平常比较忙&#xff0c;没有及时答复&#xff0c;非常抱歉。这里分享下基于本地k8s集群&#xff08;云端k8s服务…

github 创建文件夹

https://blog.csdn.net/zhaomengszu/article/details/80354929 在我们不适用本地Git的情况下&#xff0c;我们怎么在网页上创建类似下图一样的文件夹呢 四步方法&#xff1a; 第一步&#xff1a;找到新增按钮 第二步&#xff1a;输入文件夹名,你想要用的文件夹名字。 第三步…

ML.NET 终于在Jupyter NoteBook 上跑起来了

对.NETer来说&#xff0c;刚结束的.NET Conf 2019是非常难忘的&#xff0c;毕竟这个个人觉得比微软在中国办的大会更加清真&#xff0c;当然现阶段.NET 已经不单跑在Windows的一项技术了&#xff0c;它可以跑在Linux/macOS/iOS/Android/IoT等&#xff0c;也可以融合当今最热门的…

tf.variable_scope() and tf.name_scope()

https://blog.csdn.net/UESTC_C2_403/article/details/72328815 tf.variable_scope可以让变量有相同的命名&#xff0c;包括tf.get_variable得到的变量&#xff0c;还有tf.Variable的变量 tf.name_scope可以让变量有相同的命名&#xff0c;只是限于tf.Variable的变量 例如&a…

2019.NET Conf China,.NET之崛起,已势不可挡

本文来自DotNET技术圈作者&#xff1a;邹溪源一、背景当今时代&#xff0c;气象更新&#xff0c;技术飞速发展。当今时代&#xff0c;开发者大概是最优秀的群体。每一位开发者&#xff0c;无不奋勇向前&#xff0c;努力追寻时代的步伐&#xff0c;以大无畏的精神迎接挑战&#…

Pocketflow 使用

Pocketflow的简介&#xff1a;https://pocketflow.github.io/ 由两个modules组成&#xff1a;Learner module 负责利用随机hyperparameters压缩并fine-tuning&#xff0c;optimizer module 负责依据随机参数对应的结果确定最佳的压缩参数。Learn module 遍历的hyperparameter来…

PowerBI 11月更新 数据PPT是否会引领新一轮革命

PowerBI Desktop 2019年11月更新新鲜出炉了&#xff1a;罗叔作为全球第 80 人观看更新内容者&#xff0c;快速将本月更新全部奉上&#xff0c;供大家参考。 打开预览特性&#xff0c;如下&#xff1a;本次更新出了三大功能&#xff1a; Power Query 支持 AI新的功能区&#xff…