私の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();
}
問題は、このメソッドがトークンを検証していないことです。誰かが uri の値を変更するとどうなるかtoken
、これはまだ合格し、アカウントも同様です。これを改善するための正しいアプローチは何でしょうか。
この場合、トークンは Guid であるユーザーの ID ですが、エンコードされており、データベース内のユーザーの ID をこのエンコードされたトークンと比較する方法はありません。これはアクションリンクにエンコードされていると思います。