.NET Core授权失败如何自定义响应信息?

【导读】在.NET 5之前,当授权失败即403时无法很友好的自定义错误信息,以致于比如利用Vue获取到的是空响应,不能很好的处理实际业务,同时涉及到权限粒度控制到控制器、Action,也不能很好的获取对应路由信息

本文我们来看看在.NET 5中为何要出现针对授权失败的中间件接口?它是如何一步步衍生出来的呢?以及 对于授权失败根据实际需要如何自定义响应错误,以及如何获取对应路由信息等等

授权失败自定义响应信息

如下是在.NET 5之前,对于授权处理,我们大多实现自定义的AuthorizationHandler

public class CustomAuthorizeHandler : AuthorizationHandler<CustomAuthorizationRequirement>
{protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, CustomAuthorizationRequirement requirement){throw new NotImplementedException();}
}public class CustomAuthorizationRequirement : IAuthorizationRequirement
{public CustomAuthorizationRequirement(){}
}

但此时参数给予的是授权上下文,我们并不能拿到当前请求上下文中的相关信息,如果是在mvc中,想必大多是如下这般获取的

protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, CustomAuthorizationRequirement requirement)
{var context = context.Resource as HttpContext;
}

但对于前后分离的web api中,若我没记错的话,这样是获取到的是空,于是乎我们借助于注入上下文接口实现,演变成如下这样

public class CustomAuthorizeHandler : AuthorizationHandler<CustomAuthorizationRequirement>
{private readonly IHttpContextAccessor _accessor;public CustomAuthorizeHandler(IHttpContextAccessor accessor){_accessor = accessor;}protected async override Task HandleRequirementAsync(AuthorizationHandlerContext context, CustomAuthorizationRequirement requirement){var httpContext = _accessor.HttpContext;// 授权失败响应信息await httpContext.Response.WriteAsync("授权失败");//响应失败调用context.Fail();}
}


通过上下文可以拿到比如用户声明信息等等,貌似已经基本满足我们实际业务需求,那要是我想获取路由信息又该如何呢?在3.0以下貌似只能通过Path自己解析(个人猜测)

从.NET Core 3.0+上,官方开放针对上下文的扩展方法,提供给我们获取路由节点元数据详细信息

在该终结点类存在一个元数据属性,该属性为集合,该元数据包含任何你想要的东东

这里必须强调一下,我最喜爱.NET Core的一点是,很多时候我们会封装类库,并在类库中使用到Web APi中相关的上下文一切信息等等,如果是以前.NET Framework怕是有点麻烦

比如如上在类库中获取上下文接口,如果你还是延续旧思想,查看vs智能提示你是否需要安装包,你会发现在Web APi中版本和你安装的版本是对应不上的,这可能是有问题的哈(具体细节我并未深入探究),但实际上我想安装的是.NET 5

在.NET Core类库中要实现.NET Core相关基础框架信息,只需要在类库项目文件中引入支持.NET Core应用程序包包即可,如此才和当前应用程序版本完全一致

  <ItemGroup><FrameworkReference Include="Microsoft.AspNetCore.App" /></ItemGroup>

面向不同群体读者,这里重点强调下,以免初学.NET Core童鞋路走偏了!话题扯远了,比如如上述我们想要获取到元数据中的控制器和action名称,该元数据集合参数都是object,所以我们想要对应的信息,需要稍微清楚一点.NET Core基本流程处理所提供的各个对象

public class CustomAuthorizeHandler : AuthorizationHandler<CustomAuthorizationRequirement>
{private readonly IHttpContextAccessor _accessor;public CustomAuthorizeHandler(IHttpContextAccessor accessor){_accessor = accessor;}protected async override Task HandleRequirementAsync(AuthorizationHandlerContext context, CustomAuthorizationRequirement requirement){var httpContext = _accessor.HttpContext;var endPoint = httpContext.GetEndpoint();var controllerActionDescriptor = (ControllerActionDescriptor)endPoint.Metadata.ToList().FirstOrDefault(d => d is ControllerActionDescriptor);var controllerName = controllerActionDescriptor.ControllerName;var actionName = controllerActionDescriptor.ActionName;}
}

讲到这里,实现对应抽象授权处理对象,基本上可满足我们的需求,即使上述拿到上下文并响应,但是在接口响应上我们是获取不到的,因为授权上下文,只提供Fail和Succeed方法,要是我们想根据业务失败后直接响应呢?所以最大的问题出在:我们无法完全控制响应,以及自定义响应

这个时候,经过开发者在github上激烈的反馈,官方在.NET 5给出了,针对授权处理的中间件接口,上下文也已直接对外暴露

public class CustomAuthorizationMiddlewareResultHandler: IAuthorizationMiddlewareResultHandler
{public async Task HandleAsync(RequestDelegate next,HttpContext context, AuthorizationPolicy policy, PolicyAuthorizationResult authorizeResult){var endPoint = context.GetEndpoint();var controllerActionDescriptor = (ControllerActionDescriptor)endPoint.Metadata.ToList().FirstOrDefault(d => d is ControllerActionDescriptor);var controllerName = controllerActionDescriptor.ControllerName;var actionName = controllerActionDescriptor.ActionName;if (!context.User.Identity.IsAuthenticated){context.Response.StatusCode = (int)HttpStatusCode.Unauthorized;await context.Response.WriteAsync("{\"data\":{\"succeeded\":false,\"code\":401,\"message\":\"登录已过期,请重新登录\"}}");return;}else if (!await HandleRequirementEvaluateAsync(context.User, controllerName, actionName)){context.Response.StatusCode = (int)HttpStatusCode.Forbidden;await context.Response.WriteAsync("{\"data\":{\"succeeded\":false,\"code\":403,\"message\":\"您暂无足够的权限执行该操作\"}}");return;}await next(context);}
}

自从.NET 5提供给了我们授权中间件接口,一切又是那么得心应手!

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

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

相关文章

计算机电缆2x2x1.5,计算机电缆djypvp1x2x1.5

计算机电缆djypvp1x2x1.5硅橡胶计算机电缆适用于各种仪器仪表的连结&#xff0c; 以及信号传输。它具有耐高温、低温、耐腐蚀、舒缓老化等优点&#xff0c;对特殊场所或恶劣环境中的使用是目前理想的产品&#xff0c;正常使用温度为—60℃一250℃。产品特点:1.执行标准Q/ILXD-1…

jQuery实现等比例缩放大图片让大图片自适应页面布局

在布局页面时&#xff0c;有时会遇到大图片将页面容器“撑破”的情况&#xff0c;尤其是加载外链图片&#xff08;通常是通过采集的外站的图片&#xff09;。那么本文将为您讲述使用jQuery如何按比例缩放大图片&#xff0c;让大图片自适应页面布局。通常我们处理缩略图是使用后…

虚线 实现_redis跳跃表实现

跳跃表是一种有序的数据结构&#xff0c;它通过在每个节点中维持多个指向其他节点的指针&#xff0c;从而达到快速访问节点的目的。redis 使用跳跃表作为有序集合键的底层实现之一&#xff0c;如果一个有序集合包含的元素数量比较多&#xff0c;又或者有序集合中元素的成员是比…

当代家长现状。。 | 今日最佳

世界只有3.14 % 的人关注了青少年数学之旅&#xff08;图源都市音酱&#xff09;太真实了↓ ↓ ↓

使用目录服务和 Visual C# .NET 向本地系统添加用户

创建示例1. 打开 Microsoft Visual Studio .NET&#xff0c;然后新建一个 Visual C# Console 应用程序项目。 2. 在“解决方案资源管理器”中&#xff0c;右键单击引用&#xff0c;然后单击添加引用。 3. 添加一个对 System.DirectoryServices.dll 程序集的引用。 4. 将 Clas…

Prometheus(一):Web服务环境监控

&#xfeff;写在前面现每个后端的同学的日常都在跟服务(接口)打交道&#xff0c;维护老的比较大单体应用、按业务拆得相对比较细的新服务、无论企业内部用的&#xff0c;面向用户的前端的服务。流量大的有流量小的&#xff0c;有重要的有不那么重要的。但是&#xff0c;不管怎…

自拟计算机作文100字,我的电脑作文100字五篇

我家有一台电脑&#xff0c;颜*是黑*的&#xff0c;电脑的作用是可以玩游戏&#xff0c;还可以查自己不懂的问题。有一次&#xff0c;爸爸和妈妈不在家&#xff0c;我就先做完作业&#xff0c;在做作业的时有一道题我不知道怎么做&#xff0c;于是&#xff0c;我上百度上一搜&a…

acwing Linux 租云服务器环境配置

今天给大家讲解acwing Linux 租云服务器&环境配置&#xff0c;这里以阿里云为例子给大家讲解一下如何租用这个云服务器&#xff0c;现在有阿里云、华为云、腾讯云、京东云这么几个大的服务系统&#xff0c;我个人是喜欢华为云的嘻嘻&#xff0c;因为个人比较喜欢华为公司&a…

Shell练习题(持续更新)

1.输出1-10echo {1..10} seq -s 1 10 #默认分隔符\n for((i1;i<10;i));do echo -n "$i ";done;echo #最后echo为了换行 i1;while [ $i -le 10 ];do printf "%s " $i;i$[$i1];done;echo awk BEGIN{for(i1;i<10;i) printf "%s ",i;};…

楼层效果_1一28高楼最好最吉利的楼层是哪层?选楼层要注意什么?

在选择房屋楼层的时候&#xff0c;可能大家对于想过了&#xff0c;方法是比较纠结的&#xff0c;有些家庭可能考虑到室内的采光问题&#xff0c;有些可能考虑的是噪音的问题&#xff0c;更有些朋友们可能考虑的是室内的风水等相关问题&#xff0c;那么1一28高楼最好最吉利的楼层…

43秒处竟惊现刘强东!印度动作大片《WAR》终极预告曝光

全世界只有3.14 % 的人关注了青少年数学之旅都说印度是一个非常奇妙的国度&#xff0c;文能Z教治国&#xff0c;武能高产神片。科学家们骂骂咧咧地退出了群聊...这不&#xff0c;前不久印度又曝光了一部动作大片《WAR》&#xff1a;电影的剧情大概是讲述了一名印度士兵被派去消…

C# 极限压缩 dotnet core 控制台发布文件

每次发布 dotnet core 应用都会觉得发布文件太大&#xff0c;而如果使用极限压缩&#xff0c;用 CoreRT 能让发布的控制台文件到 5KB 左右&#xff0c;不需要带框架就能在其他设备运行这是微软 MichalStrehovsky 大佬&#xff0c;也就是 CoreRT 项目开发者给的方法在开始写代码…

按id进行查找按名称进行排序_Excel工作表中如何按需要的顺序快速进行排序

在工作中&#xff0c;有时候需要经常对一组内容按一定的顺序来进行排序。如果每次都手动进行排序&#xff0c;会小号很多时间。因此可以将特定顺序添加到自定义序列中。有两种不同的操作方法可以来实现。方法一如图&#xff0c;现在有一列水果名称&#xff0c;之后需要都按照现…

ajax 返回flase,Django request.is_ajax返回false

小编典典我不知道你怎么了 我测试并取得了良好的消息&#xff1a;This is ajax。我的代码&#xff1a;urls.pyurl(r^$, myapp.views.home, namehome),url(r^ajax_test/$, myapp.views.ajax_test, nameajax_test),views.pydef home(request):return render_to_response(home.htm…

20种最先进的机器人,感觉有点吓人!

全世界只有3.14 % 的人关注了青少年数学之旅随着科技的发展&#xff0c;机器人必然逐渐进入我们的生活&#xff0c;甚至在许多领域替代人类。以下是目前全球范围内最先进的一些机器人&#xff1a;Actroid-F这种实验性机器人的目标&#xff0c;是创造最逼真的仿人类机器人&#…

PDF批量删除注释

使用Adobe Acrobat Pro的批量处理完成 1.在“自定义”-“添加新工具集”-“动作向导”-将“创建新动作”加入-“保存”2.然后点新出现的“创建新动作”图标3.将“内容”-“删除所有注释”添加上&#xff0c;然后再添加上“保存和导出”中的保存4.保存设定的动作列表&#xff0c…

linkButton与Button 的click事件与onclientClick事件

linkButton与button 在ie7中两个事件都能被执行。但是在ie6中&#xff0c;linkButton中的onclientClick事件先执行&#xff0c;而click事件不被执行。在ie7中&#xff0c;二者都执行了。button就没有这个问题。实验&#xff1a;通过showModalDialog()弹出一个窗口&#xff0c;窗…

怎么让图片手机上排列_荣耀手机系列档次怎么排列?

目前&#xff0c;我们按照处理器和手机表现进行排列。荣耀magic2因为充电口(塑料问题)&#xff0c;所以&#xff0c;排名第一的位置我给荣耀V20&#xff01;其次&#xff0c;是荣耀magic2&#xff0c;然后是荣耀10&#xff0c;荣耀note10&#xff0c;其次是荣耀v10&#xff0c;…

.NET 6 即将到来的新特性 — 隐式命名空间引用

.NET 6 即将到来的新特性 —— 隐式命名空间引用Intro之前我们在 ASP.NET Core 6 Minimal API 中曾经提到过现在我们还是需要手动加命名空间引用&#xff0c;在以后的版本中可能就不需要手动加命名空间的引用了&#xff0c;确实是的。今天看到一个更新&#xff0c;可以不需要写…

金蝶显示服务器异常,金蝶提示云服务器异常

金蝶提示云服务器异常 内容精选换一换生命周期是指弹性云服务器从创建到删除(或释放)历经的各种状态。当云服务器网络异常、防火墙未放行本地远程桌面端口、云服务器CPU负载过高等场景均可能导致云服务器无法正常登录。当您的云服务器无法远程登录时&#xff0c;我们建议您首先…