私の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とこのエンコードされたトークンを比較する方法はありません。私はこれがアクションリンクでコード化されていると思います。
私は電子メールに送られたURLに実際にユーザーIDが含まれていることを認識しました。私はまだあなたのアプローチが良いと思う、私はすでにDBのEmailVerificationTokenフィールドを持って、これは私がパスワードをハッシュする方法に似ているので、私はあなたのソリューションに満足していると思う。私はそのようなものを使うようにリファクタリングします –