MASA.Framework icon indicating copy to clipboard operation
MASA.Framework copied to clipboard

使用Masa.Contrib.Authentication.Identity时用户Claim是集合时解析异常

Open magiboys opened this issue 2 years ago • 0 comments

Description

我的jwt token由IdentityServer4生成的, 当用户角色只有一个时,数据是这样的 { "sub": "0f974b04-e32b-0210-f57b-3a0e1510e1ec", "role": "admin", } 多个角色时是 { "sub": "0f974b04-e32b-0210-f57b-3a0e1510e1ec", "role": ["admin","test"], } 但是现在Masa.Contrib.Authentication.Identity解析角色时报异常, 原因是在DefaultUserContext中 foreach (var property in userType.GetProperties()) { var claimType = _optionsMonitor.CurrentValue.GetClaimType(property.Name); if (claimType == null) continue;

        var claimValue = ClaimsPrincipal?.FindClaimValue(claimType);//这里只取了第一个声明,并且是字符串
        if (claimValue != null)
        {
            modelRelation.Setters[property]
                .Invoke(userModel, new[] { TypeConvertProvider.ConvertTo(claimValue, property.PropertyType) });//执行到这时,因为是字符串,不能反序列化成string[]而报错
        }
    }
    

我只有让token生成为 { "sub": "0f974b04-e32b-0210-f57b-3a0e1510e1ec", "role": "["admin","test"]", } 才能正常运行, 但我觉得这不符合jwt规范

Reproduction Steps

No response

Expected behavior

当token 单角色是 { "sub": "0f974b04-e32b-0210-f57b-3a0e1510e1ec", "role": "admin", } 多个角色时是 { "sub": "0f974b04-e32b-0210-f57b-3a0e1510e1ec", "role": ["admin","test"], } 能正确解析role

Actual behavior

No response

Known Workarounds

我现在只能自定义DefaultUserContext,并替换下面代码使程序正常运行 string? claimValue=null; if (typeof(IEnumerable).IsAssignableFrom(property.PropertyType) && property.PropertyType != typeof(string)) { var values = ClaimsPrincipal?.Claims.Where(p => p.Type == claimType).Select(p => p.Value); if (values != null && values.Count() > 0) { claimValue=JsonSerializer.Serialize(values); } } else { claimValue=ClaimsPrincipal?.FindClaimValue(claimType); }

.NET version

6.0

MASA Framework version

1.0.1

Other information

No response

magiboys avatar Oct 07 '23 06:10 magiboys