Comment puis-je mettre en œuvre un Lien de Réinitialisation de mot de passe

J'ai actuellement un système où, si un utilisateur a oublié son mot de passe, ils peuvent réinitialiser en cliquant sur un lien mot de passe oublié. Ils vont être redirigé vers une page où ils entrent dans leur nom d'utilisateur/e-mail et un email sera envoyé à l'utilisateur, je voulais savoir comment puis-je mettre en œuvre une réinitialisation de mot de passe lien dans le courriel une fois que l'utilisateur clique sur le lien, il est redirigé vers une page qui leur permettra de réinitialiser leur mot de passe.

C'est le code dans mon contrôleur

public ActionResult ForgotPassword()
{
//verify user id
string UserId = Request.Params ["txtUserName"];
string msg = "";
if (UserId == null) 
{
msg = "You Have Entered An Invalid UserId - Try Again";
ViewData["ForgotPassword"] = msg;
return View("ForgotPassword");
}
SqlConnection lsql = null;
lsql = DBFactory.GetInstance().getMyConnection();
String sqlstring = "SELECT * from dbo.[USERS] where USERID = '" + UserId.ToString() + "'";
SqlCommand myCommand = new SqlCommand(sqlstring, lsql);
lsql.Open();
Boolean validUser;         
using (SqlDataReader myReader = myCommand.ExecuteReader())
{
validUser = false;
while (myReader.Read())
{
validUser = true;
}
myReader.Close();
}
myCommand.Dispose();  
if (!validUser) 
{
msg = "You Have Entered An Invalid UserId - Try Again";
ViewData["ForgotPassword"] = msg;
lsql.Close();
return View("ForgotPassword");
}
//run store procedure
using (lsql)
{
SqlCommand cmd = new SqlCommand("Stock_Check_Test.dbo.RESET_PASSWORD", lsql);
cmd.CommandType = CommandType.StoredProcedure;
SqlParameter paramUsername = new SqlParameter("@var1", UserId);
cmd.Parameters.Add(paramUsername);
SqlDataReader rdr = cmd.ExecuteReader();
while (rdr.Read())
{
if (Convert.ToInt32(rdr["RC"]) == 99)
{
msg = "Unable to update password at this time";
ViewData["ForgotPassword"] = msg;
lsql.Close();
return View("ForgotPassword");  
}
}
}
msg = "new password sent";
ViewData["ForgotPassword"] = msg;
lsql.Close();
return View("ForgotPassword");
}

C'est ma procédure stockée qui l'envoie à l'utilisateur un e-mail

ALTER PROCEDURE [dbo].[A_SEND_MAIL]
@var1 varchar (200), -- userid
@var2 varchar (200) -- email address
AS
BEGIN
declare @bodytext varchar(200);
set @bodytext = 'Password Reset for user: ' +@var1 + ' @' + cast (getDate() as varchar) + ' ' ;
EXEC msdb.dbo.sp_send_dbmail 
@profile_name='Test',
@recipients=@var2,
@subject='Password Reset',
@body=@bodytext
END 
GO
  • Vous générez une longue chaîne de caractères aléatoires et de le stocker à côté de l'identifiant utilisateur (et une date d'expiration), naviguez jusqu'à la réinitialisation.aspx?id=longstring et de l'utiliser pour identifier l'utilisateur et d'afficher une page de réinitialisation, de la suppression/invalider la chaîne de caractères en cas de succès.
  • Vous avez besoin de paramétrer TOUTES vos questions. La première requête ici est grande ouverte à l'injection sql. Aussi, vous devriez vraiment spécifier uniquement les colonnes dont vous avez besoin au lieu d'utiliser *.