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

ASP.NET Core Web API如何同时授权客户端应用与守护程序应用?

解决方案

要同时支持带用户的客户端应用和无用户的守护程序访问Web API,核心是区分用户上下文与客户端上下文的授权逻辑,通过「逻辑或」的方式让两种场景都能满足授权策略。以下是具体实现步骤:

1. 调整授权策略逻辑

修改ASP.NET Core的授权配置,让AssetPolicy策略允许两种情况之一通过:

  • 带用户的请求:拥有AssetAdmin声明且作用域符合要求;
  • 守护程序请求(客户端凭证流):客户端本身拥有管理员权限声明且作用域符合要求。

代码示例:

services.AddAuthorization(options =>
{
    options.AddPolicy("AssetPolicy", policy =>
    {
        // 强制要求所有请求必须具备指定作用域
        policy.Requirements.Add(new ApiScopeRequirement("AssetServicFullScope"));

        // 自定义断言:满足用户权限 或 客户端权限即可
        policy.RequireAssertion(context =>
        {
            // 场景1:带用户的请求,检查用户的AssetAdmin声明
            bool hasUserAdminClaim = context.User.HasClaim(
                c => c.Type == "AssetAdmin" && 
                     c.Value.Equals("true", StringComparison.OrdinalIgnoreCase));

            // 场景2:守护程序请求,检查客户端的管理员角色声明
            bool hasClientAdminClaim = context.User.HasClaim(
                c => c.Type == "client_role" && 
                     c.Value == "AssetAdminClient");

            return hasUserAdminClaim || hasClientAdminClaim;
        });
    });
});

2. 给守护程序客户端配置权限声明

在OpenIddict的客户端注册流程中,为守护程序添加专属的权限声明(比如client_role: AssetAdminClient),确保客户端凭证令牌中包含该声明:

await manager.CreateAsync(new OpenIddictApplicationDescriptor
{
    ClientId = "daemon-asset-service",
    ClientSecret = "your-daemon-secret",
    ClientType = OpenIddictClientType.Confidential,
    Permissions =
    {
        OpenIddictConstants.Permissions.Endpoints.Token,
        OpenIddictConstants.Permissions.GrantTypes.ClientCredentials,
        "AssetServicFullScope"
    },
    // 添加客户端专属的管理员角色声明
    Claims = { new Claim("client_role", "AssetAdminClient") }
});

3. 验证令牌包含客户端声明

确保OpenIddict在颁发客户端凭证令牌时,会将客户端注册时的声明包含在内。默认配置下,客户端声明会自动添加到令牌中,若有自定义需求,可通过OpenIddictServerBuilder.AddEventHandler扩展点调整令牌生成逻辑。

核心思路说明

客户端凭证流的访问令牌中没有用户相关信息,只有客户端的身份数据。通过在策略中加入「用户权限」或「客户端权限」的逻辑判断,就能同时兼容两种访问场景,无需拆分策略或修改API的授权标注。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 10:25:23