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

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实例:

  1. 定义DTO类:
public class SignInResultDto
{
    public bool Succeeded { get; set; }
    public bool IsLockedOut { get; set; }
    public bool IsNotAllowed { get; set; }
    public bool RequiresTwoFactor { get; set; }
}
  1. 反序列化并转换:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 15:55:56