首先针对上一次的密码登录做一个补充说明,我们知道在控制器方法汇总使用过滤器[UserAuthorize]做为登录验证非常方便,验证是否成功,然后进行页面跳转,如果验证不成功我要给他们设定一个跳转页面,我们需要在config中做如下配置:
<authentication mode="Forms">
<forms loginUrl="~/SysComUser/UserLogin" timeout="2880" />
</authentication>
修改loginUrl跳转的页面即可。
用户登录密码修改步骤如下:
一、模板的定义
/// <summary>
/// 修改密码
/// </summary>
[NotMapped]
public class SysComUserPassword
{
/// <summary>
/// 原密码
/// </summary>
[Display(Name="原密码",Description="6-20字符")]
[Required(ErrorMessage="×")]
[StringLength(20,MinimumLength=6,ErrorMessage="×")]
[DataType(DataType.Password)]
public string Password { get; set; }
/// <summary>
/// 新密码
/// </summary>
[Display(Name="新密码",Description="6-20字符")]
[Required(ErrorMessage="×")]
[StringLength(20,MinimumLength=6,ErrorMessage="×")]
[DataType(DataType.Password)]
public string NewPassword { get; set; }
/// <summary>
/// 确认密码
/// </summary>
[Display(Name = "确认密码", Description = "再次输入密码")]
[Compare("NewPassword", ErrorMessage = "×")]
[DataType(DataType.Password)]
public string RNewPassword { get; set; }
}
二、Contraller的Action编写
/// <summary>
/// 修改密码页面
/// </summary>
/// <returns></returns>
[UserAuthorize]
public ActionResult UserChangePassword()
{
return View();
}
/// <summary>
/// 修改密码数据
/// </summary>
/// <param name="userPassword">修改密码实体数据</param>
/// <returns>URL</returns>
[HttpPost]
[UserAuthorize]//Extensionsh中对UserAuthorizeAttribute扩展重写AuthorizeCore():表示这是一个只处理那些通过身份验证的URL请求,如果没有通过身份验证就请求这个Action会被带到登录页面。
public ActionResult UserChangePassword(SysComUserPassword userPassword)
{
int _rnum = userRpy.Authentication(LoginName, userPassword.Password);
if (_rnum == 0)
{
//读取用户信息
var _user = userRpy.Find(LoginName);
if (_user == null)
{
ModelState.AddModelError("Message", "该用户已经失效,请重新登录!");
return View();
}
else
{
_user.Password = userPassword.NewPassword;
if (userRpy.Update(_user))
{
ModelState.AddModelError("Message", "修改成功!");
return View();
}
else
{
ModelState.AddModelError("Message", "更新数据库失败!");
return View();
}
}
}
else
{
ModelState.AddModelError("Message", "原密码不正确,请重新输入!");
return View();
}
}
public string LoginName
{
get
{
HttpCookie _cookie = HttpContext.Request.Cookies["user"];
if (_cookie == null) return "";
else return _cookie["loginname"];
}
}
在这里增加Public string LoginName属性,主要用于从cookie中读取登录名称。重要方法有以下几个:
1、 验证原始的登录名和密码是否正确,尽管我们[UserAuthorize]做了一次身份验证,但是这里目标是为了让用户重新输入一次原始密码进行验证,否则是不允许修改的:
userRpy.Authentication(LoginName, userPassword.Password);
2、 读取当前登录名在数据库的全部信息:
var user = userRpy.Find(LoginName)
3、将新设置的密码赋给读取后的实体对象,并作更新:
_user.Password = userPassword.NewPassword;
userRpy.Update(_user))
三、业务逻辑层的方法定义
1、修改一条用户信息
/// <summary>
/// 修改一条用户信息
/// </summary>
/// <param name="Tmodel">用户数据模型</param>
/// <returns>布尔值</returns>
public override bool Update(SysComUser Tmodel)
{
//if (Tmodel == null) { return false; }
//var _tmodel = HillstoneContext.SysComUser.FirstOrDefault(u => u.UserId == Tmodel.UserId);
//if (_tmodel == null) { return false; }
//_tmodel = Tmodel;
//if (HillstoneContext.SaveChanges() > 0)
dbContext.SysComUser.Attach(Tmodel);
dbContext.Entry<SysComUser>(Tmodel).State = EntityState.Modified;
if (dbContext.SaveChanges() > 0) return true;
else return false;
}
1)、SysComUser.Attach(Tmodel);
将给定实体附加到集的基础上下文中,用于在上下文中重新填充数据库中已存在的实体,如果与数据库中的实体对比未有改变,则 Attach 不执行任何操作。
2)、 dbContext.Entry<SysComUser>(Tmodel).State = EntityState.Modified;
对象上的一个标量属性已修改,但尚未调用 SaveChanges 方法。在保存更改后,对象状态更改为 Unchanged。
2、修改用户密码,需要从数据读取用户实体信息,将修改后的密码赋给这个实体。读取方法如下:
/// <summary>
/// 查找登录用户信息
/// </summary>
/// <param name="LoginName">登录名</param>
/// <returns>用户信息</returns>
public SysComUser Find(string LoginName)
{
var _user = dbContext.SysComUser.SingleOrDefault(u => u.LoginName == LoginName);
return _user;
}
3、原始密码验证方法
/// <summary>
/// 用户登录身份验证
/// </summary>
/// <param name="loginName">登录名</param>
/// <param name="password">密码</param>
/// <returns>0:登录成功;1:登录名不存在;2:密码错误</returns>
public int Authentication(string loginName, string password)
{
var _user = dbContext.SysComUser.SingleOrDefault(u => u.LoginName == loginName);
if (_user == null) { return 1; }
if (_user.Password != password) { return 2; }
return 0;
}
四、VIEW页面代码,自动生成后做个简单调整
@model Hillstone.Models.SysComUserPassword
@{
ViewBag.Title = "修改密码";
Layout = "~/Views/Shared/_Layout.cshtml";
}
<h3>修改密码</h3>
@using (Html.BeginForm()) {
@Html.AntiForgeryToken()
@Html.ValidationSummary(true)
<fieldset>
<legend>SysComUserPassword</legend>
<div class="editor-label">
@Html.LabelFor(model => model.Password)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Password)
@Html.ValidationMessageFor(model => model.Password)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.NewPassword)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.NewPassword)
@Html.ValidationMessageFor(model => model.NewPassword)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.RNewPassword)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.RNewPassword)
@Html.ValidationMessageFor(model => model.RNewPassword)
</div>
<p>
<input type="submit" value="Save" />@Html.ValidationMessage("Message")
</p>
</fieldset>
}
<div>
@Html.ActionLink("Back to List", "Index")
</div>
@section Scripts {
@Scripts.Render("~/bundles/jqueryval")
}
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。