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

IResourceOwnerPasswordValidator中未验证手机号用户登录触发Wrong GrantValidationResult错误原因

关于未验证手机号用户登录触发Wrong GrantValidationResult错误的原因

我之前在基于IdentityServer的项目里处理过类似的问题,咱们来捋捋这个错误的核心原因:

  • 最直接的根源是你的IResourceOwnerPasswordValidator实现逻辑主动拦截了未验证手机号的用户
    这个接口的作用就是自定义「资源所有者密码模式」的验证规则,当你在ValidateAsync方法里完成密码校验后,额外检查了用户的手机号验证状态(比如ASP.NET Identity里的PhoneNumberConfirmed字段),发现用户手机号未验证时,就返回了带有"Wrong"错误信息的GrantValidationResult.Failed()结果,这就触发了你看到的错误。

  • 用"Wrong"作为错误信息通常是出于安全考虑
    很多开发者不会返回具体的错误原因(比如“手机号未验证”),而是统一返回模糊的"Wrong"或"Invalid credentials",避免给攻击者泄露用户状态信息(比如让攻击者知道这个手机号已注册但未验证)。

  • 举个常见的代码示例,你可以检查自己的实现里是不是有类似逻辑:

public async Task ValidateAsync(ResourceOwnerPasswordValidationContext context)
{
    var user = await _userManager.FindByNameAsync(context.UserName);
    if (user == null)
    {
        context.Result = new GrantValidationResult(TokenRequestErrors.InvalidGrant, "Wrong");
        return;
    }

    // 检查手机号验证状态
    if (!user.PhoneNumberConfirmed)
    {
        // 这里就是触发错误的代码
        context.Result = new GrantValidationResult(TokenRequestErrors.InvalidGrant, "Wrong");
        return;
    }

    // 后续密码验证逻辑...
    var passwordValid = await _userManager.CheckPasswordAsync(user, context.Password);
    if (!passwordValid)
    {
        context.Result = new GrantValidationResult(TokenRequestErrors.InvalidGrant, "Wrong");
        return;
    }

    // 验证通过的逻辑...
    context.Result = new GrantValidationResult(user.Id.ToString(), "password");
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 10:42:49