在我的 asp.net mvc 应用程序中,当用户注册时,我会向他们的帐户发送一封电子邮件,其中包含一个验证链接,然后他们才能使用该应用程序。请参阅下面的代码片段。
var emailActionLink = Url.Action("ValidateAccount", "Register",
new { Token = registeredUserViewModel.Id, Username = registeredUserViewModel.Username },
Request.Url.Scheme);
上面的代码片段是他们将点击的内容,然后将调用带有路由值的操作,
验证帐户操作
public ActionResult ValidateAccount(string token, string username)
{
try
{
if (!string.IsNullOrEmpty(token) && !string.IsNullOrEmpty(username))
{
var user = _userServiceClient.IsUserNameAvailable(username);
if (!user.HasValue) throw new NullReferenceException("This account does not exist");
var userContract = user.Value;
userContract.EmailVerified = true;
if (_userServiceClient.UpdateUser(userContract) == null) throw new Exception("Something has gone wrong");
return View("ValidationCompleted");
}
else
{
ViewBag.RegisteredUser = null;
}
}
catch (Exception exception)
{
throw;
}
return View();
}
问题是,这种方法没有验证令牌,如果有人更改token
uri 中的值会发生什么,这仍然会通过并且非常帐户。改进这一点的正确方法是什么。
在这种情况下,token 是用户的 ID,它是一个 Guid,但它是经过编码的,并且无法将我的数据库中的用户 ID 与这个编码的标记进行比较。我认为这是在动作链接中编码的。