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
相关产品推荐
相关产品推荐

