四、Asp.Net MVC4.0 CMSシステムケースを開発するパスワード修正モジュール開発


まず前回のパスワード登録について補足説明します.コントローラメソッドの要約でフィルタ[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プロパティを追加し、主にクッキーからログイン名を読み込むために使用します.重要な方法は次のとおりです.
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(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";
}
<h2>    </h2>
@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")
}