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

.NET 8升级到.NET 9后邮箱确认功能失效求助

.NET 8升级到.NET 9后邮箱确认链接无法正常工作的问题

问题描述

注册流程中生成邮箱确认令牌和链接的代码如下,直接调用ConfirmEmailAsync能正常完成验证:

var code = await _userManager.GenerateEmailConfirmationTokenAsync(user);
var callbackUrl = Url.Action("confirmemail", "home", new { userId = user.Id, code }, HttpContext.Request.Scheme);

// 这段代码执行后验证成功
var result2 = await _userManager.ConfirmEmailAsync(user, code);

但把生成的callbackUrl复制到浏览器访问时,执行以下代码却无法完成邮箱确认:

var user = await _userManager.FindByIdAsync(userId);

if (user == null)
    return View("Error");

var result = await _userManager.ConfirmEmailAsync(user, code);

可能的原因及解决办法

  • URL编码解码问题
    .NET 9对Url.Action的参数编码逻辑可能有调整,导致浏览器传递过来的code参数被错误解码。可以在接收端先对code做URL解码再验证:

    var decodedCode = System.Web.HttpUtility.UrlDecode(code);
    var result = await _userManager.ConfirmEmailAsync(user, decodedCode);
    

    若是ASP.NET Core项目,也可以用WebUtility.UrlDecode替代。

  • Identity令牌保护配置变更
    .NET 9可能调整了DataProtector的默认配置,导致令牌在HTTP请求上下文和直接调用上下文的验证逻辑不一致。检查项目的Identity配置,确保默认令牌提供者已正确注册:

    builder.Services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
        .AddEntityFrameworkStores<ApplicationDbContext>()
        .AddDefaultTokenProviders();
    

    要是用了分布式DataProtection存储(比如Redis),确认.NET 9中的配置和之前一致,没有遗漏关键设置。

  • 令牌有效期或验证规则调整
    查看Identity的令牌配置,确认邮箱确认令牌的有效期在.NET 9中是否被默认修改:

    builder.Services.Configure<DataProtectionTokenProviderOptions>(options =>
    {
        options.TokenLifespan = TimeSpan.FromHours(24); // 根据需求调整有效期
    });
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 08:15:04