私は私の調査を検討します、そしてうまくいけばあなたたちは私が次に何をすべきかについての考えを理解することができます。
ログインに関連するM、V、Cは次のようになります。
public class LoginViewModel
{
[Required]
[Display(Name = "Email")]
[EmailAddress]
public string Email { get; set; }
[Required]
[DataType(DataType.Password)]
[Display(Name = "Password")]
public string Password { get; set; }
[Display(Name = "Remember me?")]
public bool RememberMe { get; set; }
}
そして
@using (Html.BeginForm("Login", "Account", new { ReturnUrl = ViewBag.ReturnUrl }, FormMethod.Post, new { @class = "form-horizontal", role = "form" }))
{
@Html.AntiForgeryToken()
@Html.ValidationSummary(true, "", new { @class = "text-danger" })
<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" })
@Html.ValidationMessageFor(m => m.Email, "", new { @class = "text-danger" })
</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" })
@Html.ValidationMessageFor(m => m.Password, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group" style="margin-bottom: 40px;">
<div class="col-md-10">
<div class="checkbox">
@Html.CheckBoxFor(m => m.RememberMe)
@Html.LabelFor(m => m.RememberMe)
</div>
</div>
</div>
<div class="form-group">
<div class="col-md-10">
<input type="submit" value="Log in" class="btn btn-default" style="padding-left: 40px; padding-right: 40px;" />
</div>
</div>
}
そして
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
{
if (!ModelState.IsValid)
{
return View(model);
}
// This doesn't count login failures towards account lockout
// To enable password failures to trigger account lockout, change to shouldLockout: true
var result = await SignInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, shouldLockout: false);
switch (result)
{
case SignInStatus.Success:
return RedirectToLocal(returnUrl);
case SignInStatus.LockedOut:
return View("Lockout");
case SignInStatus.RequiresVerification:
return RedirectToAction("SendCode", new { ReturnUrl = returnUrl, RememberMe = model.RememberMe });
case SignInStatus.Failure:
default:
ModelState.AddModelError("", "Invalid login attempt.");
return View(model);
}
}
私がやろうとしているのは、単にメールアドレスではなくユーザー名でログインすることです。ユーザー名に関連するMVCテンプレートのソースコードには何も見つかりませんがAspNetUsers
、テンプレートのテーブルを調べたところ、実際にUserName
。という列があることがわかりました。秘訣は、MVCテンプレートの他の場所で副作用を発生させることなく、上記のソースコードを変更して必要な処理を実行することです。
Mをに変更しました
public class LoginViewModel
{
[Required]
[Display(Name = "UserName")]
public string UserName { get; set; }
[Required]
[DataType(DataType.Password)]
[Display(Name = "Password")]
public string Password { get; set; }
[Display(Name = "Remember me?")]
public bool RememberMe { get; set; }
}
とVから
@using (Html.BeginForm("Login", "Account", new { ReturnUrl = ViewBag.ReturnUrl }, FormMethod.Post, new { @class = "form-horizontal", role = "form" }))
{
@Html.AntiForgeryToken()
@Html.ValidationSummary(true, "", new { @class = "text-danger" })
<div class="form-group">
@Html.LabelFor(m => m.UserName, new { @class = "col-md-2 control-label" })
<div class="col-md-10">
@Html.TextBoxFor(m => m.UserName, new { @class = "form-control" })
@Html.ValidationMessageFor(m => m.UserName, "", new { @class = "text-danger" })
</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" })
@Html.ValidationMessageFor(m => m.Password, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group" style="margin-bottom: 40px;">
<div class="col-md-10">
<div class="checkbox">
@Html.CheckBoxFor(m => m.RememberMe)
@Html.LabelFor(m => m.RememberMe)
</div>
</div>
</div>
<div class="form-group">
<div class="col-md-10">
<input type="submit" value="Log in" class="btn btn-default" style="padding-left: 40px; padding-right: 40px;" />
</div>
</div>
}
Cのものの変更は私が立ち往生しているものです。私は変えるようなことをすることができることを知っています
var result = await SignInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, shouldLockout: false);
に
var email = pingDatabaseAndGetEmailFromUsername(model.UserName);
var result = await SignInManager.PasswordSignInAsync(email, model.Password, model.RememberMe, shouldLockout: false);
しかし、もっと良い方法が必要ですよね?
また、LoginViewModel
MVCテンプレート内の他のコードがそれを使用し、Email
フィールドがあることを期待している可能性があるため、変更によって他のものを台無しにした可能性があります。
それで、私は実際にここで何をすべきですか?最も簡単な変更が必要です。
変更する必要がある場合PasswordSignInAsync
、実装はどこにありますか?見つかりません。
デフォルトのテンプレート実装では、ユーザー名としてメールアドレスが使用されます。model.Email
そのため、PasswordSignInAsync
関数に値が送信されます。あなたは、別のユーザー・アカウント作成と仮定Email
してUserName
の値を、それがする方法で符号を変えるような単純なようでなければなりません。
var result = await SignInManager.PasswordSignInAsync(model.UserName, model.Password, model.RememberMe, shouldLockout: false);
繰り返しますが、これは、ユーザーアカウントが個別の値で作成されていることを前提UserName
としていEmail
ます。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加