none
MVC+identityでのテーブルAspNetUsersのUserNameについて RRS feed

  • 質問

  • visual studio express 2013 for webからmvcテンプレートで勉強しています。
    ユーザーIDとパスワードでのログインできればと考えていましたが
    テンプレートのログイン画面ではユーザーの確認に
    var user = await UserManager.FindAsync(model.Email, model.Password);
    を行ってユーザーの確認をしていました。

    UserName列とあったのでユーザー名が入った方が良いと思っていましたが
    Googleアカウント等のログインが可能になるよう
    メールアドレス=ユーザID
    という流れが今は主流なのでしょうか?

    2014年11月8日 20:21

回答

  • 主流かと言われると、最近のコンシューマ向けサービスはそのような仕様が多いように思います。主観ですが ^^;

    SurferOnWww さんが仰っているようにユーザー名を使いたいということであれば、ユーザーの登録時にユーザー名をユーザー ID として登録すれば可能です。
    メールアドレスを使った機能に制限がかかりますが(もちろん、別途アドレスを登録してもらえば別です)、ASP.NET Identity ではユーザー ID の型や書式そのものに制限はありません。

    あるいは、ユーザー ID をメールアドレスにしたとしても、UserManager には FindByNameAsync というメソッドがありますので、そちらでユーザー名を使ったユーザー存在確認は可能です。(ただし、FindAsync と違ってパスワードの検証は行われないので、ログイン処理には別途 CheckPasswordAsync メソッドも使う必要があります)

    ドキュメント化が追いついていないのか、MSDN の ASP.NET Identity に関する情報は幾分古いので、API の確認はオブジェクトブラウザなどを併せて使うと良いかもしれません。

    ちなみに、検証されている環境に制限はありますでしょうか?
    今時点で最新のログイン処理では UserManager ではなく SignInManager というもう一枚被せたクラスを使っているはずです。
    念のため手元の Visual Studio Express 2013 for web Update 3 で確認してみましたが、やはりそうです。
    特に制限が無いようであれば、最新環境にアップデートすることをお勧めいたします。



    • 編集済み kumake 2014年11月9日 15:53
    • 回答としてマーク s_tsurumaki 2014年11月10日 16:57
    2014年11月9日 15:52
  • 再びググって調べてみました。

    > 今時点で最新のログイン処理では UserManager ではなく SignInManager というもう一枚被
    > せたクラスを使っているはずです。

    以下の記事によると、SignInManager というのは Identity 2.1.0 で 2014 年 8 月頃リリースされたもののようです。

    Announcing RTM of ASP.NET Identity 2.1.0
    http://blogs.msdn.com/b/webdev/archive/2014/08/05/announcing-rtm-of-asp-net-identity-2-1-0.aspx

    以下の記事によると、2014 年 3 月頃リリースされた Identity 2.0.0 では SignInHelper だったようです。

    ASP.NET MVC and Identity 2.0: Understanding the Basics
    http://www.codeproject.com/Articles/762428/ASP-NET-MVC-and-Identity-Understanding-the-Basics

    質問者さんの情報によると、

    > テンプレートのログイン画面ではユーザーの確認に
    > var user = await UserManager.FindAsync(model.Email, model.Password);
    > を行ってユーザーの確認をしていました。

    ということだそうですが、上の 2 つの記事によると以下のようになっているそうです。

    Identity 2.0.0

    var result = await SignInHelper.PasswordSignIn(
            model.Email, 
            model.Password, 
            model.RememberMe, 
            shouldLockout: false);

    Identity 2.1.0

    var result = await SignInManager.PasswordSignInAsync(
            model.Email, 
            model.Password, 
            model.RememberMe, 
            shouldLockout: false);

    ということは、質問者さんのアップされたコードは、多分、Identity 2.0.0 適用前のものですね。

    ちょっと Microsoft さんによる変更が頻繁すぎと思うのは自分だけでしょうか? 特に MVC 関係。

    こう頻繁に変更されたのでは、自分みたいな素人はとてもついていけないし、掲示板などでの Q&A では話が合わないです。


    • 編集済み SurferOnWww 2014年11月10日 3:21 一部訂正
    • 回答としてマーク s_tsurumaki 2014年11月10日 16:57
    2014年11月10日 2:46

すべての返信

  • MVC5 + ASP.NET Identity を試す環境も持ってない自分がレスするのもなんですが・・・

    > メールアドレス=ユーザID
    > という流れが今は主流なのでしょうか?

    ググって調べた限りですが、Identity 1.0 ではユーザー名だったものが、Identity 2.0 でメールアドレスになったようですね。以下のページを見てください。

    Announcing RTM of ASP.NET Identity 2.0.0
    http://blogs.msdn.com/b/webdev/archive/2014/03/20/test-announcing-rtm-of-asp-net-identity-2-0-0.aspx

    上記の記事の「Account Confirmation」のセクションに "The ASP.NET Identity system now supports Account Confirmation by confirming the email of the user." と書いてあります。何故メールアドレスを使うかの理由も書いてありますので見てください。

    質問者さんは、以前のようにユーザー名を使いたいということなのでしょうか?

    2014年11月9日 6:55
  • 主流かと言われると、最近のコンシューマ向けサービスはそのような仕様が多いように思います。主観ですが ^^;

    SurferOnWww さんが仰っているようにユーザー名を使いたいということであれば、ユーザーの登録時にユーザー名をユーザー ID として登録すれば可能です。
    メールアドレスを使った機能に制限がかかりますが(もちろん、別途アドレスを登録してもらえば別です)、ASP.NET Identity ではユーザー ID の型や書式そのものに制限はありません。

    あるいは、ユーザー ID をメールアドレスにしたとしても、UserManager には FindByNameAsync というメソッドがありますので、そちらでユーザー名を使ったユーザー存在確認は可能です。(ただし、FindAsync と違ってパスワードの検証は行われないので、ログイン処理には別途 CheckPasswordAsync メソッドも使う必要があります)

    ドキュメント化が追いついていないのか、MSDN の ASP.NET Identity に関する情報は幾分古いので、API の確認はオブジェクトブラウザなどを併せて使うと良いかもしれません。

    ちなみに、検証されている環境に制限はありますでしょうか?
    今時点で最新のログイン処理では UserManager ではなく SignInManager というもう一枚被せたクラスを使っているはずです。
    念のため手元の Visual Studio Express 2013 for web Update 3 で確認してみましたが、やはりそうです。
    特に制限が無いようであれば、最新環境にアップデートすることをお勧めいたします。



    • 編集済み kumake 2014年11月9日 15:53
    • 回答としてマーク s_tsurumaki 2014年11月10日 16:57
    2014年11月9日 15:52
  • 再びググって調べてみました。

    > 今時点で最新のログイン処理では UserManager ではなく SignInManager というもう一枚被
    > せたクラスを使っているはずです。

    以下の記事によると、SignInManager というのは Identity 2.1.0 で 2014 年 8 月頃リリースされたもののようです。

    Announcing RTM of ASP.NET Identity 2.1.0
    http://blogs.msdn.com/b/webdev/archive/2014/08/05/announcing-rtm-of-asp-net-identity-2-1-0.aspx

    以下の記事によると、2014 年 3 月頃リリースされた Identity 2.0.0 では SignInHelper だったようです。

    ASP.NET MVC and Identity 2.0: Understanding the Basics
    http://www.codeproject.com/Articles/762428/ASP-NET-MVC-and-Identity-Understanding-the-Basics

    質問者さんの情報によると、

    > テンプレートのログイン画面ではユーザーの確認に
    > var user = await UserManager.FindAsync(model.Email, model.Password);
    > を行ってユーザーの確認をしていました。

    ということだそうですが、上の 2 つの記事によると以下のようになっているそうです。

    Identity 2.0.0

    var result = await SignInHelper.PasswordSignIn(
            model.Email, 
            model.Password, 
            model.RememberMe, 
            shouldLockout: false);

    Identity 2.1.0

    var result = await SignInManager.PasswordSignInAsync(
            model.Email, 
            model.Password, 
            model.RememberMe, 
            shouldLockout: false);

    ということは、質問者さんのアップされたコードは、多分、Identity 2.0.0 適用前のものですね。

    ちょっと Microsoft さんによる変更が頻繁すぎと思うのは自分だけでしょうか? 特に MVC 関係。

    こう頻繁に変更されたのでは、自分みたいな素人はとてもついていけないし、掲示板などでの Q&A では話が合わないです。


    • 編集済み SurferOnWww 2014年11月10日 3:21 一部訂正
    • 回答としてマーク s_tsurumaki 2014年11月10日 16:57
    2014年11月10日 2:46
  • お世話になります、ご回答ありがとうございます。

    翻訳して確認しました。社内イントラを想定したシステムだったのでメールアドレスで登録は不要かなと思っていましたが、やはりトレンドはメールアドレス=ユーザーなんですね。

    固執してユーザー名でなければならない、という訳でも無いのでテンプレートのままで試行錯誤してみたいと思います。

    2014年11月10日 16:43
  • お世話になります、ご回答ありがとうございます。

    FindByNameAsyncを知りませんでした、しかしながらCheckPasswordAsyncを利用する必要があるのであればテンプレートのままの方が良い気がしますね。

    Update 2の環境でしたのでUpdate 3にアップデートしました。つい最近インストールした筈だったのですが、最近のアップデートは更新が早いですね・・・。

    2014年11月10日 16:50
  • お世話になります、ご回答ありがとうございます。

    Identity 2.1.0になっているとは気付きませんでした。

    Update3にすると確かにPasswordSignInAsyncに変わっていて中の処理も様変わりしてました。

    この辺りを利用するにヘタにカスタマイズせず利用した方がよさそうですね。。。

    2014年11月10日 16:57
  • > 社内イントラを想定したシステムだったので

    イントラネットで Web サーバーもクライアントも Active Directory を利用したドメイン環境下にあるのであれば、統合 Windows 認証を利用したシングルサインオンが利用できます・・・と言うより利用すべきだと思います。

    Windows Authentication
    http://www.asp.net/visual-studio/overview/2013/creating-web-projects-in-visual-studio#winauth


    > メールアドレスで登録は不要かなと思っていまし
    > たが、やはりトレンドはメールアドレス=ユーザーなんですね。

    統合 Windows 認証が利用できれば、Active Directory に各ユーザーのドメインアカウントは登録済みのはずなので、Web アプリを利用するためのユーザー登録は不要ですし、ユーザー名かメールアドレスかで悩む必要もなくなります(ドメインアカウントのユーザー名になります)。

    そんなことは百も承知で、ASP.NET Identity を使うということでしたら、上記は余計なお世話だったかもしれませんが・・・


    #ところで、質問者さんが立てた別スレッドが放置状態になってます。きちんとクローズするまでフォローいただけますか?

    https://social.msdn.microsoft.com/Forums/vstudio/ja-JP/5678745d-b9e6-4a16-8ceb-81ca4abb8680/aspnet-identity?forum=aspnetja

    2014年11月11日 1:35
  • お世話になります、ご回答ありがとうございます。

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

    イントラネットで Web サーバーもクライアントも Active Directory を利用したドメイン環境下にあるのであれば、統合 Windows 認証を利用したシングルサインオンが利用できます・・・と言うより利用すべきだと思います。

    当方と致しましてもWindows 認証を利用したシングルサインオンの恩恵に肖りたいのですが、私の世界ではWindows Serverは利用していても是としない方々がおりまして。。。

    2014年11月15日 16:04