C# Web API基于IdentityServer4按Scope实现路由权限控制
IdentityServer4 下基于Scope的细粒度API权限控制实现
直接用ASP.NET Core原生的授权策略实现即可,不需要写自定义授权中间件或者过滤器,侵入性最低,维护成本也小,落地步骤:
1. 调整权限Scope设计
把原来单一的usersservice scope替换为两个分级scope:
usersservice.all:全量权限,持有方可访问服务所有接口usersservice.read:只读权限,持有方仅能访问标记为只读的接口
2. 配置服务端认证授权规则
原有JWT Bearer认证配置可以保留,在认证配置之后追加授权策略定义就行。
初始JWT认证配置参考:
services.AddAuthentication(Authentication.Bearer) .AddJwtBearer(Authentication.Bearer, options => { options.Authority = Configuration.GetSection("IdentityServer:Authority").Value; options.Audience = Scopes.UsersService; });
在认证配置后添加授权策略,不用多次调用AddAuthorization,单次注册就能添加多个策略,写法更简洁:
services.AddAuthorization(options => { // 全权限策略:仅校验usersservice.all scope options.AddPolicy("all", policy => policy.RequireClaim("scope", "usersservice.all") ); // 只读策略:全权限、只读权限scope均可访问 options.AddPolicy("read", policy => policy.RequireClaim("scope", "usersservice.all", "usersservice.read") ); });
3. 给接口打对应权限标记
把之前统一加在控制器上的[Authorize]特性去掉,改成在具体接口方法上标记对应策略:
- 所有查询类、不修改数据的只读接口,标记
[Authorize(Policy = "read")] - 所有涉及新增、修改、删除操作的非只读接口,标记
[Authorize(Policy = "all")]
关键说明
read策略的校验规则已经包含了usersservice.all scope,所以持有全权限的调用方默认就能访问所有只读接口,不需要重复配置,天然符合权限继承的逻辑。
内容的提问来源于stack exchange,提问作者ScubaSteve
相关产品推荐
相关产品推荐

