Deep Insider の Tutor コーナー
>>  Deep Insider は本サイトからスピンオフした姉妹サイトです。よろしく! 
.NETエンジニアのための定期勉強会(Sansan主催)レポート

.NETエンジニアのための定期勉強会(Sansan主催)レポート

.NET最新技術「ASP.NET Identity」とは?
― Grani×gloops×Sansan 3社合同 アニバーサリー企画 第5回 勉強会[1]―

2014年10月29日

ASP.NETの資格管理技術がどう進化して、最新のASP.NET Identityが生まれたのか紹介。また、その特徴と機能、構成、処理の流れなどを解説する。

Sansan株式会社 熊家 賢治
  • このエントリーをはてなブックマークに追加

 .NETの最新技術情報を効率的に収集するには、どうすればよいのでしょうか。そんな目的にぴったりの「.NET勉強会」が、8月末にGrani×gloops×Sansan 3社合同で開催されました

 本稿では、そのセッション内容を詳しく紹介します。勉強会では、下記の4つのセッションがありましたので、それぞれ1記事として全4回の記事になります。

 本稿では、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は基本的にアプリケーション内で動作します。

図1 ASP.NET Identityの処理の流れ

 IISなどのホストがリクエストを受けると、CookieAuthenticationMiddlewareなどのOWINミドルウェアに渡して認証を行います。その後、アプリケーション内のASP.NET Identityに渡されます。

 ASP.NET Identityは、アプリケーションの外側ではなく、アプリケーション内のコントローラーやサービスなどのレベルで動くことに注目してください。

――アプリケーション内でのASP.NET Identityの位置

 アプリケーションにおけるASP.NET Identityの位置は次の図のようになります。

図2 アプリケーション内におけるASP.NET Identityの位置

 ASP.NETアプリケーションがUserManagerクラスなどのマネージャーを呼び出し、マネージャーがUserStoreクラスなどのユーザストアを呼び出します。ユーザストアはデータアクセスを担当するデータアクセス層を呼び出します。データアクセス層の下にデータベースがあります。マネージャーとユーザストアはIdentity.Core名前空間(ただし、SignInManagerクラスは除く)、データアクセス層はIdentity.EntityFramework名前空間に含まれます。

――Identity.Coreの主要素

 ASP.NET Identityの基本機能を提供するIdentity.Core名前空間の主な要素を紹介します。

 IUser<TKey>は、認証に使う資格情報の主要なインターフェースです。

 IUserStore<TUser>IRoleStoreIUserClaimStore<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]を参照してください。

.NETエンジニアのための定期勉強会(Sansan主催)レポート
1. 【現在、表示中】≫ .NET最新技術「ASP.NET Identity」とは?

ASP.NETの資格管理技術がどう進化して、最新のASP.NET Identityが生まれたのか紹介。また、その特徴と機能、構成、処理の流れなどを解説する。

.NETエンジニアのための定期勉強会(Sansan主催)レポート
2. 10分間で人に説明できるまで分かるCompiler as a Service“Roslyn”

Visual Studio “14”の新機能として搭載予定の次期コンパイラープラットフォーム“Roslyn”について、簡単に話せるレベルになるまで、ほんの少しだけ踏み込んで解説。

.NETエンジニアのための定期勉強会(Sansan主催)レポート
3. C#&.NETの進化と、次期版でできること(2014年版)

さまざまなプラットフォーム向けのプログラムを開発できるまでに進化してきたC#。その内容と特徴を、プラットフォームごとにまとめる。また今後のC#/.NETがどのように進化するかも紹介する。

.NETエンジニアのための定期勉強会(Sansan主催)レポート
4. 破壊的に進化する.NET技術のトレンド変化に立ち向かう

数年で根本から大きく変更される.NET技術。そんなトレンド変化に追随するにはどうすればよいのか? gloopsで実践されている手法を具体的に説明する。

.NETエンジニアのための定期勉強会(Sansan主催)レポート
5. Xamarinで今日から始めるクロスプラットフォーム開発

クロスプラットフォームアプリ開発の戦略についてまとめ、Xamarinによるアプリ開発の特徴を説明する。また、Xamarinに関する情報収集や、Xamarin.Forms×MVVMによる開発のポイントを紹介する。

サイトからのお知らせ

Twitterでつぶやこう!