我在ASP.NET MVC3的应用程序中工作,我试图用户可以更改他的密码,但我不知道为什么我的代码不起作用。 在这里,我附上你的代码。
模特课程:
public class CambioContraseña
{
[Required]
[DataType(DataType.Password)]
[Display(Name = "Contraseña actual")]
public string ContraseñaVieja { get; set; }
[Required]
[StringLength(100, ErrorMessage = "La contraseña debe tener un minimo de 6 caracteres.", MinimumLength = 6)]
[DataType(DataType.Password)]
[Display(Name = "Contraseña nueva")]
public string ContraseñaNueva { get; set; }
[Required]
[DataType(DataType.Password)]
[Display(Name = "Confirma nueva contraseña")]
[Compare("ContraseñaNueva", ErrorMessage = "La nueva contraseña y la contraseña de confirmación no coinciden.")]
public string ConfirmarContraseñaNueva { get; set; }
}
控制器类:
[Authorize]
public ActionResult CambiarContraseña()
{
return View();
}
//
// POST: /Account/ChangePassword
[Authorize]
[HttpPost]
public ActionResult CambiarContraseña(CambioContraseña model)
{
if (ModelState.IsValid)
{
LogOn logon = new LogOn();
Registro registro = new Registro();
// ChangePassword will throw an exception rather
// than return false in certain failure scenarios.
bool cambioContraseñaCorrecto;
try
{
//MembershipUser usuarioActual = Membership.GetUser(User.Identity.Name, true /* userIsOnline */);
//cambioContraseñaCorrecto = usuarioActual.ChangePassword(model.ContraseñaVieja, model.ContraseñaNueva);
cambioContraseñaCorrecto = logon.ExisteUsuario(registro.idUsuario);
SqlConnection connection = new SqlConnection(
System.Configuration.ConfigurationManager.ConnectionStrings["cs"].ConnectionString);
connection.Open();
SqlCommand command = new SqlCommand("update Usuario set contraseña='" + model.ContraseñaNueva + "' where idUsuario='" + registro.idUsuario + "'", connection);
object comandoRetorno = command.ExecuteScalar();
connection.Close();
}
catch (Exception)
{
cambioContraseñaCorrecto = false;
}
if (cambioContraseñaCorrecto)
{
return RedirectToAction("CambioContraseñaCorrecto");
}
else
{
ModelState.AddModelError("", "La actual contraseña es inválida o la nueva contraseña es incorrecta.");
}
}
// If we got this far, something failed, redisplay form
return View(model);
}
查看课程:
@model FutbookPFC.Models.CambioContraseña
@{
ViewBag.Title = "Futbook / Configuración";
Layout = "~/Views/Shared/_LayoutGenerico.cshtml";
}
<h2>CambiarContraseña</h2>
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"> </script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
@using (Html.BeginForm()) {
@Html.ValidationSummary(true, "Cambio de contraseña incorrecto. Por favor, corrige los errores e intentelo de nuevo.")
<div>
<fieldset>
<legend>Contraseña</legend>
<div class="editor-label">
@Html.LabelFor(m => m.ContraseñaVieja)
</div>
<div class="editor-field">
@Html.PasswordFor(m => m.ContraseñaVieja)
@Html.ValidationMessageFor(m => m.ContraseñaVieja)
</div>
<div class="editor-label">
@Html.LabelFor(m => m.ContraseñaNueva)
</div>
<div class="editor-field">
@Html.PasswordFor(m => m.ContraseñaNueva)
@Html.ValidationMessageFor(m => m.ContraseñaNueva)
</div>
<div class="editor-label">
@Html.LabelFor(m => m.ConfirmarContraseñaNueva)
</div>
<div class="editor-field">
@Html.PasswordFor(m => m.ConfirmarContraseñaNueva)
@Html.ValidationMessageFor(m => m.ConfirmarContraseñaNueva)
</div>
<p>
<input type="submit" value="Cambiar Contraseña" />
</p>
</fieldset>
</div>
}
有什么想法解决它吗? 谢谢!
答案 0 :(得分:0)
我的猜测是你在update where语句中使用带有国际字符的名称。 因此,如果用户名保存为varchar(您没有N'),它将找不到任何内容,这意味着它不会更新任何内容。
提示:
Update T_Whatever WHERE Username =
'abcñxyz'.
而不是
Update T_Whatever WHERE Username =
N'abcñxyz“.
PS:
我可以使用SQL注入来创建自己的用户
尝试用户名或密码:d'Alambert。
此外,您应该使用IDbConnection和IDbCommand而不是SqlConnection和SqlCommand,因为否则,您不必在更改数据库后更改SQL。
尝试使用A类作为数据库访问函数。
此外,使用存储过程而不是对SQL字符串进行硬编码 这样,您可以修复SQL错误(例如,提高其性能),而无需在将应用程序部署到生产环境后重新编译它。
另外,您使用registro.idUsuario,而不会将类初始化为默认值以外的其他内容。