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

ASP.NET Core 6.0 Identity:如何向Razor页面传递复杂对象?

ASP.NET Core 6 Identity 传递ApplicationUser对象到LoginWith2fa页面的问题解决

问题根源

RedirectToPage发起的是GET请求,复杂对象(如ApplicationUser)无法通过URL查询字符串直接完成模型绑定——绑定器只会创建对象实例,但不会自动填充其属性。而bool、string这类简单类型能正常绑定,所以你看到rememberMe和returnUrl值正确,但UserSent的属性全为null。

解决方案

方案1:传递用户ID,在目标页面重新查询用户

这是最安全且符合Identity设计规范的方式:

  • 登录页修改代码:
return RedirectToPage("./LoginWith2fa", new 
                                     { 
                                         UserId = user.Id, 
                                         ReturnUrl = returnUrl, 
                                         RememberMe = Input.RememberMe 
                                     });
  • LoginWith2fa页面修改代码:
private readonly UserManager<ApplicationUser> _userManager;

// 通过构造函数注入UserManager
public LoginWith2faModel(UserManager<ApplicationUser> userManager)
{
    _userManager = userManager;
}

public async Task<IActionResult> OnGetAsync(string userId, bool rememberMe, string returnUrl = null)
{
    if (string.IsNullOrEmpty(userId))
    {
        return BadRequest("用户ID不能为空");
    }

    var user = await _userManager.FindByIdAsync(userId);
    if (user == null)
    {
        return NotFound("未找到指定用户");
    }

    // 此处user的所有属性将正常赋值,可继续后续业务逻辑
}

方案2:使用TempData临时存储序列化后的对象

适合不需要持久化、仅重定向场景传递数据:

  • 登录页修改代码:
using System.Text.Json;

// 将用户对象序列化后存入TempData
TempData["ApplicationUser"] = JsonSerializer.Serialize(user);
return RedirectToPage("./LoginWith2fa", new 
                                     { 
                                         ReturnUrl = returnUrl, 
                                         RememberMe = Input.RememberMe 
                                     });
  • LoginWith2fa页面修改代码:
using System.Text.Json;

public async Task<IActionResult> OnGetAsync(bool rememberMe, string returnUrl = null)
{
    if (TempData["ApplicationUser"] == null)
    {
        return BadRequest("未获取到用户信息");
    }

    var user = JsonSerializer.Deserialize<ApplicationUser>(TempData["ApplicationUser"].ToString());
    if (user == null)
    {
        return NotFound("用户信息解析失败");
    }

    // 此处可正常使用user对象
}

注意:如果ApplicationUser存在循环引用,序列化时需配置JsonSerializerOptions忽略循环引用,或仅序列化需要的属性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 01:05:07