四、Asp.Net MVC4.0 CMSシステムケースを開発するパスワード修正モジュール開発
まず前回のパスワード登録について補足説明します.コントローラメソッドの要約でフィルタ[UserAuthorize]を使用してログイン検証を行うのは便利です.検証が成功したかどうかを検証してからページジャンプを行います.検証が成功しなかったら、ジャンプページを設定します.configで次のように構成する必要があります.
loginUrlジャンプのページを変更すればいいです.
ユーザーログインパスワードの変更手順は次のとおりです.
一、テンプレートの定義
二、ContrallerのAction作成
ここで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、ユーザー情報の変更
1)、SysComUser.Attach(Tmodel);
セットのベースコンテキストに指定したエンティティを追加し、データベースにすでに存在するエンティティをコンテキストに再入力します.データベース内のエンティティとの比較が変更されていない場合、Attachはアクションを実行しません.
2)、 dbContext.Entry(Tmodel).State = EntityState.Modified;
オブジェクトのスカラー属性は変更されましたが、SaveChangesメソッドは呼び出されていません.変更を保存すると、オブジェクトのステータスがUnchangedに変更されます.
2、ユーザーパスワードを修正するには、データからユーザーエンティティ情報を読み出し、修正したパスワードをこのエンティティに割り当てる必要がある.読み取り方法は次のとおりです.
3、元のパスワードの検証方法
四、VIEWページコード、自動生成後簡単な調整をする
<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
オブジェクトのスカラー属性は変更されましたが、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")
}