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

ASP.NET Core 2.0中IdentityServer4配置多有效受众遇Unauthorized问题

排查IdentityServer4添加多Scope后未授权问题

嘿,我来帮你搞定这个未授权的问题!你遇到的情况大概率和令牌受众(Audience)匹配、Scope权限配置这两点有关,咱们一步步拆解排查:

1. 先解析令牌,确认关键内容

首先,你得先搞清楚生成的JWT令牌里到底包含了什么——用本地的JWT解析工具把令牌拆解开,重点看两个核心字段:

  • aud:令牌的受众,默认是你定义的ApiResource的Name(也就是wallets.api)
  • scope:令牌包含的权限范围,应该包含你配置的wallets.api和all.api

如果scope里没包含你需要的权限,或者aud和API端期望的不匹配,那肯定会触发未授权。

2. 检查API端的JWT认证配置

你的API项目里,Startup.cs的JWT认证配置必须和IdentityServer4的配置对应。如果API需要接受多个受众(比如wallets.api和all.api),得明确把它们加到ValidAudiences列表里:

services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddJwtBearer(options =>
    {
        options.Authority = "https://你的IdentityServer地址";
        // 配置允许的所有受众
        options.TokenValidationParameters = new TokenValidationParameters
        {
            ValidAudiences = new[] { "wallets.api", "all.api" }
        };
    });

要是你只配置了单个受众,而令牌里的aud或者你期望的权限对应的受众不在列表里,就会直接被拒绝。

3. 确认客户端和Scope的授权配置

  • 客户端配置:确保你的客户端(调用API的应用)在IdentityServer的Client配置中,AllowedScopes包含了all.api这个新添加的Scope,否则客户端根本拿不到包含这个Scope的令牌。
  • 请求令牌时的Scope参数:客户端请求令牌的时候,必须明确传递需要的Scope(比如scope=wallets.api all.api),不然令牌里不会包含all.api的权限。

4. 检查API的授权策略(如果有)

如果你的API控制器/接口用了自定义授权策略(比如要求必须包含all.api权限),得确保策略配置正确:

services.AddAuthorization(options =>
{
    options.AddPolicy("RequireAllApiScope", policy =>
    {
        policy.RequireAuthenticatedUser();
        policy.RequireClaim("scope", "all.api");
    });
});

然后在接口上标注对应的策略:

[Authorize(Policy = "RequireAllApiScope")]
public IActionResult YourApiAction()
{
    // ...
}

如果策略要求了某个Scope,但令牌里没有,自然会返回未授权。

5. 可选:拆分ApiResource(如果需要)

如果你希望all.api是一个独立的API资源(而不是wallets.api的附属Scope),可以把它单独定义成一个ApiResource:

public static IEnumerable<ApiResource> GetApiResources() 
{ 
    return new List<ApiResource>()
    { 
        new ApiResource()
        { 
            Name ="wallets.api", 
            Description ="Wallets API", 
            Scopes = new List<Scope>(){ new Scope() { Name = "wallets.api", DisplayName="Wallets API" } } 
        },
        new ApiResource()
        {
            Name = "all.api",
            Scopes = new List<Scope>(){ new Scope() { Name = "all.api" } }
        }
    }; 
}

这样客户端请求不同的Scope时,令牌的aud会对应不同的ApiResource名称,API端也可以根据需求配置对应的受众。

按照这个流程排查下来,应该能很快定位到问题所在!

内容的提问来源于stack exchange,提问作者Marco

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 02:29:01