前提・実現したいこと
ASP.NET mvcにて掲示板を作成している初学者です。不束者ですがよろしくお願いします。
現在、ASP.NET Identityでのログイン方法をEmailアドレスで行いたいと思い投稿しました。
(最初からEmailアドレスでのログインにはなっていますが、DBにおけるAspNetUsersテーブル内のEmailのみならず、UserNameの項目にもEmailアドレスが書き込まれるため、「ようこそpochi@pochi.comさん」みたいにヘッダー部に表示されるため都合が悪いと考えました。)
発生している問題・エラーメッセージ
ログインフォームにユーザー名とパスワードでログインすることはできるようになりましたが、Emailアドレスでログインすることができません。ユーザー名のモデル参照部分をmodel.Emailに差し替えましたが、次のように「無効なログイン試行です」という表示がされます。
試したこと
以下に記したコードのように試した結果、うまくいきませんでした。
安直ですが、「model.UserNameと記された箇所をmodel.Emailと修正し、Model定義については[EmailAddress]を挿入したらいいのではないか?」と考え実行しました。
(無知ゆえに自分のあずかり知らないページがあるかもしれません、その場合は申し訳ありませんが指摘してくだされば加筆します。)
以下にASP.NETで生成した部分でのログインにまつわり、編集した部分を記します。
AccountviewModel
C#
1 public class LoginViewModel 2 { 3 [Required] 4 [EmailAddress] 5 [Display(Name = "電子メール")] 6 public string Email { get; set; } 7 8 [Required] 9 [DataType(DataType.Password)] 10 [Display(Name = "パスワード")] 11 public string Password { get; set; } 12 13 [Display(Name = "このアカウントを記憶する")] 14 public bool RememberMe { get; set; } 15 }
Login.cshtml
C#
1 @using (Html.BeginForm("Login", "Account", new { ReturnUrl = ViewBag.ReturnUrl }, FormMethod.Post, new { @class = "form-horizontal", role = "form" })) 2 { 3 @Html.AntiForgeryToken() 4 @Html.ValidationSummary(true, "", new { @class = "text-danger" }) 5 <dl> 6 <dt>電子メール</dt> 7 <dd> 8 @Html.TextBoxFor(m => m.Email, new { @class = "form-control" }) 9 @Html.ValidationMessageFor(m => m.Email, "", new { @class = "text-danger" }) 10 </dd> 11 <dt class="text01">パスワード</dt> 12 <dd> 13 @Html.PasswordFor(m => m.Password, new { @class = "form-control" }) 14 @Html.ValidationMessageFor(m => m.Password, "", new { @class = "text-danger" }) 15 </dd> 16 </dl> 17 18 <div class="form-group"> 19 <div class="col-md-offset-2 col-md-10"> 20 <div class="checkbox"> 21 @Html.CheckBoxFor(m => m.RememberMe) 22 @Html.LabelFor(m => m.RememberMe) 23 </div> 24 </div> 25 </div> 26 27 <div class="form-group"> 28 <div class="col-md-offset-2 col-md-10"> 29 <input type="submit" value="ログイン" class="btn btn-default" /> 30 </div> 31 </div> 32 }
AccountController.cs
C#
1 // 2 // POST: /Account/Login 3 [HttpPost] 4 [AllowAnonymous] 5 [ValidateAntiForgeryToken] 6 public async Task<ActionResult> Login(LoginViewModel model, string returnUrl) 7 { 8 if (!ModelState.IsValid) 9 { 10 return View(model); 11 } 12 13 // これは、アカウント ロックアウトの基準となるログイン失敗回数を数えません。 14 // パスワード入力失敗回数に基づいてアカウントがロックアウトされるように設定するには、shouldLockout: true に変更してください。 15 var result = await SignInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, shouldLockout: false); 16 switch (result) 17 { 18 case SignInStatus.Success: 19 return RedirectToLocal(returnUrl); 20 case SignInStatus.LockedOut: 21 return View("Lockout"); 22 case SignInStatus.RequiresVerification: 23 return RedirectToAction("SendCode", new { ReturnUrl = returnUrl, RememberMe = model.RememberMe }); 24 case SignInStatus.Failure: 25 default: 26 ModelState.AddModelError("", "無効なログイン試行です。"); 27 return View(model); 28 } 29 }
補足情報
以上のことを試すに当たって、次のサイトを参考にしました。
(これを参考に、UserNameでのログインと、DBのAspNetUsersテーブルのUserNameにEmailアドレスではなくユーザー名の書き込みができるようになってから、安直なmodel等の編集を試みをしました)
Using User Name Instead of Email in ASP.NET Identity
https://www.codeproject.com/Articles/1052354/Using-User-Name-Instead-of-Email-in-ASP-NET-Identi
開発環境
VS2017
Windows7
.Net Framework 4.6.1
MVC5
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/08/21 06:11
2018/08/21 07:21