You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 11:39:20