none
MVC Identity でプロファイル情報から値を取得したい RRS feed

  • 質問

  • お世話になります。

    MVC5
    Identity 2.1.0
    visual studio 2013 express for web update 3
    でwebサイトを作成しています。
    テンプレートをベースに、下記サイトを見ながら新たに表示名列を作成しました。

    MVC5 Identity 2.0を使って認証 第2回
    http://www.starsphere.jp/blog/mvc5-identity-2-0%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E8%AA%8D%E8%A8%BC%E3%80%80%E7%AC%AC2%E5%9B%9E/

    データベースの表示名列にwebサイトから入力した名称が格納されている所までは確認できました。

    しかし、ログイン後に表示名列を表示させる手段がわかりませんでした。

    テンプレートでは
    User.Identity.GetUserName()
    でユーザー名(メールアドレス)を取得しているのですが、独自にカスタマイズした列を取得するサンプルソース等は無いでしょうか?

    お手数おかけいたしますが、何卒よろしくお願いいたします。


    2014年11月19日 17:11

回答

  • > 独自にカスタマイズした列を取得するサンプルソース等は無いでしょうか?

    「独自にカスタマイズした列」というのは ASP.NET 用語で言うとプロファイル情報と言います。

    ASP.NET Identity 2.1 ということですと新しすぎるためか Web を探してもなかなかサンプルは見つからないですが、自分が探した限りで一番新しい日本語のページですと以下の記事がありました。

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

    残念ながら MVC アプリではなく Web Forms アプリの記事ですが、Entity Framework を含めた Identity の部分は同じではないかと思います。

    LastName, FirstName の取得方法については 3 ページ目のリスト 3 を見てください。

    やっていることは、(1) HttpContext から ApplicationUserManager を取得、(2) それからユーザー ID で探して ApplicationUser を取得、(3) ApplicationUser の LastName, FirstName プロパティで姓名を取得ということです。

    MVC のコントローラーで姓名を取得するなら、リスト 3 で上の (1) を行っているコードの Context は使えませんので、HttpContext に代えて試してみてください。(未検証です)


    • 編集済み SurferOnWww 2014年11月20日 9:10 誤字訂正
    • 回答としてマーク s_tsurumaki 2014年11月24日 12:11
    2014年11月20日 9:09

すべての返信

  • > 独自にカスタマイズした列を取得するサンプルソース等は無いでしょうか?

    「独自にカスタマイズした列」というのは ASP.NET 用語で言うとプロファイル情報と言います。

    ASP.NET Identity 2.1 ということですと新しすぎるためか Web を探してもなかなかサンプルは見つからないですが、自分が探した限りで一番新しい日本語のページですと以下の記事がありました。

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

    残念ながら MVC アプリではなく Web Forms アプリの記事ですが、Entity Framework を含めた Identity の部分は同じではないかと思います。

    LastName, FirstName の取得方法については 3 ページ目のリスト 3 を見てください。

    やっていることは、(1) HttpContext から ApplicationUserManager を取得、(2) それからユーザー ID で探して ApplicationUser を取得、(3) ApplicationUser の LastName, FirstName プロパティで姓名を取得ということです。

    MVC のコントローラーで姓名を取得するなら、リスト 3 で上の (1) を行っているコードの Context は使えませんので、HttpContext に代えて試してみてください。(未検証です)


    • 編集済み SurferOnWww 2014年11月20日 9:10 誤字訂正
    • 回答としてマーク s_tsurumaki 2014年11月24日 12:11
    2014年11月20日 9:09
  • お世話になります、ご回答ありがとうございます。

    また、返事に時間がかかり申し訳御座いませんでした。

    AccountController.csの

    public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)

    の中に

    (1):var manager = HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>();
    (2):var user = manager.FindById(User.Identity.GetUserName());

    を書いて試してみましたが、

    (1)では登録している全ユーザがが取得できているようですが、(2)ではUser.Identity.GetUserName()の値が空白になっているため、nullが入ってきていました。

    Loginメソッド内に記述してviewで値を取得するため試行錯誤していますが、未だどのようにすれば解決できるのかには至っていない状態です。

    2014年11月22日 14:38
  • > (2)ではUser.Identity.GetUserName()の値が空白になっているため、nullが入ってきていました。

    その時点ではユーザーはまだログインしてないから ApplicationUser は取得できないのではないですか?

    一番最初の質問で、

    > テンプレートでは
    > User.Identity.GetUserName()
    > でユーザー名(メールアドレス)を取得しているのですが、

    とありましたが、その時点ではログインが完了していてユーザー ID は取得できているのですよね?

    であれば、その時点(即ち、確実にユーザー ID を取得できると分かっている時点)でプロファイル情報の取得を試してみたらどうなりますか?




    • 編集済み SurferOnWww 2014年11月22日 15:17 誤記訂正
    2014年11月22日 15:12
  • 後でこのスレッドを見る人のために、タイトル、

    > MVC Identity でカスタマイズした列から値を取得したい

    の「カスタマイズした列から値」を「プロファイル情報」に修正していただけませんか。

    2014年11月22日 15:24
  • お世話になります、タイトルを修正したしました。
    2014年11月23日 7:58
  • お世話になります。

            public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
            {
                if (!ModelState.IsValid)
                {
                    return View(model);
                }
    
                // これは、アカウント ロックアウトの基準となるログイン失敗回数を数えません。
                // パスワード入力失敗回数に基づいてアカウントがロックアウトされるように設定するには、shouldLockout: true に変更してください。
                var result = await SignInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, shouldLockout: false);
    
                switch (result)
                {
                    case SignInStatus.Success:
                        (1)var manager = HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>();
                        (2)var user = manager.FindByName(model.Email);

    (2)でSuccessしたタイミングでmodel.Emailを利用する事でユーザー情報を取得する事ができました。

    今は_LoginPartial.cshtmlにこの値をどのように渡してやればよいか模索している所です。

    2014年11月23日 10:37
  • このスレッドでの質問、すなわちタイトルの、

    > MVC Identity でプロファイル情報から値を取得したい

    に対する答えはすでに出ていますよね?

    そうであれば、このスレッドは解決済みということでクローズしてください。

    もし、上記の質問に対する回答がまだ十分出ていないと言うことでしたら、何が不足か明確にしたうえで質問を続けてください。

    新たな疑問

    > 今は_LoginPartial.cshtmlにこの値をどのように渡してやればよいか模索している所です。

    は、取得できたプロファイル情報を、どのタイミングで何処にどのように表示するかという話ですよね。それは、新たに別スレッドを立てて質問していただくようお願いします。

    原則、一つの質問でスレッドを完結するというのがこのフォーラムのルールです。後で検索などでここにたどり着いた一般閲覧者のことも考えていただけると、そうすることが適切であることは理解いただけると思います。


    【追伸】

    ログイン時に Login アクションメソッドでユーザーがポストしたユーザー ID からプロファイル情報取得し、それを _LoginPartial.cshtml に渡して表示するというのはまったくの見当違いのやり方だと思います。

    特殊事情があるなら話は別かもしれませんが、単純にマスターページの右上に「こんにちは <LastName> <FirstName> さん!」というように表示したいだけですよね?

    そのあたりの話は新スレッドを立てていただけたらそこで説明します。

    • 編集済み SurferOnWww 2014年11月23日 12:13 追伸追加
    2014年11月23日 11:44
  • お世話になります。

    書き方が悪かったせいか「_LoginPartial.cshtmlにてプロファイル情報から値を取得したい」としておくべきでしたが、当方の知識不足から誤解を招く記載ばかりになってしまいました。

    本件をクローズさせて頂き、再度ご教授頂ければと思います。

    理想は【追伸】に書かれているにマスターページの右上に「こんにちは <LastName> <FirstName> さん!」と内容を実装したかったのです。


    2014年11月23日 18:10