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

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>>,从根源避免重复键冲突:

  1. 服务端CurrentUserInfo方法中不需要做分组合并,直接转换为列表即可:
var userClaims = User.Claims
    .Select(c => new KeyValuePair<string, string>(c.Type, c.Value))
    .ToList();
  1. 前端CustomStateProvider的原有拼接逻辑不需要额外修改,可直接正常运行。
验证

修改完成后,给测试用户分配2个及以上角色,重新执行登录操作,确认不再抛出重复键异常,且基于角色的鉴权逻辑正常生效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 22:57:00