質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Chrome

Google Chromeは携帯、テレビ、デスクトップなどの様々なプラットフォームで利用できるウェブブラウザです。Googleが開発したもので、Blink (レンダリングエンジン) とアプリケーションフレームワークを使用しています。

MVC

MVC(Model View Controller)は、オブジェクト指向プログラミングにおけるモデル・ビュー・コントローラーの総称であり、ソフトフェア開発で使われている構築パターンとしても呼ばれます。

Razor

RazorはASP.NET Web PagesとASP.NET MVCで使われているビュー・エンジンです。HTMLマークアップとC#またはVisual Basicのコードに対応しています。マークアップとコードの間の切り替えは"@"で記されています。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

Q&A

解決済

1回答

6125閲覧

ASP.NET Identityでのログインをメールアドレスとユーザー名を同列にしない方法

pomu.pomupomu

総合スコア18

Chrome

Google Chromeは携帯、テレビ、デスクトップなどの様々なプラットフォームで利用できるウェブブラウザです。Googleが開発したもので、Blink (レンダリングエンジン) とアプリケーションフレームワークを使用しています。

MVC

MVC(Model View Controller)は、オブジェクト指向プログラミングにおけるモデル・ビュー・コントローラーの総称であり、ソフトフェア開発で使われている構築パターンとしても呼ばれます。

Razor

RazorはASP.NET Web PagesとASP.NET MVCで使われているビュー・エンジンです。HTMLマークアップとC#またはVisual Basicのコードに対応しています。マークアップとコードの間の切り替えは"@"で記されています。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

0グッド

1クリップ

投稿2018/08/20 09:27

編集2018/08/20 09:29

前提・実現したいこと

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

ログインフォームにユーザー名とパスワードでログインすることはできるようになりましたが、

参考にされている codeproject の記事のようにしたのですよね?

その記事は、たぶん(詳しくは読んでないので 100% の自信は無し)、Identity 2.0 で自動生成されるコードのデフォルトで Email とパスワードでログインする設定になるのを止めて、任意のユーザー名を UserName に設定して登録し、そのユーザー名とパスワードでログインできるように変更するというもののようです。

Emailアドレスでログインすることができません。

質問者さん自身が Email を使うのを止めて任意のユーザー名をログインに使うことに変更したのだから、それは当たり前かと思いますけど。

ログインはあくまで Identity 2.0 デフォルトの Email とパスワードで行い、Email とは別のハンドル名を「ようこそ〇〇〇さん」みたいにヘッダー部に表示したいということであれば、プロファイル情報として追加してはいかがですか?

具体的な方法は以下の記事を見てください。記事では FirstName, LastName, Birthday をプロファイル情報として追加していますが、同様な方法で HandleName を追加することを検討してみてください。

ASP.NET Identityのプロファイル情報のカスタマイズ
https://codezine.jp/article/detail/7845

追加したプロファイル情報の取得と表示は以下の記事が参考になると思います。ログイン後は表示の都度 DB にクエリを投げて情報を取得するような無駄なことは避けて、認証クッキーから取得するようにしています。

プロファイル情報を ClaimsIdentity へ追加
http://surferonwww.info/BlogEngine/post/2017/04/16/add-user-profile-information-to-claimsidentity.aspx

プロファイル情報を追加するのでなく、もともとある UserName を使うという方法もあるかもしれませんが、デフォルトで生成されるユーザー登録のアクションメソッドで、

var user = new ApplicationUser { UserName = model.Email, Email = model.Email };

と設定しているということは、UserName と Email を同じにするのは何か理由があるかもしれません。想像ですが、以下の記事にある「ASP.NET Identity 2.0 の新機能」とかに関係があるのかも。

「ASP.NET Identity入門」連載一覧
https://codezine.jp/article/corner/511

そのあたりがはっきりしない限りは(自分は調べてませんのではっきりしません)、プロファイル情報として追加するのが無難だと思います。

投稿2018/08/21 02:36

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pomu.pomupomu

2018/08/21 06:11

プロファイル情報を用いて追加すれば良いこと、返事や記載されたリンク等を見た上で自分で試してみて「なるほど、これなら望んでいるものができる!」と理解しました。ありがとうございます。 ただ、現在、作っていたソリュージョンのパッケージマネージャーコンソールについて、 マイグレージョンを実行しようと試みましたがエラーが起き、解決策を提示していただいたのに解決しておらずに至らず申し訳ありません。近日中に理解し解決しようと考えております。
pomu.pomupomu

2018/08/21 07:21

できました・・・。 PM> Enable-Migrations -ContextTypeName Forum.Models.ApplicationDbContext -Force 末尾に-Forceをつけることでマイグレーションできました。 その後、指南通りに従い、メールアドレスでのログイン機能を維持したまま、アカウント登録時には (1)姓名 (2)ハンネ をIdentityで生成される項目の他に追加できました。 ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問