JsonSerializer反序列化SignInResult异常:JSON值与结果不符求助
问题分析与解决方案
核心原因
Microsoft.AspNetCore.Identity.SignInResult并非普通的数据传输对象(DTO),它的Succeeded属性是只读计算属性,并非直接映射JSON字段。该属性的返回值取决于当前实例是否为SignInResult.Success这个静态单例,而非反序列化时赋值的字段值。
你反序列化得到的是一个全新的SignInResult实例,即便JSON中succeeded为true,这个新实例也不等于SignInResult.Success,因此Succeeded会返回false。其他属性(如IsLockedOut)能正常匹配,是因为它们是可直接设置的普通属性。
解决方案
不要直接反序列化到SignInResult,而是先定义一个对应的DTO类来接收JSON数据,再转换为SignInResult实例:
- 定义DTO类:
public class SignInResultDto { public bool Succeeded { get; set; } public bool IsLockedOut { get; set; } public bool IsNotAllowed { get; set; } public bool RequiresTwoFactor { get; set; } }
- 反序列化并转换:
string json = await response.Content.ReadAsStringAsync(); var dto = JsonSerializer.Deserialize<SignInResultDto>(json)!; var signInResult = dto.Succeeded ? SignInResult.Success : dto.IsLockedOut ? SignInResult.LockedOut : dto.IsNotAllowed ? SignInResult.NotAllowed : dto.RequiresTwoFactor ? SignInResult.TwoFactorRequired : SignInResult.Failed;
补充说明
你之前代码可能偶然“正常”,是因为当JSON中succeeded为false时,反序列化的实例刚好和SignInResult.Failed的属性值一致,但本质上这是错误的用法——SignInResult设计为通过静态实例(Success/Failed等)来表示登录状态,而非通过反序列化创建实例。
内容的提问来源于stack exchange,提问作者Mike Mastro
相关产品推荐
相关产品推荐

