株式会社インデペンデンスシステムズ横浜

システム開発エンジニアの西田五郎が運営しております。Raspberry Pi や Arduino その他新規開発案件のご依頼をお待ちしております。

ASP.NET

ASP.NETユーザ管理(その4)ユーザ情報の追加

投稿日:

0012ASP.NETユーザ管理(ASP.NET Identityフレームワーク)の4回目です。前回は、ユーザ登録時にメールを送信する方法を確認しました。今回は、WebFormsのテンプレートで、ユーザ登録時に登録する項目を追加します。追加する項目は表示名とします。さらに、この表示名をログイン後に表示されるメールアドレスの代わりにマスタページで表示する処理を追加します。

今回のソース一式はこちらです。今回の部分は(ISY02)ではじまるコメントを付けています。(※ユーザ登録時のメール送信処理も含まれています。必要な場合はお手数ですが、こちらを参照してメール送信のアカウントを設定するか、メール送信処理を削除して下さい。)

データベースの確認
まずは自動で作成されるデータベースを確認します。最初に最低でも1件のデータを登録します。メール確認が実装されている場合はメール確認が完了していない状態でもいいです。登録自体が出来ていればいいです。確認方法は以下です。

メニュー → 表示 → サーバエクスプローラー でサーバエクスプローラーを表示する。
データ接続のDefaultConnectionを展開する。
テーブルを展開する。
AspNetUsersテーブルを展開する。

以下のように見えるかと思います。
0001

ここでは、こういう構造になっているという確認だけです。何回か書いていますが、このテーブル自体をカスタマイズするのではなく、コード(モデル)からカスタマイズします。後でこのテーブルに変更が反映されているということを確認します。

それではモデルのカスタマイズからです。WebFormsのテンプレートを使用しますが、初期状態のプロジェクトでもカスタマイズされた前回のプロジェクトの状態でも可です。

ホーム\Models\IdentityModels.cs に以下のように追加します。

public class ApplicationUser : IdentityUser
{
    //表示名の追加
    public string DispName { get; set; }

    public Task<ClaimsIdentity> GenerateUserIdentityAsync(ApplicationUserManager manager)
    {
        return Task.FromResult(GenerateUserIdentity(manager));
    }
      
    //以下は省略

この表示名を入力するテキストボックスをユーザ登録画面に追加します。
ホーム\Account\Register.aspx に以下のテキストボックスを追加します。場所はどこでもいいですがここではメールアドレスの下に追加しました。

<div class="form-group">
    <asp:Label runat="server" AssociatedControlID="Email" CssClass="col-md-2 control-label">表示名</asp:Label>
    <div class="col-md-10">
        <asp:TextBox runat="server" ID="DispName" CssClass="form-control"/>
        <asp:RequiredFieldValidator runat="server" ControlToValidate="DispName"
            CssClass="text-danger" ErrorMessage="表示名 フィールドは必須です。" />
    </div>
</div>

ビハインドコードで表示名も登録します。
ホーム\Account\Register.aspx.csです。
以下のソースでコメントアウトしている行と見比べて頂ければ分かると思いますが、元のコードに表示名の項目を追加しています。元のコードはEmailをユーザ名にして、別にEmailも登録しています。主キーは別にあるので、UserNameをEmailにしたくない場合は別にUserNameを登録するようにすればいいです。

protected void CreateUser_Click(object sender, EventArgs e)
{
    var manager = Context.GetOwinContext().GetUserManager<ApplicationUserManager>();

    //表示名も登録する
    //var user = new ApplicationUser() { UserName = Email.Text, Email = Email.Text };
    var user = new ApplicationUser() { UserName = Email.Text, Email = Email.Text, DispName = DispName.Text };

    IdentityResult result = manager.Create(user, Password.Text);
    if (result.Succeeded)

    //以下は省略です

これで表示名が登録出来るようになったので、マスターページのカスタマイズは後にして登録まで実行します。通常通り、ビルドを実行して問題なければ実行していくという手順ですが、その前にEntity FrameworkのCode First Migrationsの有効化を行います。以下その手順です。

メニュー → ツール → NuGetパッケージマネージャーでパッケージマネージャコンソールを起動します。
WS000016

以下のコマンドを入力します。

Enable-Migrations –EnableAutomaticMigrations
Update-Database

0006

0008

上の画像では、別々の画像になっていますが、単純に連続して実行可能です。

以上の準備が完了してから、プロジェクトを実行します。そして、表示名を登録します。

0010

もし、「・・・Code First Migrations を使用したデータベースの更新を検討してください 」といったエラーが出る場合は、Migrationsの有効化とUpdateが正常に完了していないと思います。確認して下さい。

以上で実行してユーザを登録してみます。表示名も登録できているかどうかは、最初に見たデータベースのテーブルを確認します。DispNameというフィールドが出来ていると思います。
0001

次に、マスターページを変更して、表示名を表示します。

ホーム\Site.Master.csのSiteMasterクラスに以下のメソッドを追加します。

//表示名
protected string GetDispName()
{
    var manager = Context.GetOwinContext().GetUserManager<ApplicationUserManager>();
    ApplicationUser user = manager.FindById(Context.User.Identity.GetUserId());

    return user.DispName;
}

ホーム\Site.Masterのユーザ名を表示している箇所で上記のGetDispNameを呼び出すように変更します。

<%-- 表示名に変更<li><a runat="server" href="~/Account/Manage" title="Manage your account">Hello, <%: Context.User.Identity.GetUserName()  %> !</a></li>--%>
<li>
<a runat="server" href="~/Account/Manage" title="Manage your account">Hello, <%: GetDispName()  %> !</a>
</li>

これで表示を確認します。
0011

GetDispName()の処理ですが、ApplicationUserManagerクラスとApplicationUserクラスを使っています。ユーザ管理はこの2つのクラスがメインになってくると思います。また、ApplicationUserManagerを取得するのに、GetOwinContext()を経由しています。とりあえずここではこのようにOwinを経由して取得するということにします。

今回は、ここまでです。次回は、メンバー専用エリアと管理者ページを作成してみます。

今回のシリーズの一覧
ASP.NETユーザ管理(その1)identityフレームワーク
ASP.NETユーザ管理(その2)WebFormsでのASP.NET Identity
ASP.NETユーザ管理(その3)ユーザ登録時のメール確認
ASP.NETユーザ管理(その4)ユーザ情報の追加
ASP.NETユーザ管理(その5)メンバー専用エリアと管理者ページ
ASP.NETユーザ管理(その6)ロール管理の追加
ASP.NETユーザ管理(その7)ユーザアカウントロック
ASP.NETユーザ管理(その8) 2要素認証
ASP.NETユーザ管理(その9) パスワードのリセット

AdSense

AdSense

-ASP.NET

執筆者:

関連記事

ASP.NET Web APIでデータ蓄積(その1)ASP.NET Web APIとは

ASP.NET Web APIを利用してデータを蓄積する機能を実装してみたいと思います。漠然とデータ蓄積といってもいろいろなデータがあると思いますが、ここではセンサー等のデバイスから自動的に送信された …

no image

Microsoft AzureでASP.NETサイトを公開してみる(その1)概要と開発環境

Microsoft Azureのサイト上で、ローカル環境で開発したASP.NETのサイトを公開するまでの手順についてです。(※簡単にサイト公開までということで、データベースは利用しません。ご了承下さい …

no image

ASP.NETユーザ管理(その7)ユーザアカウントロック

ASP.NETユーザ管理(ASP.NET Identityフレームワーク)の7回目です。前回は、ロール管理を使ってみました。今回はユーザアカウントロックを使ってみます。ログイン時に規定の回数パスワード …

no image

Microsoft AzureでSQL DBを使ってみる(その1)概要とASP.NETサイトの作成

以下の投稿で、Microsoft AzureでASP.NETサイトを公開してみましたが、その際にはデータベースを使っていなかったので、次の段階としてMicrosoft Azure(以下、Azureと表 …

ASP.NET Web APIでデータ蓄積(その5)ASP.NET Web APIテンプレートからの構築

ASP.NET Web APIでデータ蓄積の5回目です。前回まででMVC個別に注目してASP.NET Web APIの開発方法を確認しました。今回からやっとASP.NET APIテンプレートを元にデー …