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

基于Amazon Cognito在端点方法内实现用户角色校验的业务逻辑

在Amazon Cognito认证下,端点内校验用户角色并返回对应消息

我正在使用Amazon Cognito进行身份认证与授权,已经可以通过添加特性[Authorize(Policy = "SomeGroup")]限制端点访问,但想知道如何在端点方法内部添加业务逻辑,校验用户是否属于特定角色(比如管理员),并返回对应的提示消息。

示例需求代码:

public static Task<IResult> Test()
{
    if (user is an administrator) 
    {
        return Task.FromResult(Results.BadRequest("admin"));
    }

    return Task.FromResult(Results.Ok("not admin"));
}

实现方案

1. 保留现有Cognito授权配置

你的项目已配置好自定义Cognito组授权逻辑,这部分可继续用于全局端点访问控制,完整配置代码如下:

builder.Services.AddSingleton<IAuthorizationHandler, CognitoGroupAuthorizationHandler>();
builder.Services.AddCognitoIdentity();

builder.Services
    .AddAuthentication(options =>
    {
        options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
        options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
    })
    .AddJwtBearer(options =>
    {
        options.Authority = builder.Configuration["AWSCognito:Authority"];
        options.TokenValidationParameters = new TokenValidationParameters
        {
            ValidateIssuerSigningKey = true,
            ValidateAudience = false
        };
    });

builder.Services.AddAuthorization(options =>
{
    options.DefaultPolicy = new AuthorizationPolicyBuilder(JwtBearerDefaults.AuthenticationScheme).RequireAuthenticatedUser().Build();
    options.AddPolicy("SomeGroup", policy => policy.Requirements.Add(new CognitoGroupAuthorizationRequirement("Example")));
});

public class CognitoGroupAuthorizationHandler : AuthorizationHandler<CognitoGroupAuthorizationRequirement>
{
    protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, CognitoGroupAuthorizationRequirement requirement)
    {
        if (context.User.HasClaim(c => c.Type == "cognito:groups" && c.Value == requirement.CognitoGroup))
        {
            context.Succeed(requirement);
        }
        else
        {
            context.Fail();
        }

        return Task.CompletedTask;
    }
}

public class CognitoGroupAuthorizationRequirement : IAuthorizationRequirement
{
    public CognitoGroupAuthorizationRequirement(string cognitoGroup)
    {
        CognitoGroup = cognitoGroup;
    }

    public string CognitoGroup { get; }
}

2. 在端点内实现角色校验逻辑

ASP.NET Core会自动注入当前登录用户的ClaimsPrincipal,直接通过参数接收即可获取用户的Cognito组声明:

基础实现

public static Task<IResult> Test(ClaimsPrincipal user)
{
    // 校验用户是否属于管理员组(替换为你的Cognito实际组名)
    bool isAdmin = user.HasClaim(c => c.Type == "cognito:groups" && c.Value == "Administrators");

    if (isAdmin)
    {
        return Task.FromResult(Results.BadRequest("admin"));
    }

    return Task.FromResult(Results.Ok("not admin"));
}

复用逻辑封装(可选)

如果需要在多个端点复用角色校验,可封装成扩展方法:

public static class ClaimsPrincipalExtensions
{
    public static bool IsInCognitoGroup(this ClaimsPrincipal user, string groupName)
    {
        return user.HasClaim(c => c.Type == "cognito:groups" && c.Value == groupName);
    }
}

简化端点代码:

public static Task<IResult> Test(ClaimsPrincipal user)
{
    if (user.IsInCognitoGroup("Administrators"))
    {
        return Task.FromResult(Results.BadRequest("admin"));
    }

    return Task.FromResult(Results.Ok("not admin"));
}

3. 关键注意事项

  • 确保Cognito的JWT Token中包含cognito:groups声明(Cognito默认会为用户组添加该声明)
  • 替换代码中的"Administrators"为你实际的Cognito用户组名称

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 20:25:09