如何在IdentityServer4资源API控制器中使用自定义Scope?
嘿,我来帮你搞定这个Scope的使用问题!你已经在IdentityServer里配置好了对应的API资源和两个Scope,接下来只需要在你的API项目里做两步简单配置,就能实现基于Scope的接口授权啦:
第一步:确保API项目已配置IdentityServer认证
首先要在你的API项目的Program.cs里配置好IdentityServer的认证中间件,让API能够验证来自IdentityServer的AccessToken:
using Microsoft.AspNetCore.Authentication.JwtBearer; var builder = WebApplication.CreateBuilder(args); // 添加认证服务 builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(options => { options.Authority = "https://your-identityserver-domain"; // 替换成你的IdentityServer实际地址 options.Audience = "socialnetwork"; // 必须和你定义的ApiResource.Name完全一致 }); // 添加授权服务,并定义基于Scope的策略 builder.Services.AddAuthorization(options => { // 定义读取内容的授权策略 options.AddPolicy("RequireReadScope", policy => { policy.RequireAuthenticatedUser(); policy.RequireClaim("scope", "socialnetwork.read_contents"); }); // 定义分享内容的授权策略 options.AddPolicy("RequireWriteScope", policy => { policy.RequireAuthenticatedUser(); policy.RequireClaim("scope", "socialnetwork.share_content"); }); }); // 添加控制器服务 builder.Services.AddControllers(); var app = builder.Build(); // 启用认证和授权中间件(顺序很重要,先认证后授权) app.UseAuthentication(); app.UseAuthorization(); app.MapControllers(); app.Run();
第二步:在控制器Action上绑定授权策略
接下来回到你的SocialController,给对应的Action加上[Authorize]属性,并指定对应的授权策略即可:
public class SocialController : Controller { // 仅允许持有socialnetwork.read_contents Scope的请求访问 [HttpGet] [Authorize(Policy = "RequireReadScope")] public async Task<IActionResult> GetContents() { // 你的读取内容业务逻辑 return Ok(); } // 仅允许持有socialnetwork.share_content Scope的请求访问 [HttpPost] [Authorize(Policy = "RequireWriteScope")] public async Task<IActionResult> ShareContent() { // 你的分享内容业务逻辑 return Ok(); } }
额外小技巧
如果某个接口需要同时拥有多个Scope才能访问,比如既要读又要写,可以新增一个组合策略:
// 在Program.cs的AddAuthorization里添加 options.AddPolicy("RequireReadAndWriteScopes", policy => { policy.RequireAuthenticatedUser(); policy.RequireClaim("scope", "socialnetwork.read_contents", "socialnetwork.share_content"); });
然后在Action上使用:
[Authorize(Policy = "RequireReadAndWriteScopes")]
注意:要确保客户端在请求AccessToken的时候,已经申请了对应的Scope,否则API会返回403 Forbidden哦!
内容的提问来源于stack exchange,提问作者barteloma
相关产品推荐
相关产品推荐

