.NET Core 7应用账户验证时出现“Invalid Token”问题排查
检查用户实体的SecurityStamp是否在生成token后被修改
Identity生成邮箱确认token时会关联用户的SecurityStamp,若生成token后用户的SecurityStamp发生变更(比如修改密码、更新个人信息触发了SecurityStamp更新),之前的token会直接失效。可以在生成token前和验证前分别输出user.SecurityStamp的值,确认二者是否完全一致。验证token在URL传递过程中是否被破坏
即使使用了Base64UrlEncode,部分邮件客户端或浏览器可能对URL参数进行额外转义或截断。在验证端先获取原始的token参数值(比如Request.Query["token"]),对比生成时的Base64Url编码字符串,确认二者完全一致,没有字符替换或长度变化。检查用户的
EmailConfirmed字段状态
如果用户的EmailConfirmed已经是true,调用ConfirmEmailAsync会直接返回失败。验证前先检查该字段的值,确认是否被意外设置为已确认状态。确认Identity的TokenProvider配置一致性
若项目中自定义过TokenProvider(比如在启动配置中修改了AddIdentity的TokenProvider参数),要确保生成和验证token时使用的是同一个Provider。检查启动代码中是否有类似AddTokenProvider<CustomEmailConfirmationTokenProvider>(TokenOptions.DefaultEmailProvider)的配置,且生成/验证逻辑未指定错误的Provider。排查字符串编码的隐藏问题
虽然调试时解码后token一致,但可尝试跳过Base64Url编码环节,直接传递原始token进行验证测试,以此排除编码/解码过程中可能存在的特殊字符处理问题。查看
IdentityResult的详细错误信息
不要仅通过Success判断结果,输出result.Errors中的具体错误内容(比如token过期、无效等),这能直接定位问题的核心原因。
内容的提问来源于stack exchange,提问作者jstuardo

