.NETエンジニアのための定期勉強会(Sansan主催)レポート
.NET最新技術「ASP.NET Identity」とは?
― Grani×gloops×Sansan 3社合同 アニバーサリー企画 第5回 勉強会[1]―
ASP.NETの資格管理技術がどう進化して、最新のASP.NET Identityが生まれたのか紹介。また、その特徴と機能、構成、処理の流れなどを解説する。
.NETの最新技術情報を効率的に収集するには、どうすればよいのでしょうか。そんな目的にぴったりの「.NET勉強会」が、8月末にGrani×gloops×Sansan 3社合同で開催されました。
本稿では、そのセッション内容を詳しく紹介します。勉強会では、下記の4つのセッションがありましたので、それぞれ1記事として全4回の記事になります。
- 1[本稿]ASP.NET Identity とそのセキュリティ
- 2ローテクで .NET 技術トレンドの変化に立ち向かう!!
- 3Life with Roslyn ~30分間で分かったツモリになる Compiler as a Service
- 42014年版 C#でできること
本稿では、1のSansan株式会社の熊家賢治による「ASP.NET Identity」のセッション内容をご紹介します。本レポートは、話した内容をそのまま書き起こした形式となります。
Sansan主催の「.NET勉強会」について
Sansan株式会社は、スキルアップを目指す.NETエンジニアのための勉強会を定期的に開催しています。本稿は、アニバーサリー企画としてGrani×gloops×Sansanの3社合同で開催された第5回(開催:2014年8月30日、モデレーター:Sansan株式会社 藤倉成太)の内容をレポートしたものです。第5回では、株式会社グラニより田中孝佳氏、株式会社gloopsより山本昭宏氏をゲストに迎え、Sansan株式会社の渋木宏明、熊家賢治とともに、.NETの最新技術や活用状況に関するセッションを行いました。
ASP.NET Identity ― Sansan株式会社 熊家 賢治
セッションスライド
本セッションでは、ASP.NET Identityの登場の背景、機能と構成を知ることを目的とします。
ASP.NETの資格管理技術の歴史と課題
ASP.NETでは、1.0時代にはAPIレベルの認証・資格技術、2.0時代にはASP.NETメンバーシッププロバイダーを使用していました。2013年に発表されたOne ASP.NETでは、新しい資格管理技術としてASP.NET Identityを使用します。
――ASP.NET 1.0時代(2002~2005年)
ASP.NET 1.0には、認証技術として、Windows認証、フォーム認証、Passport認証の3種類がありました。いずれもコントロールなどはなく、APIが提供されていました。
認可技術には、ファイル認定とURL認定があります。ファイル認定は、Windows認定を行うときの認可手段で、ローカルシステム上でACL(アクセス制御リスト)によりユーザーのアクセスを制御します。URL認定は、個別のURLに対してWeb.configファイルでアクセスを許可または拒否するユーザーを指定します。
基本的に、ASP.NET 1.0では、独自にAPIなどを利用して認証/認可処理を作成する必要がありました。
――ASP.NET 2.0時代(2005年~2013年)
ASP.NET 2.0になると、ASP.NETメンバーシップという仕組みが導入されました。
ASP.NET 1.0時代からの変更点は次の通りです。
- Login、LoginView、ChangePasswordなど、資格管理のための標準コントロールを利用できる
- SqlMembershipProvider、ActiveDirectoryMembershipProviderなどのメンバーシッププロバイダーを利用してデータストアにアクセスできる
メンバーシッププロバイダーは、データストアへのアクセスなどASP.NET 1.0のAPIをまとめるファサードです。
ASP.NET 2.0では、資格管理関連のコントロールやメンバーシッププロバイダーにより、一部制約はあるものの、ほぼノンコーディングで認証/認可処理を実行できるようになりました。
――メンバーシッププロバイダーの課題
ASP.NET 2.0では認証/認可処理が容易になりましたが、メンバーシッププロバイダーには非常に多くの課題がありました。
まず、基本的にはフルセットのSQL Serverを前提としています。無償のSQL Server Compact Editionでは機能が足りなくて動かず、カスタマイズが必要になります。
また、メンバーシップの構造や仕組みがSQL Serverのスキーマに大きく依存しているため、OracleやMySQLといった他のデータストアでは使いにくいという問題点もあります。
それ以外にも、ユニットテストが困難、ソーシャルログインに未対応、メンバーシッププロバイダーのカスタマイズが大変といった課題がありました。
ASP.NET Identityの特徴
――ASP.NET Identityは資格管理フレームワーク
ASP.NET Identityは、One ASP.NET、分かりやすく言えばASP.NET MVC 5から新しく導入された資格管理フレームワークです。マイクロソフトは、ASP.NETメンバーシッププロバイダーにあった多くの課題を解決するために、スクラッチから設計して実装しました。現在のバージョンは2.1.0です。本日の勉強会での内容も2.1.0をベースにしています。
――ASP.NET Identityの大まかな特徴
ASP.NET Identityの特徴を簡単に説明しましょう。
まず、インストールが簡単です。NuGetを利用することで、コンポーネントを容易に配布できるようになりました。
認証に関して、IDとパスワードなどの基本情報に誕生日や出身地などの独自情報を追加するといったカスタマイズが容易です。
Entity Frameworkとの連携を前提にしており、Entity Frameworkの自動マイグレーションによる拡張もすごく簡単に実行できます。
SQL Server以外のデータストアの利用、ユニットテストが容易になり、FacebookやTwitterを使った認証にも標準で対応しています。
また、ASP.NET Identityは、OWIN(Open Web Interface for .NET: .NETのWebサーバー/アプリ向けの、オープンな標準インターフェース)との連携を前提に作られています。
――[メンバーシッププロバイダーの課題]フルセットのSQL Serverを前提としており、それ以外のデータストアでは使いにくい
ASP.NET Identityは、固有のデータベース機能に依存しないように設計されています。数多くのインターフェースがありますが、データベースに依存するのはUserStore
というインターフェースのみです。
そのため、MySQLやMongoDBなどのデータストアを使う場合には、UserStore
インターフェースを継承したクラスを自分で実装することで、簡単にカスタマイズ可能です。
――[メンバーシッププロバイダーの課題]メンバーシップの構造がSQL Serverのスキーマに大きく依存している
メンバーシッププロバイダーでは、認証に使うスキーマが固定されており、独自のユーザー情報は別のテーブルで管理する必要がありました。ASP.NET Identityでは、既存のユーザー情報と独自のユーザー情報を統合し、1つのテーブルで管理できます。
また、Entity Frameworkとの連携により、自動マイグレーションが可能です。コードファーストでスキーマを変更できるため、拡張が容易になりました。
――[メンバーシッププロバイダーの課題]ユニットテストが困難、メンバーシッププロバイダーのカスタマイズが大変
ASP.NET Identityでは、細かい粒度で多くのインターフェースを用意することで、これらの課題を解決しています。
細かい機能でインターフェースを用意しているため、全体的に疎結合を実現しており、カスタマイズが容易です。また、既定の実装もあり、カスタマイズが不要なときに利用できます。
ASP.NET Identityの機能
――どのような機能があるか
まず、ASP.NET Identityは、非同期処理をサポートしています。メソッドの大半は非同期メソッドです。
アカウント検証機能が強化されています。パスワードのリセットやアカウントのロックアウトなどの機能がフレームワークレベルで提供されています。
二要素認証およびソーシャルログインに対応しています。
また、「セキュリティスタンプによる、どこでもサインアウト」が可能です。これは、複数の場所で別のブラウザーからサービスにログインしたとき、一方のブラウザーでアカウントのパスワードなどのアカウント情報に大きな変更があったときに、もう一方のブラウザーからのセッションを強制的にサインアウトさせる仕組みです。これもWebアプリ開発では当たり前の機能ですが、ASP.NET Identityではフレームワークレベルでサポートされるようになりました。
ASP.NET Identityの構成
――ASP.NET Identityの名前空間
ASP.NET Identityには、基本的に3つの名前空間があります。
Microsoft.AspNet.Identity.Core
名前空間は、基本機能を実装しています。ユーザー、ロール、データストアを表すインターフェースやマネージャーなどです。
Microsoft.AspNet.Identity.EntityFramework
名前空間は、Identity.Coreが持つインターフェースをEntity Frameworkに合わせて実装しています。DbContextクラスなどを含みます。
Microsoft.AspNet.Identity.Owin
名前空間は、OWINミドルウェア、暗号化トークンプロバイダー、OWINの拡張メソッドなどを持ちます。
――ASP.NET Identityの処理の流れ
ASP.NET Identityは基本的にアプリケーション内で動作します。
IISなどのホストがリクエストを受けると、CookieAuthenticationMiddleware
などのOWINミドルウェアに渡して認証を行います。その後、アプリケーション内のASP.NET Identityに渡されます。
ASP.NET Identityは、アプリケーションの外側ではなく、アプリケーション内のコントローラーやサービスなどのレベルで動くことに注目してください。
――アプリケーション内でのASP.NET Identityの位置
アプリケーションにおけるASP.NET Identityの位置は次の図のようになります。
ASP.NETアプリケーションがUserManager
クラスなどのマネージャーを呼び出し、マネージャーがUserStore
クラスなどのユーザストアを呼び出します。ユーザストアはデータアクセスを担当するデータアクセス層を呼び出します。データアクセス層の下にデータベースがあります。マネージャーとユーザストアはIdentity.Core
名前空間(ただし、SignInManager
クラスは除く)、データアクセス層はIdentity.EntityFramework
名前空間に含まれます。
――Identity.Coreの主要素
ASP.NET Identityの基本機能を提供するIdentity.Core
名前空間の主な要素を紹介します。
IUser<TKey>
は、認証に使う資格情報の主要なインターフェースです。
IUserStore<TUser>
、IRoleStore
、IUserClaimStore<TUser>
、IUserEmailStore<TUser>
などは、データアクセスのためのインターフェースです。かなり細かいレベルで機能が分割されています。例えば、IUserEmailStore<TUser>
は、電子メール関連の資格情報を扱うためのプリミティブなインターフェースです。
UserManager<TUser>
、RoleManager<TUser>
、SignInManager
などのクラスは、資格情報を扱うためのファサードになります。
その他に、IUserTokenProvider<TUser, TKey>
やIPasswordHasher
などのインターフェースがあります。IPasswordHasher
インターフェースは、データベースに保存するときにパスワードをハッシュ化する機能を表します。
――OWINミドルウェアなどの外部認証処理
FacebookやGoogleなどの認証処理は、ASP.NET Identityの内部ではなく、OWINミドルウェアとして実装されています。OWINミドルウェアなどの外部認証処理がASP.NET Identityの該当するインターフェースを呼び出すと、ASP.NET Identityは認証処理に必要な情報を渡し、外部認証処理に認証を実行してもらうという仕組みになっています。
ASP.NET Identity 3.0.0以降
GitHubではASP.NET Identity 3.0.0の開発が進んでいます。今後の方向性として、
- ユーザーのインターフェースである
IUser
の廃止 - トークンマネージャーの追加
- 認証関連のイベントの追加
- Web以外のプラットフォームのサポート
- Active Directory連携のOWINミドルウェア
などが挙げられています。リリース時期は未定です。
■
次回は、Sansan株式会社の渋木宏明による「Life with Roslyn」のセッション内容をご紹介します。
※以下では、本稿の前後を合わせて5回分(第1回~第5回)のみ表示しています。
連載の全タイトルを参照するには、[この記事の連載 INDEX]を参照してください。
1. 【現在、表示中】≫ .NET最新技術「ASP.NET Identity」とは?
ASP.NETの資格管理技術がどう進化して、最新のASP.NET Identityが生まれたのか紹介。また、その特徴と機能、構成、処理の流れなどを解説する。
2. 10分間で人に説明できるまで分かるCompiler as a Service“Roslyn”
Visual Studio “14”の新機能として搭載予定の次期コンパイラープラットフォーム“Roslyn”について、簡単に話せるレベルになるまで、ほんの少しだけ踏み込んで解説。
3. C#&.NETの進化と、次期版でできること(2014年版)
さまざまなプラットフォーム向けのプログラムを開発できるまでに進化してきたC#。その内容と特徴を、プラットフォームごとにまとめる。また今後のC#/.NETがどのように進化するかも紹介する。
4. 破壊的に進化する.NET技術のトレンド変化に立ち向かう
数年で根本から大きく変更される.NET技術。そんなトレンド変化に追随するにはどうすればよいのか? gloopsで実践されている手法を具体的に説明する。
5. Xamarinで今日から始めるクロスプラットフォーム開発
クロスプラットフォームアプリ開発の戦略についてまとめ、Xamarinによるアプリ開発の特徴を説明する。また、Xamarinに関する情報収集や、Xamarin.Forms×MVVMによる開発のポイントを紹介する。