在ASP.NET Core中从IdentityServer获取到重复Claims的问题求助
用户存储中角色重复关联
检查IdentityServer的用户数据存储(如数据库),确认该用户是否被多次关联了“admin”角色。比如AspNetUserRoles表中存在多条同一用户与同一角色的关联记录,导致生成Token时自动包含重复的角色Claim。客户端Claim映射规则重复配置
在ASP.NET Core客户端的OpenID Connect配置中,可能重复设置了角色Claim的映射逻辑。比如多次调用ClaimActions.MapJsonKey处理角色字段,或者同时启用了默认角色映射和自定义映射,导致Token中的角色被多次解析并添加到用户Claims集合。错误配置示例:
services.AddAuthentication() .AddOpenIdConnect("oidc", options => { // 重复映射角色Claim options.ClaimActions.MapJsonKey(ClaimTypes.Role, "role"); options.ClaimActions.MapJsonKey(ClaimTypes.Role, "roles"); });IdentityServer的ApiScope/ApiResource配置重复包含角色
若在IdentityServer的ApiScope或ApiResource定义中,重复添加了角色Claim的包含规则(比如同时在UserClaims和AllowedUserClaims中配置角色,或多个ApiResource都包含该角色),会导致Token生成时重复写入角色Claim。Claims转换逻辑重复执行
ASP.NET Core中,若重复注册了自定义IClaimsTransformation中间件,或角色相关的中间件被多次添加,会导致每次请求时重复将“admin”角色Claim添加到用户身份中。比如多次调用services.AddScoped<IClaimsTransformation, CustomClaimsTransformer>()。JWT Token本身包含重复Claim
解码IdentityServer返回的JWT Token(可使用本地工具或在线JWT解析器),检查Payload中是否已经存在重复的“admin”角色Claim。若Token本身就有重复,问题出在IdentityServer的Token生成环节;若Token中仅存在一个,但客户端解析后出现重复,则问题在客户端的Claim处理逻辑。自定义ProfileService重复添加Claim
实现IProfileService时,若在GetProfileDataAsync方法中未判断Claim是否已存在就重复添加,会导致生成的Token包含重复角色。比如多次调用context.IssuedClaims.Add(new Claim(ClaimTypes.Role, "admin"))。
内容的提问来源于stack exchange,提问作者user20291437

