溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

四、Asp.Net MVC4.0開發(fā)CMS系統(tǒng)案例之密碼修改模塊開發(fā)

發(fā)布時間:2020-06-23 11:06:33 來源:網(wǎng)絡(luò) 閱讀:1999 作者:sujerhy 欄目:編程語言

    首先針對上一次的密碼登錄做一個補充說明,我們知道在控制器方法匯總使用過濾器[UserAuthorize]做為登錄驗證非常方便,驗證是否成功,然后進行頁面跳轉(zhuǎn),如果驗證不成功我要給他們設(shè)定一個跳轉(zhuǎn)頁面,我們需要在config中做如下配置:

    <authentication mode="Forms">
      <forms loginUrl="~/SysComUser/UserLogin" timeout="2880" />
    </authentication>

修改loginUrl跳轉(zhuǎn)的頁面即可。

    用戶登錄密碼修改步驟如下:

    一、模板的定義

    /// <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>
        /// 修改密碼數(shù)據(jù)
        /// </summary>
        /// <param name="userPassword">修改密碼實體數(shù)據(jù)</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", "該用戶已經(jīng)失效,請重新登錄!");
                    return View();
                }
                else
                {
                    _user.Password = userPassword.NewPassword;
                    if (userRpy.Update(_user))
                    {
                        ModelState.AddModelError("Message", "修改成功!");
                        return View();
                    }
                    else
                    {
                        ModelState.AddModelError("Message", "更新數(shù)據(jù)庫失??!");
                        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]做了一次身份驗證,但是這里目標(biāo)是為了讓用戶重新輸入一次原始密碼進行驗證,否則是不允許修改的:

        userRpy.Authentication(LoginName, userPassword.Password);

        2、 讀取當(dāng)前登錄名在數(shù)據(jù)庫的全部信息:

        var user = userRpy.Find(LoginName)

        3、將新設(shè)置的密碼賦給讀取后的實體對象,并作更新:

        _user.Password = userPassword.NewPassword;
        userRpy.Update(_user))

    三、業(yè)務(wù)邏輯層的方法定義

        1、修改一條用戶信息

        /// <summary>
        /// 修改一條用戶信息
        /// </summary>
        /// <param name="Tmodel">用戶數(shù)據(jù)模型</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);

        將給定實體附加到集的基礎(chǔ)上下文中,用于在上下文中重新填充數(shù)據(jù)庫中已存在的實體,如果與數(shù)據(jù)庫中的實體對比未有改變,則 Attach 不執(zhí)行任何操作。

        2)、 dbContext.Entry<SysComUser>(Tmodel).State = EntityState.Modified;

        對象上的一個標(biāo)量屬性已修改,但尚未調(diào)用 SaveChanges 方法。在保存更改后,對象狀態(tài)更改為 Unchanged。

    2、修改用戶密碼,需要從數(shù)據(jù)讀取用戶實體信息,將修改后的密碼賦給這個實體。讀取方法如下:

        /// <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頁面代碼,自動生成后做個簡單調(diào)整

@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")
}

 

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI