WINGSプロジェクト 高野 将 [著] 山田 祥寛 [監修] 2014/06/03 14:00
このエントリーをはてなブックマークに追加

1 2 3 →

 前回、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

1 2 3
→
INDEX
ASP.NET Identityによるユーザー登録/ログインの仕組み
Page1
はじめに
ユーザー登録の流れ
ユーザー登録の仕組み
ログオンの仕組み
まとめ
こちらの関連記事もおすすめです

プロフィール
WINGSプロジェクト 高野 将 タカノ ショウ

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

<個人紹介>
新潟県長岡市在住のアプリケーション開発者。

C#を中心に.NET関連全般を学びつつ、システム開発全般にかかわることを少しでも楽に出来たらと思い、blog等で色々と発信中。

著書に「かんたんASP.NET」(技術評論社)。

blog:


プロフィール
山田 祥寛 ヤマダ ヨシヒロ

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for ASP/ASP.NET。執筆コミュニティ「WINGSプロジェクト」代表。
主な著書に「入門シリーズ(サーバサイドAjax/XMLDB/PEAR/Smarty)」「独習シリーズ(ASP.NET/PHP)」「10日でおぼえる入門教室シリーズ(ASP.NET/PHP/Jakarta/JSP&サーブレット/XML)」「Pocket詳解辞典シリーズ(ASP.NET/PHP/Perl&CGI)」「今日からつかえるシリーズ(PHP/JSP&サーブレット/XML/ASP)」「書き込み式 SQLのドリル」他、著書多数


記事へのコメント・トラックバック機能は2011年6月に廃止させていただきました。記事に対する反響はTwitterやFacebook、ソーシャルブックマークサービスのコメントなどでぜひお寄せください。

スポンサーサイト