IdentityServer4授权时ApiName参数赋值位置及无配置生效原因问询
IdentityServer4 ApiName配置问题解答
1. api1需要配置的所有位置
ApiName对应的是JWT令牌中的**aud(受众)**声明,要让配置生效,需要三个位置同步配置:
- IdentityServer4服务端的资源配置:3.x版本中需要在服务端注册
ApiResource,示例代码如下:
// IDS4服务端资源配置 new List<ApiResource> { new ApiResource("api1", "示例API资源") }
同时需要给调用接口的客户端配置允许访问api1对应的权限范围(Scope)。
- 客户端请求令牌时的参数配置:请求access_token时,
scope参数必须包含api1对应的scope值,确保返回的令牌中会携带aud=api1的声明。 - API项目的验证中间件配置:也就是你代码中写的
options.ApiName = "api1",这一步是告诉验证中间件,仅接受aud声明为api1的有效令牌。
之前配置后返回401的核心原因就是你拿到的令牌中没有aud=api1的声明,中间件校验受众不通过直接拦截。
2. 未配置ApiName允许访问的原因
你使用的3.x版本的IdentityServerAuthentication中间件存在默认逻辑:当你不指定ApiName参数时,中间件会直接跳过受众校验步骤,仅验证令牌的三个基础属性:
- 令牌签名是否和Authority签发的一致
- 令牌是否在有效期内
- 令牌的签发方是否和配置的Authority匹配
只要以上三个校验通过,就会直接放行,不会校验这个令牌是不是专门发给当前API使用的。
注意:生产环境强烈不建议省略ApiName配置,否则只要是同个IdentityServer签发的有效令牌,都能访问你的API,存在严重的越权风险。
内容的提问来源于stack exchange,提问作者Konrad Viltersten
相关产品推荐
相关产品推荐

