为什么ServiceStack.Auth的PopulateFromMap无法正确反序列化带转义的JSON值
ServiceStack PopulateFromMap 反序列化转义字符异常原因
根本原因
- ServiceStack 中的
JsonObject是轻量JSON解析工具,本质继承自Dictionary<string, string>,解析完成后存储的键值对是JSON片段的原始字符串,没有完成全量的JSON转义反序列化处理。 PopulateFromMap方法的内部逻辑是通过反射直接把字典中的字符串值赋值给会话对象的对应属性,全程没有调用ServiceStack.Text的标准反序列化逻辑处理转义字符,因此JWT payload中用来表示单个反斜杠的转义序列\\,会被直接当作两个独立的字符赋值给UserName属性,最终得到的就是不符合预期的带双反斜杠的结果。- 你测试代码中用到的
JsonObject.Get<string>()方法才会触发内置的字符串转义处理逻辑,会自动将JSON转义序列转换为实际对应的字符,这也是直接调用该方法可以得到预期值,而使用PopulateFromMap不行的核心差异。
临时修复方案
你可以在获取会话对象后手动替换双反斜杠为单反斜杠,或者直接从JWT payload中通过Get<string>("preferred_username")获取正确转义的用户名后再手动赋值给会话属性。
内容的提问来源于stack exchange,提问作者Robin Bouwmeester
相关产品推荐
相关产品推荐

