Shoeisha Technology Media

CodeZine(コードジン)

記事種別から探す

ASP.NET Identityによるユーザー登録/ログインの仕組み

ASP.NET Identity入門 第2回

  • LINEで送る
  • このエントリーをはてなブックマークに追加
2014/06/03 14:00

 前回、ASP.NET Identityとは何であるかを、その登場の背景とともに特徴を紹介し、テンプレートを使うと手軽に利用できることを説明しました。今回は、テンプレートで生成されたコードを読み解きつつ、ASP.NET Identityの仕組みを紹介していきます。

目次

はじめに

 前回の記事ではASP.NET Identityとは何なのか、ASP.NET Identityが生まれた背景とその特徴について、ASP.NETにおける認証・資格システムの歴史とともに紹介しました。そして最後に、Visual Studio 2013(以下VS2013)に搭載されたテンプレートを用いてサンプルプログラムを作成し、その動作を確認しました。

 今回は、前回作成したサンプルプログラムを読み解きながら、ASP.NET Identityの動作について紹介していきます。なお、今回のサンプルはVS2013 Update 1およびASP.NET Identity 1.0のものです。先日リリースされたASP.NET Identity 2.0とVS2013 Update 2では、生成されるプログラムがかなり違ったものとなっていますので、あらかじめご了承ください。

「ASP.NET Identity 2.0」と「Visual Studio 2013 Update 2」

 3月20日にASP.NET Identityの最新バージョンである2.0がリリースされました。その主な新機能は次のとおりです。

  • 2段階認証
  • アカウントロックアウト
  • アカウント確認
  • パスワードリセット
  • アカウント削除
  • ユーザー名の重複不可設定
  • パスワード検証のパワーアップ

 また、5月12日にはASP.NET Identity 2.0に対応し、その新機能を使った新たなテンプレートを取り込んだVS2013 Update 2がリリースされています。
 

 これらについては、本連載の中でも詳しく紹介していく予定です。それまでは、次のblogエントリなどを参考にしてください。
 

ユーザー登録の流れ

 まずは前回作成したサンプルを元に、まずはユーザー登録の流れを説明していきましょう。

 ユーザーを登録するには、前回の記事で説明したように「ユーザー登録画面」でユーザー名とパスワードを入力して「登録」ボタンをクリックするのでしたね(図1)。

図1:登録画面
図1:登録画面

 登録ボタンをクリックした際のユーザー登録処理イメージは、図2のようになります。

図2:ユーザー登録処理イメージ
図2:ユーザー登録処理イメージ

 この図の流れを参考にしつつ、順にコードを追っていきましょう。処理の入り口はAccout/Register.aspx.csファイルのCreateUser_Clickメソッドです(リスト1)。

リスト1 ユーザー登録処理(Account/Register.aspx.cs)
namespace IdentityFirstFormSite.Account
{
    public partial class Register : Page
    {
        protected void CreateUser_Click(object sender, EventArgs e)
        {
            var manager = new UserManager();                               //(1)
            var user = new ApplicationUser() { UserName = UserName.Text };  //(2)
            IdentityResult result = manager.Create(user, Password.Text);     //(3)
            if (result.Succeeded)
            {
                IdentityHelper.SignIn(manager, user, isPersistent: false);   //(4)
                IdentityHelper.RedirectToReturnUrl(Request.QueryString["ReturnUrl"], Response);
            }
            else 
            {
                ErrorMessage.Text = result.Errors.FirstOrDefault();
            }
        }
    }
}
(1)ユーザー管理オブジェクトを作成する

 ASP.NET Identityでは、ユーザー情報を管理するためにUserManager<TUser>クラスが用意されています。サンプルでは、Models/IdentityModels.csファイルにてその派生クラスとしてUserManagerクラス(後述)が定義してあり、ここではそのオブジェクトを作成しています。

(2)登録するユーザーオブジェクトを作成する

 ASP.NET Identityでは、ユーザー情報を表すIdentityUserクラスが用意されています。サンプルでは、UserManagerクラスと同様に、IdentityModels.csファイルにてその派生クラスとしてApplicationUserクラスが定義してあり、ここではそのオブジェクトを、画面で入力したユーザー名を使って作成しています。

(3)データストアにユーザー情報を登録する

 ユーザー管理オブジェクトのCreateメソッドを使い、(2)で作成したユーザーオブジェクトを元に、実際にデータストア内にユーザー情報を登録します。このCreateメソッド、実際はUserManager<TUser>クラスの拡張メソッドとして、ASP.NET Identityのライブラリ内で定義されていて、UserManager<TUser>クラス自体のユーザー登録用のメソッドをラッピングしています。

 これは、UserManager<TUser>クラスのメソッドがすべて、Task<IdentityResult>を返す非同期メソッドになっているためと推測します。もちろん、最新バージョンのC#やVBには非同期構文(async/await)があるため、例え非同期メソッドだとしてもその呼び出しは容易です。ただ、まだその構文に慣れていないユーザーもいるために、このような拡張メソッドが用意されているのかもしれません。

(4)登録したユーザー情報を使い、ログインする

 ユーザー登録が正常にできたことを確認し、今度は登録したユーザー情報を使ってログインします。具体的に何をやっているかは後述しますが、簡単に言えばこのWebアプリケーションにユーザー情報を設定し、「ログオン後」状態に変更しています。これにより、以降はログオン後としてアプリケーションが動作します。例えば、各画面のヘッダー部分(Site.Masterファイルに定義)では、ログオン状態を判断し、ログオン画面へのリンクとユーザー名のリンクの表示を切り替えています。

 以上の処理でユーザー登録およびログイン処理が行われます。登録されたユーザーの情報は、App_Dataフォルダーに自動的に作成されるSQL Server 2012 LocalDBのmdfファイルに、「AspNetUsers」テーブルが作成され、データが登録されています(図3)。

図3:ユーザー情報の登録先
図3:ユーザー情報の登録先

 AspNetUsersテーブルのデータは、表1のとおりです。IdにはGUID値が、UserNameには入力したユーザー名が、PasswordHashには入力したパスワードから生成されたハッシュ値が設定されています。残りのSecurityStamp、Discriminatorについては、恐らくは不正アクセス対策のための項目のようですが、現時点での公式情報を見つけることができませんでした。

表1:登録されたユーザー情報
ID UserName PasswordHash SecurityStamp Discriminator
e82f4~ takano AMOJOyx~ 59ee~ ApplicationUser

  • LINEで送る
  • このエントリーをはてなブックマークに追加

著者プロフィール

  • WINGSプロジェクト 高野 将(タカノ ショウ)

    <WINGSプロジェクトについて> 有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2012年2月時点での登録メンバは37名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい...

  • 山田 祥寛(ヤマダ ヨシヒロ)

    静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for ASP/ASP.NET。執筆コミュニティ「WINGSプロジェクト」代表。 主な著書に「入門シリーズ(サーバサイドAjax/XMLD...

バックナンバー

連載:ASP.NET Identity入門

もっと読む

おすすめ記事

All contents copyright © 2006-2017 Shoeisha Co., Ltd. All rights reserved. ver.1.5