基于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
相关产品推荐
相关产品推荐

