ASP.NET Core 8中RequiredScope属性失效问题求助
问题根源
- 未采用Microsoft Identity Web的官方配置方式,导致
[RequiredScope]的验证逻辑未正确注册 - 接口未添加
[Authorize]属性,授权验证流程未触发,任意有效JWT都能绕过Scope校验访问接口 - 原生
AddJwtBearer不会自动处理[RequiredScope]的验证逻辑,需使用专门的扩展方法
修复步骤
1. 确认安装Microsoft.Identity.Web包
如果项目未安装,在NuGet控制台执行:
Install-Package Microsoft.Identity.Web
2. 替换服务配置为AddMicrosoftIdentityWebApi
该方法会自动完成JWT验证、Scope解析及授权策略注册,替代原生AddJwtBearer:
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddMicrosoftIdentityWebApi(builder.Configuration.GetSection("AzureAd")); // 保留此方法,注册RequiredScope的授权处理逻辑 builder.Services.AddRequiredScopeAuthorization(); // 可选:配置全局授权策略,避免每个接口重复写[Authorize] builder.Services.AddAuthorization(options => { options.FallbackPolicy = new AuthorizationPolicyBuilder() .RequireAuthenticatedUser() .Build(); });
3. 给接口添加[Authorize]属性
缺少该属性时,授权验证流程不会启动,[RequiredScope]规则完全失效:
[HttpGet] [Route("onlyfortestscope")] [Authorize] [RequiredScope("TestScope")] public string OnlyForTestScope() { return "You have access to this API"; }
4. 核对AzureAd配置
确保appsettings.json中的Audience与令牌的aud声明一致:
"AzureAd": { "Instance": "https://login.microsoftonline.com/", "TenantId": "你的租户ID", "ClientId": "API的客户端ID", "Audience": "api://API的客户端ID" }
5. 处理短名称Scope(可选)
如果令牌中的Scope是短名称(如TestScope而非完整URI格式),添加配置允许短名称校验:
builder.Services.Configure<MicrosoftIdentityOptions>(options => { options.ScopeValidationOptions = new ScopeValidationOptions { AllowShortNames = true }; });
验证效果
修改完成后,未携带TestScope的有效JWT会返回403 Forbidden,只有包含该Scope的令牌才能成功访问接口。
内容的提问来源于stack exchange,提问作者user2243747
相关产品推荐
相关产品推荐

