Microsoftは ASP.NET Identityと呼ばれる新しいメンバーシップシステム (ASP.NET MVC 5のデフォルトでもあります)を考案しています。 サンプルプロジェクト を見つけましたが、これはパスワードリセットを実装していません。
パスワードリセットのトピックについては、次の記事をご覧ください。 1つのASP.NET IDを使用したユーザー確認とパスワードリセットの実装–痛みまたは喜び 。組み込みのパスワード回復を使用しないため、私にとっては助けになりません。
オプションを見ていたので、リセットトークンを生成する必要があると思うので、それをユーザーに送信します。ユーザーはトークンを使用して新しいパスワードを設定し、古いパスワードを上書きできます。
_IdentityManager.Passwords.GenerateResetPasswordToken
_/IdentityManager.Passwords.GenerateResetPasswordTokenAsync(string tokenId, string userName, validUntilUtc)
を見つけましたが、それがtokenId
パラメーターの意味を理解できませんでした。
MVC 5.0でASP.NETにパスワードリセットを実装するにはどうすればよいですか?
わかりました:tokenidは、パスワードオプションを識別する自由に選択されたIDです。例えば、
1。パスワード回復プロセス、ステップ1のように見えます(ベースは https://stackoverflow.com/a/698879/208922 )
[HttpPost]
[ValidateAntiForgeryToken]
[AllowAnonymous]
//[RecaptchaControlMvc.CaptchaValidator]
public virtual async Task<ActionResult> ResetPassword(
ResetPasswordViewModel rpvm)
{
string message = null;
//the token is valid for one day
var until = DateTime.Now.AddDays(1);
//We find the user, as the token can not generate the e-mail address,
//but the name should be.
var db = new Context();
var user = db.Users.SingleOrDefault(x=>x.Email == rpvm.Email);
var token = new StringBuilder();
//Prepare a 10-character random text
using (RNGCryptoServiceProvider
rngCsp = new RNGCryptoServiceProvider())
{
var data = new byte[4];
for (int i = 0; i < 10; i++)
{
//filled with an array of random numbers
rngCsp.GetBytes(data);
//this is converted into a character from A to Z
var randomchar = Convert.ToChar(
//produce a random number
//between 0 and 25
BitConverter.ToUInt32(data, 0) % 26
//Convert.ToInt32('A')==65
+ 65
);
token.Append(randomchar);
}
}
//This will be the password change identifier
//that the user will be sent out
var tokenid = token.ToString();
if (null!=user)
{
//Generating a token
var result = await IdentityManager
.Passwords
.GenerateResetPasswordTokenAsync(
tokenid,
user.UserName,
until
);
if (result.Success)
{
//send the email
...
}
}
message =
"We have sent a password reset request if the email is verified.";
return RedirectToAction(
MVC.Account.ResetPasswordWithToken(
token: string.Empty,
message: message
)
);
}
2そして、ユーザーがトークンと新しいパスワードを入力すると:
[HttpPost]
[ValidateAntiForgeryToken]
[AllowAnonymous]
//[RecaptchaControlMvc.CaptchaValidator]
public virtual async Task<ActionResult> ResetPasswordWithToken(
ResetPasswordWithTokenViewModel
rpwtvm
)
{
if (ModelState.IsValid)
{
string message = null;
//reset the password
var result = await IdentityManager.Passwords.ResetPasswordAsync(
rpwtvm.Token,
rpwtvm.Password
);
if (result.Success)
{
message = "the password has been reset.";
return RedirectToAction(
MVC.Account.ResetPasswordCompleted(message: message)
);
}
else
{
AddErrors(result);
}
}
return View(MVC.Account.ResetPasswordWithToken(rpwtvm));
}
スケルトンの提案 to サンプルプロジェクト githubで、必要な場合はテストすることができます。
多くのトラブルのようです...上記の利点は何ですか:
このフローを使用すると、ドメインからパスワードを送信することはありません。
誰でも、これがどれほど安全でないかを証明してください。