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

如何在IdentityServer4资源API控制器中使用自定义Scope?

在SocialController中使用IdentityServer定义的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:49:00