确认ASP.NET Core异步策略授权处理器的实现是否正确
确认ASP.NET Core异步授权处理器实现是否正确
我参考了微软官方文档里的代码示例实现ASP.NET Core基于策略的授权,为了支持async/await调用,对示例代码做了以下修改:
- 将方法定义的返回类型从
Task改为async Task - 将第一个
return Task.CompletedTask改为return - 删除了方法末尾的第二个
return Task.CompletedTask
修改后的代码如下:
protected override async Task HandleRequirementAsync(AuthorizationHandlerContext context, SystemRoleRequirement2 requirement) { if (!context.User.HasClaim(c => c.Type == ClaimTypes.Name)) { return; } // Task.CompletedTask; var Result = (await _idb.QueryAsync<int>(cSQL.Security.SystemRoleAccess2, "SecurityReadOnly", new { UserID = context.User.ReadID(), requirement.SystemRoleIDs })) .SingleOrDefault(); if (Result > 0) context.Succeed(requirement); //return Task.CompletedTask; }
请确认这种异步安全处理器的实现方式是否正确。
回答
你的异步授权处理器实现是正确的,具体说明:
- 给方法添加
async修饰符后,CLR会自动处理方法的Task返回值,无需手动返回Task.CompletedTask - 在
async Task方法中,直接return等价于返回Task.CompletedTask,这种提前退出的写法完全符合异步方法的语义 - 你正确使用
await调用异步数据库查询,这正是使用async Task的核心价值——避免IO操作阻塞线程,提升应用并发能力
额外的优化建议:
- 变量名
Result建议改为小写开头的result,遵循C# PascalCase类型、camelCase变量的命名规范 - 确认数据库查询
QueryAsync的逻辑:SingleOrDefault()在无匹配结果时返回0,当前的Result > 0判断逻辑需和业务预期一致
内容的提问来源于stack exchange,提问作者Brian
相关产品推荐
相关产品推荐

