【.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,一经查实,立即删除!

相关文章

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

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

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

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

.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应用…

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;正如大家…

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

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

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;也可以融合当今最热门的…

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

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

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

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

WeihanLi.Npoi 近期更新

WeihanLi.Npoi 近期更新Intro最近对我的 NPOI 扩展做了一些改变&#xff0c;一方面提高性能&#xff0c;一方面修复bug&#xff0c;增加一些新的功能来让它更加好用&#xff0c;前几天发布了 1.5.0 版本&#xff0c;下面来介绍一下最近的更新默认导入/导出格式变更在 1.5.0 版本…

【.NETCore 3】Ids4 ║ 多项目集成统一认证中心的思考

前言哈喽大家好&#xff0c;好久都没有写文章了&#xff0c;这次又重新开始写技术文章了&#xff0c;半年前我还是一直保持每周都写文章的&#xff0c;后来是为了响应群友的号召&#xff0c;开始踏上了录制视频&#xff08;https://www.bilibili.com/video/av58096866&#xff…

.NET 社区 NB,2019 中国 .NET 开发者峰会

点击蓝字关注我们作为广州 .NET 技术俱乐部的一名成员&#xff0c;很荣幸以志愿者的身份见证并参与了 首届社区组织的中国 .NET 开发者峰会 &#xff0c;这次大会共分为三天&#xff0c;第一天的 .NET 之夜&#xff0c;第二天的 .NET 开发者峰会&#xff0c;第三天的 .NET Core…

SQL Server 中 JSON_MODIFY 的使用

SQL Server 中 JSON_MODIFY 的使用IntroSQL Server 从 2016 开始支持了一些 JSON操作&#xff0c;最近的项目里也是好多地方直接用字段直接存成了 JSON&#xff0c;需要了解一下怎么在SQL Server 中操作 JSON.JSON支持适用于 SQL Server 2016 及以上版本 和 Azure SQL Database…

TypeScript 3.7稳定版发布

TypeScript 3.7 发布了&#xff0c;此版本带来了许多新特性。Optional Chaining首先一大亮点是 Optional Chaining&#xff0c;这是社区呼唤特别强烈的一个 ECMAScript 特性。最初它是 TypeScript 的 issue 跟踪器上第 16 个 issue&#xff0c;于 5 年前提交&#xff0c;要知道…

.NET手撸绘制TypeScript类图——上篇

.NET手撸绘制TypeScript类图——上篇近年来随着交互界面的精细化&#xff0c; TypeScript越来越流行&#xff0c;前端的设计也越来复杂&#xff0c;而 类图正是用简单的箭头和方块&#xff0c;反映对象与对象之间关系/依赖的好方式。许多工具都能生成 C#类图&#xff0c;有些工…

阅读源码学设计模式-单例模式

有些编码套路是公认的&#xff0c;大家都参照其编写符合可观赏性的代码&#xff0c;那就是设计模式现在.NETcore 默认提供了DI功能&#xff0c;那我想设计一个全局的引擎类&#xff0c;进行注入服务、解析服务、配置中间件。并且要求该引擎类全局唯一&#xff0c;其他地方不能进…

我终于知道post和get的区别

IT界知名的程序员曾说&#xff1a;对于那些月薪三万以下&#xff0c;自称IT工程师的码农们&#xff0c;其实我们从来没有把他们归为我们IT工程师的队伍。他们虽然总是以IT工程师自居&#xff0c;但只是他们一厢情愿罢了。码农&#xff1a;你知道get和post请求到底有什么区别&am…

【译】使用Blazor构建桌面应用

随着最近.NET Core 3的正式发布&#xff0c;我认为我会尝试一个有趣的小实验。我喜欢使用Electron来创建基于Web的桌面应用程序。我想了解有关Blazor&#xff08;ASP.NET系列的最新成员&#xff09;的更多信息。在这篇文章中&#xff0c;我将向您确切演示如何在15分钟内开始使用…

CAP的学习和应用

前言:用CAP有一段时间了,这里简单记录一下,这么好用的东西,小伙伴们赶紧上车吧一.CAP使用场景?平时工作中经常使用到MQ,如(kafka,rabbitmq...),用来简单的发布/订阅,经常会遇到以下几个问题常用方案,把SQL放前面,MQ放后面,MQ执行失败了,我们把整个SQL进行回滚,这种方案在单应用…