ASP.NET Core授权Handler统一获取路由与查询参数matchKey方法问询
解决方案
不需要手动拆分Request.Path字符串,ASP.NET Core 路由系统已经自动解析好了路径参数,你可以直接从HttpContext.Request.RouteValues中获取路由参数,同时可以兼容原有的查询参数传参方式,调整后的授权Handler代码如下:
protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, MatchRequirement requirement) { if (context.Resource is HttpContext httpContext) { Guid matchKey; // 优先从路由参数中获取matchKey if (httpContext.Request.RouteValues.TryGetValue("matchKey", out var routeMatchKey) && Guid.TryParse(routeMatchKey?.ToString(), out matchKey)) { // 原有权限校验逻辑 context.Succeed(requirement); return Task.CompletedTask; } // 路由中不存在时降级从查询参数获取,兼容旧版URL格式 if (httpContext.Request.Query.TryGetValue("matchKey", out var queryMatchKey) && Guid.TryParse(queryMatchKey.ToString(), out matchKey)) { // 原有权限校验逻辑 context.Succeed(requirement); return Task.CompletedTask; } } // 未获取到有效matchKey默认校验失败 context.Fail(); return Task.CompletedTask; }
原理解释
RouteValues是ASP.NET Core路由中间件解析完请求路径后自动填充的集合,所有路由模板中定义的参数都会自动存入该集合,无需手动处理路径拆分、编码转换等边缘场景,稳定性远高于自行解析路径。- 上述写法同时兼容路由传参和查询参数传参两种形式,不需要修改原有URL的使用逻辑。
内容的提问来源于stack exchange,提问作者Michael Esteves
相关产品推荐
相关产品推荐

