前回、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では、生成されるプログラムがかなり違ったものとなっていますので、あらかじめご了承ください。
3月20日にASP.NET Identityの最新バージョンである2.0がリリースされました。その主な新機能は次のとおりです。
- 2段階認証
- アカウントロックアウト
- アカウント確認
- パスワードリセット
- アカウント削除
- ユーザー名の重複不可設定
- パスワード検証のパワーアップ
また、5月12日にはASP.NET Identity 2.0に対応し、その新機能を使った新たなテンプレートを取り込んだVS2013 Update 2がリリースされています。
これらについては、本連載の中でも詳しく紹介していく予定です。それまでは、次のblogエントリなどを参考にしてください。
ユーザー登録の流れ
まずは前回作成したサンプルを元に、まずはユーザー登録の流れを説明していきましょう。
ユーザーを登録するには、前回の記事で説明したように「ユーザー登録画面」でユーザー名とパスワードを入力して「登録」ボタンをクリックするのでしたね(図1)。
登録ボタンをクリックした際のユーザー登録処理イメージは、図2のようになります。
この図の流れを参考にしつつ、順にコードを追っていきましょう。処理の入り口はAccout/Register.aspx.csファイルのCreateUser_Clickメソッドです(リスト1)。
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)。
AspNetUsersテーブルのデータは、表1のとおりです。IdにはGUID値が、UserNameには入力したユーザー名が、PasswordHashには入力したパスワードから生成されたハッシュ値が設定されています。残りのSecurityStamp、Discriminatorについては、恐らくは不正アクセス対策のための項目のようですが、現時点での公式情報を見つけることができませんでした。
| ID | UserName | PasswordHash | SecurityStamp | Discriminator |
|---|---|---|---|---|
| e82f4~ | takano | AMOJOyx~ | 59ee~ | ApplicationUser |
この記事は参考になりましたか?
- ASP.NET Identity入門連載記事一覧
- この記事の著者
-
山田 祥寛(ヤマダ ヨシヒロ)
静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるLaravel実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数。
※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です
-
WINGSプロジェクト 高野 将(タカノ ショウ)
<個人紹介>新潟県長岡市在住の在宅リモートワークプログラマー。家事や育児、仕事の合間に長岡IT開発者勉強会(NDS)、Niigata.NET、TDDBCなどのコミュニティに関わったり、Web記事や書籍などの執筆を行ったりしている。著書に『アプリを作ろう! Visual C#入門 Visual C# 2017対応』(日経BP社、2017)など。< WINGSプロジェクト について>有限会社 WINGSプロジェクト が運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。 2026年時点での 登録メンバ は約50名で、現在も執筆メンバを 募集中 。興味のある方は、どしどし応募頂きたい。 著書 、 記事 多数。 RSS X: @WingsPro_info (公式)、 @WingsPro_info/wings (メンバーリスト) Facebook
※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です
この記事は参考になりましたか?
この記事をシェア
