前言
在.NET 5之前,当授权失败即403时无法很友好的自定义错误信息,以致于比如利用Vue获取到的是空响应,不能很好的处理实际业务,同时涉及到权限粒度控制到控制器、Action,也不能很好的获取对应路由信息。本文我们来看看在.NET 5中为何要出现针对授权失败的中间件接口?它是如何一步步衍生出来的呢?以及对于授权失败根据实际需要如何自定义响应错误,以及如何获取对应路由信息等等
授权失败自定义响应信息
如下是在.NET 5之前,对于授权处理,我们大多实现自定义的AuthorizationHandler
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
public class CustomAuthorizeHandler : AuthorizationHandler<CustomAuthorizationRequirement>
{
protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, CustomAuthorizationRequirement requirement)
{
throw new NotImplementedException();
}
}
public class CustomAuthorizationRequirement : IAuthorizationRequirement
{
public CustomAuthorizationRequirement()
{
}
}
|
但此时参数给予的是授权上下文,我们并不能拿到当前请求上下文中的相关信息,如果是在mvc中,想必大多是如下这般获取的
|
1
2
3
4
|
protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, CustomAuthorizationRequirement requirement)
{
var context = context.Resource as HttpContext;
}
|
但对于前后分离的web api中,若我没记错的话,这样是获取到的是空,于是乎我们借助于注入上下文接口实现,演变成如下这样
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
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应用程序包包即可,如此才和当前应用程序版本完全一致
|
1
2
3
|
<ItemGroup>
<FrameworkReference Include="Microsoft.AspNetCore.App" />
</ItemGroup>
|
面向不同群体读者,这里还是重点强调下,以免有些学习.NET Core的童鞋走偏了!话题扯远了,比如如上述我们想要获取到元数据中的控制器和action名称,该元数据集合参数都是object,所以我们想要对应的信息,需要稍微清楚一点.NET Core基本流程处理所提供的各个对象
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
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给出了,针对授权处理的中间件接口,上下文也已直接对外暴露
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
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有了IAuthorizationMiddlewareResultHandler授权中间件接口,一切又是那么得心应手!
到此这篇关于.NET Core授权失败如何自定义响应信息的文章就介绍到这了,更多相关.NET Core自定义响应信息内容请搜索快网idc以前的文章或继续浏览下面的相关文章希望大家以后多多支持快网idc!
原文链接:https://www.cnblogs.com/CreateMyself/p/14998673.html
相关文章
- 个人网站服务器域名解析设置指南:从购买到绑定全流程 2025-06-10
- 个人网站搭建:如何挑选具有弹性扩展能力的服务器? 2025-06-10
- 个人服务器网站搭建:如何选择适合自己的建站程序或框架? 2025-06-10
- 64M VPS建站:能否支持高流量网站运行? 2025-06-10
- 64M VPS建站:怎样选择合适的域名和SSL证书? 2025-06-10
- 2025-07-10 怎样使用阿里云的安全工具进行服务器漏洞扫描和修复?
- 2025-07-10 怎样使用命令行工具优化Linux云服务器的Ping性能?
- 2025-07-10 怎样使用Xshell连接华为云服务器,实现高效远程管理?
- 2025-07-10 怎样利用云服务器D盘搭建稳定、高效的网站托管环境?
- 2025-07-10 怎样使用阿里云的安全组功能来增强服务器防火墙的安全性?
快网idc优惠网
QQ交流群
-
2025-05-25 76
-
2025-05-29 68
-
.Net Core中间件之静态文件(StaticFiles)示例详解
2025-05-29 91 -
2025-06-04 43
-
函数中使用require_once问题深入探讨 优雅的配置文件定义方法推荐
2025-05-29 68



