Blazor WebAssembly多角色用户登录时角色声明重复键报错求助
问题根因
报错触发的核心原因是服务端AuthController的CurrentUserInfo方法第87行,调用ToDictionary转换用户声明集合时,多角色用户会返回多条键为http://schemas.microsoft.com/ws/2008/06/identity/claims/role的声明,而字典结构不允许重复键存在,因此抛出重复键异常。
修复方案
推荐两种可行方案,根据你的业务需求选择即可:
方案1:合并重复键值(适配现有字典结构)
如果不想调整CurrentUser类的Claims属性的字典类型,直接修改服务端ToDictionary的逻辑,对重复键的多个值用逗号合并:
// 替换你CurrentUserInfo方法中原ToDictionary的代码 var userClaims = User.Claims .GroupBy(c => c.Type) .ToDictionary( group => group.Key, group => string.Join(',', group.Select(c => c.Value)) );
同时需要修改前端CustomStateProvider中声明拼接的逻辑,把合并的角色拆分为独立的声明,保证角色鉴权逻辑正常:
.Concat(_currentUser.Claims.SelectMany(c => { // 角色声明单独处理,按逗号拆分生成多个独立Claim if (c.Key == ClaimTypes.Role) { return c.Value.Split(',', StringSplitOptions.RemoveEmptyEntries) .Select(role => new Claim(c.Key, role)); } return new[] { new Claim(c.Key, c.Value) }; }))
方案2:调整Claims存储结构(更推荐)
直接修改CurrentUser类的Claims属性类型,从Dictionary<string, string>改为List<KeyValuePair<string, string>>,从根源避免重复键冲突:
- 服务端
CurrentUserInfo方法中不需要做分组合并,直接转换为列表即可:
var userClaims = User.Claims .Select(c => new KeyValuePair<string, string>(c.Type, c.Value)) .ToList();
- 前端
CustomStateProvider的原有拼接逻辑不需要额外修改,可直接正常运行。
验证
修改完成后,给测试用户分配2个及以上角色,重新执行登录操作,确认不再抛出重复键异常,且基于角色的鉴权逻辑正常生效。
内容的提问来源于stack exchange,提问作者zekad noureddine
相关产品推荐
相关产品推荐

