C# 重置密码功能不支持';不要使用链接中的代码
我有一个旧的MVC网站,我正在看。我不理解我的帐户控制器中的以下代码。(我相信这是ASP.NET生成的代码。) 控制器C# 重置密码功能不支持';不要使用链接中的代码,c#,asp.net,model-view-controller,asp.net-identity,C#,Asp.net,Model View Controller,Asp.net Identity,我有一个旧的MVC网站,我正在看。我不理解我的帐户控制器中的以下代码。(我相信这是ASP.NET生成的代码。) 控制器 // // GET: /Account/ResetPassword [AllowAnonymous] public ActionResult ResetPassword(string code) { return code == null ? View("Error") : View(); } // // POST: /Account/ResetP
//
// GET: /Account/ResetPassword
[AllowAnonymous]
public ActionResult ResetPassword(string code)
{
return code == null ? View("Error") : View();
}
//
// POST: /Account/ResetPassword
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> ResetPassword(ResetPasswordViewModel model)
{
if (!ModelState.IsValid)
{
return View(model);
}
var user = await UserManager.FindByNameAsync(model.Email);
if (user == null)
{
// Don't reveal that the user does not exist
return RedirectToAction("ResetPasswordConfirmation", "Account");
}
var result = await UserManager.ResetPasswordAsync(user.Id, model.Code, model.Password);
if (result.Succeeded)
{
return RedirectToAction("ResetPasswordConfirmation", "Account");
}
AddErrors(result);
return View();
}
//
//获取:/Account/ResetPassword
[异名]
公共操作结果重置密码(字符串代码)
{
返回代码==null?视图(“错误”):视图();
}
//
//POST:/Account/ResetPassword
[HttpPost]
[异名]
[ValidateAntiForgeryToken]
公共异步任务ResetPassword(ResetPasswordViewModel模型)
{
如果(!ModelState.IsValid)
{
返回视图(模型);
}
var user=await UserManager.FindByNameAsync(model.Email);
if(user==null)
{
//不要透露用户不存在
返回重定向操作(“重置密码确认”、“帐户”);
}
var result=await UserManager.ResetPasswordAsync(user.Id、model.Code、model.Password);
if(result.successed)
{
返回重定向操作(“重置密码确认”、“帐户”);
}
加法器(结果);
返回视图();
}
查看
@model OnBoard101.Models.ResetPasswordViewModel
@{
ViewBag.Title = "Reset password";
}
<h2>@ViewBag.Title</h2>
@using (Html.BeginForm("ResetPassword", "Account", FormMethod.Post, new { @class = "form-horizontal", role = "form" }))
{
@Html.AntiForgeryToken()
<h4>Reset your password</h4>
<hr />
@Html.ValidationSummary("", new { @class = "text-danger" })
@Html.HiddenFor(model => model.Code)
<div class="form-group">
@Html.LabelFor(m => m.Email, new { @class = "col-md-2 control-label" })
<div class="col-md-10">
@Html.TextBoxFor(m => m.Email, new { @class = "form-control" })
</div>
</div>
<div class="form-group">
@Html.LabelFor(m => m.Password, new { @class = "col-md-2 control-label" })
<div class="col-md-10">
@Html.PasswordFor(m => m.Password, new { @class = "form-control" })
</div>
</div>
<div class="form-group">
@Html.LabelFor(m => m.ConfirmPassword, new { @class = "col-md-2 control-label" })
<div class="col-md-10">
@Html.PasswordFor(m => m.ConfirmPassword, new { @class = "form-control" })
</div>
</div>
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<input type="submit" class="btn btn-success" value="Reset" />
</div>
</div>
}
@section Scripts {
@Scripts.Render("~/bundles/jqueryval")
}
@model OnBoard101.Models.ResetPasswordViewModel
@{
ViewBag.Title=“重置密码”;
}
@视图包。标题
@使用(Html.BeginForm(“ResetPassword”,“Account”,FormMethod.Post,new{@class=“form horizontal”,role=“form”}))
{
@Html.AntiForgeryToken()
重置密码
@Html.ValidationSummary(“,new{@class=“text danger”})
@Html.HiddenFor(model=>model.Code)
@LabelFor(m=>m.Email,新的{@class=“col-md-2控制标签”})
@TextBoxFor(m=>m.Email,新的{@class=“form control”})
@LabelFor(m=>m.Password,新的{@class=“col-md-2控制标签”})
@Html.PasswordFor(m=>m.Password,新的{@class=“form control”})
@LabelFor(m=>m.ConfirmPassword,新的{@class=“col-md-2控制标签”})
@Html.PasswordFor(m=>m.ConfirmPassword,new{@class=“form control”})
}
@节脚本{
@Scripts.Render(“~/bundles/jqueryval”)
}
当用户使用忘记密码功能,然后单击电子邮件中发送给他们的链接时,将调用这些方法
据我所知,POST处理程序正确地检测到链接中的无效代码(当代码不是值时,它会生成无效令牌错误)。但我不明白怎么做。GET处理程序似乎只是放弃code
参数
我不明白这个代码是怎么工作的。
model.code
是如何填充的?重置密码功能使用链接中的代码
模型绑定从各种源(如路由数据、表单字段和查询字符串)检索数据
它检查查询字符串参数,以匹配视图使用的模型上的属性
虽然控制器GET操作可能会丢弃code
,但code
仍然是请求的一部分,并由视图使用
由于视图显式绑定到模型
@model OnBoard101.Models.ResetPasswordViewModel
具有匹配的publiccode
属性(不区分大小写)
它将在获取期间将其绑定到视图中的模型,然后使用它(模型)填充隐藏的表单字段(如视图标记中所示)
因此,现在提交表单时,POST操作将该字段绑定到发布回操作的模型,并执行验证
同样的情况也可以通过以下方式实现:
// GET: /Account/ResetPassword
[AllowAnonymous]
public ActionResult ResetPassword(string code) {
if (code == null) return View("Error");
var model = new ResetPasswordViewModel {
Code = code
};
return View(model);
}
但是,由于内置的模型绑定功能将在没有提供模型的情况下初始化模型,因此上述代码实际上没有添加任何额外的内容来完成框架的开箱即用功能。这看起来确实是一种奇怪的方法。如果您只是在GET阶段检查代码是否不为null,那么可以使用随机字符串作为查询参数调用它,它只返回视图。当POST发生时,
model.code
是否存在?@Marianoloisvilla:我发现如果代码无效,POST方法实际上会给出一个错误。但我不知道它是如何访问这些代码的。也许有一些自定义的基本控制器或属性在执行传递?查看ResetPassword
视图应该可以清楚地知道代码放在哪里。我很确定get的查询字符串会保留在post中。您能检查生成的嵌入表单的操作url吗?我在开始使用旧mvc框架和时就遇到了这个问题。urlbuilder也使用现有的路由值(如果是相同的路由),如果有匹配的参数,则从查询字符串和主体填充模型。这很好!尽管显式地传递代码会使维护阶段更容易理解,IMO。谢谢。尽管视图绑定到一个模型,但我总是觉得它是一个空模型,除非我为视图提供了一个模型实例。我不知道视图会从查询字符串中收集数据。
@Html.HiddenFor(model => model.Code)
// GET: /Account/ResetPassword
[AllowAnonymous]
public ActionResult ResetPassword(string code) {
if (code == null) return View("Error");
var model = new ResetPasswordViewModel {
Code = code
};
return View(model);
}