在C#应用中集成AWS Cognito与Identity Server时缺失Claims问题
解决C#客户端集成AWS Cognito与Identity Server后Claims缺失问题
以下是几个排查和解决方向,按优先级推进:
检查Identity Server的Claims转发配置
Identity Server不会默认把从Cognito拿到的所有Claims都传给客户端,得手动指定要传递的字段:- 先确认客户端配置的
AllowedClaims列表里包含"email"; - 如果使用了自定义
ProfileService,要在GetProfileDataAsync方法里,把context.Subject.Claims中的email Claim添加到context.IssuedClaims集合,否则签发令牌时会漏掉该字段。示例代码:public async Task GetProfileDataAsync(ProfileDataRequestContext context) { var emailClaim = context.Subject.FindFirst(ClaimTypes.Email); if (emailClaim != null) { context.IssuedClaims.Add(emailClaim); } // 其他Claims处理逻辑... }
- 先确认客户端配置的
验证客户端的Scope请求
C#客户端必须请求包含email权限的Scope,Identity Server才会把这个Claim放进令牌。检查客户端的OpenID Connect配置,确保Scope中添加了"email":services.AddAuthentication(options => { // 其他配置... }) .AddOpenIdConnect(options => { // 其他配置... options.Scope.Add("openid"); options.Scope.Add("email"); // 必须添加该Scope });检查客户端的Claims解析规则
ASP.NET Core认证库可能对JWT中的Claims做映射或过滤,要确保客户端正确解析email字段:- 开启从UserInfo端点获取Claims:
options.GetClaimsFromUserInfoEndpoint = true; - 手动映射email字段到标准Claim类型:
options.ClaimActions.MapJsonKey(ClaimTypes.Email, "email"); - 检查
TokenValidationParameters,避免设置会过滤Claims的规则,比如仅保留必要的验证项如ValidateLifetime。
- 开启从UserInfo端点获取Claims:
确认Identity Server的令牌签发设置
如果使用id_token,检查客户端配置的AlwaysIncludeUserClaimsInIdToken是否设为true(默认id_token不会包含所有用户Claims);如果使用access_token,要确保对应Scope配置了IncludeAllClaimsForUser = true,或者客户端允许通过浏览器获取access_token。
内容的提问来源于stack exchange,提问作者levis84
相关产品推荐
相关产品推荐

