【导读】在.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提供给了我们授权中间件接口,一切又是那么得心应手!

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

  1. java授权失败_自定义Spring Security的身份验证失败处理方法

    1.概述 在本快速教程中,我们将演示如何在Spring Boot应用程序中自定义Spring Security的身份验证失败处理.目标是使用表单登录方法对用户进行身份验证. 2.认证和授权(Authe ...

  2. 苹果开发者账号续费时出现你的支付授权失败,请核对信息并重试..

    1.联系邮箱我用的是网易的126邮箱,账单信息一定要写信用卡的账单信息,写持卡人的姓名,一定要用大写字母,账单地址可以在手机上查看你信用卡的账单地址,下面是苹果客服的回复: 2.最后我用的是建设银行的 ...

  3. .net授权获取openid_Asp.Net Core 中IdentityServer4 授权中心之自定义授权

    一.前言 上一篇我分享了一篇关于 Asp.Net Core 中IdentityServer4 授权中心之应用实战 的文章,其中有不少博友给我提了问题,其中有一个博友问我的一个场景,我给他解答的还不够完 ...

  4. Asp.Net Core 中IdentityServer4 授权中心之自定义授权模式

    一.前言 上一篇我分享了一篇关于 Asp.Net Core 中IdentityServer4 授权中心之应用实战的文章,其中有不少博友给我提了问题,其中有一个博友问我的一个场景,我给他解答的还不够完美 ...

  5. 静默授权获取unionid_Asp.Net Core 中IdentityServer4 授权中心之自定义授权

    一.前言 上一篇我分享了一篇关于 Asp.Net Core 中IdentityServer4 授权中心之应用实战 的文章,其中有不少博友给我提了问题,其中有一个博友问我的一个场景,我给他解答的还不够完 ...

  6. ASP.NET Core自定义响应内容

    问题 在业务开发中,对Web API的返回格式有一定要求,需要是定制化的Json结构,用于前端统一处理: {Status : 0,Message: "",Info : xxx } ...

  7. [高通SDM450][Android 9.0] 虹软人脸算法WIFI信息变化导致授权失败

    虹软人脸算法WIFI信息变化导致授权失败 开发平台基本信息 补丁下载地址 前言 问题描述 解决方法 开发平台基本信息 芯片: 高通SDM450 版本: Android 9.0 kernel: msm- ...

  8. [main] org.apache.catalina.core.StandardContext.startInternal 一个或多个listeners启动失败,更多详细信息查看对应的容器日志文件

    使用Tomcat9启动项目(数据库使用的是Oracle),报这个错误.看了很多其它的文章都没找到报错的问题所在. idea是可以正常启动并访问.但是打成war包部署到tomcat后,项目就启动不起来, ...

  9. 微信小程序获取用户信息“授权失败”场景的处理

    很多的时候我们在处理小程序功能的时候需要用户获取用户信息,但是呢为了信息安全,用户不授权导致授权失败场景:但是小程序第二次不在启动授权信息弹层,为了用户体验,可以用以下方式处理: function i ...

最新文章

  1. projecteuler_problem10
  2. Tensorboard安装和访问(pytorch+MobaXterm)
  3. 什么是索引?为什么要建立索引?并举例说明.(以某一具体的DBMS为例)
  4. 10G_Ethernet_03 Example Design
  5. 在IIS7上导出全部应用程序池的方法 批量域名绑定
  6. Linux IPC实践(6) --System V消息队列(3)
  7. 设计师应该尊重技术的限制
  8. AIX下密码永不过期
  9. idea中Terminal输入命令git log后如何退出
  10. 车油表灯亮了,还能开多久?
  11. java怎么看具体被挂起的线程_Java知多少(65)线程的挂起、恢复和终止
  12. JavaScript变量提升:函数提升要比变量提升更猛
  13. python安装-Python安装
  14. 如何使用SQL Server游标
  15. java项目开发经验总结
  16. Gitea+Jenkins+webhooks-前端自动化部署
  17. 设计师不可错过的2022年设计类网站大搜集,素材 教程 案例 全都有
  18. 想进外企你应该知道的七大基本面试知识
  19. 年轻时代,噢,年轻时代
  20. 基于 AndroidR QCOM IMS CALL 通话流程解析

热门文章

  1. lr中winsock协议的脚本(转载51testing)
  2. AngularJS $watch 性能杀手
  3. BZOJ 2588: Spoj 10628. Count on a tree 树上跑主席树
  4. 如何用C#在Excel中生成图表?
  5. 初学ASP.NET 必看
  6. airpods2使用_如何使用AirPods和AirPods Pro:完整指南
  7. 如何在PowerPoint中制作打字机或命令行动画
  8. dropbox_Google的新存储定价与Microsoft,Apple和Dropbox相比如何
  9. java 中的chartdata_获取Helm Charts中的文件夹列表
  10. 矿难让显卡压了那么多货咋办?NV如是说