ASP.NET ID の概要
ASP.NET メンバーシップ システムは、2005 年に ASP.NET 2.0 で導入され、それ以来、Web アプリケーションが通常認証と承認を処理する方法に多くの変更が加えられました。 ASP.NET ID は、Web、電話、またはタブレット用の最新のアプリケーションを構築する場合のメンバーシップ システムの外観を新たに示します。
最も安全な認証オプションを使用することをお勧めします。 Azure にデプロイされた .NET アプリについては、次を参照してください。
Azure Key Vault と .NET Aspire は、シークレットを格納および取得するための最も安全な方法を提供します。 Azure Key Vault は、証明書、接続文字列、パスワードなどの暗号化キーとシークレットを保護するクラウド サービスです。 .NET アスパイアについては、「ホスティングとクライアント統合の間のセキュリティで保護された通信を参照してください。
リソース所有者のパスワード資格情報の付与を避けてください。理由は次の通りです。
- ユーザーのパスワードをクライアントに公開します。
- 重大なセキュリティ リスクです。
- 他の認証フローが不可能な場合にのみ使用してください。
アプリがテスト サーバーにデプロイされている場合、環境変数を使用して、接続文字列をテスト データベース サーバーに設定できます。 環境変数は通常、プレーンで暗号化されていないテキストで格納されます。 マシンまたはプロセスが侵害された場合、信頼されていない関係者が環境変数にアクセスできます。 運用環境の接続文字列は最も安全な方法ではないため、環境変数を使用して格納しないことをお勧めします。
構成データのガイドライン:
- パスワードやその他の機密データは、構成プロバイダー コードやプレーン テキスト構成ファイルには保存しないでください。
- 開発環境またはテスト環境では、運用シークレットを使用しないでください。
- プロジェクトの外部でシークレットを指定して、ソース コード リポジトリに誤ってコミットされないようにします。
背景: ASP.NET のメンバーシップ
ASP.NET メンバーシップ
ASP.NET メンバーシップ は、2005 年に一般的であったサイト メンバーシップの要件を解決するように設計されています。この要件には、Forms Authentication と、ユーザー名、パスワード、プロファイル データ用の SQL Server データベースが含まれます。 現在、Web アプリケーションにはさまざまなデータ ストレージ オプションが用意されており、ほとんどの開発者は、サイトで認証と承認の機能にソーシャル ID プロバイダーを使用できるようにしたいと考えています。 ASP.NET メンバーシップの設計の制限により、この移行が困難になります。
- データベース スキーマは SQL Server 用に設計されており、変更することはできません。 プロファイル情報を追加することはできますが、追加のデータは別のテーブルにパックされるため、プロファイル プロバイダー API を使用する以外の方法ではアクセスが困難になります。
- プロバイダー システムではバッキング データ ストアを変更できますが、システムはリレーショナル データベースに適した想定に基づいて設計されています。 Azure Storage Tables などの非リレーショナル ストレージ メカニズムにメンバーシップ情報を格納するプロバイダーを作成できますが、NoSQL データベースに適用されないメソッドに対して多くのコードと多くの
System.NotImplementedException
例外を記述してリレーショナル設計を回避する必要があります。 - ログイン/ログアウト機能はフォーム認証に基づいているため、メンバーシップ システムでは OWIN
使用できません。 OWIN には、外部 ID プロバイダー (Microsoft アカウント、Facebook、Google、Twitter など) を使用したログインのサポート、オンプレミスの Active Directory または Azure Active Directory の組織アカウントを使用したログインなど、認証用のミドルウェア コンポーネントが含まれています。 OWIN には、OAuth 2.0、JWT、CORS のサポートも含まれています。
ASP.NET シンプル メンバーシップ
ASP.NET シンプルなメンバーシップ は、ASP.NET Web ページのメンバーシップ システムとして開発されました。 WebMatrix と Visual Studio 2010 SP1 でリリースされました。 Simple Membership の目的は、メンバーシップ機能を Web ページ アプリケーションに簡単に追加することでした。
Simple Membership を使用すると、ユーザー プロファイル情報を簡単にカスタマイズできるようになりましたが、ASP.NET メンバーシップに関するその他の問題は引き続き共有され、いくつかの制限があります。
- 非リレーショナル ストアにメンバーシップ システム データを保持するのは困難でした。
- OWIN では使用できません。
- 既存の ASP.NET メンバーシップ プロバイダーではうまく機能せず、拡張可能ではありません。
ASP.NET ユニバーサル プロバイダー
ASP.NET ユニバーサル プロバイダー は、Microsoft Azure SQL Database にメンバーシップ情報を保持できるように開発されており、SQL Server Compact でも機能します。 ユニバーサル プロバイダーは Entity Framework Code First に基づいて構築されています。つまり、ユニバーサル プロバイダーを使用して、EF でサポートされている任意のストアにデータを保持できます。 ユニバーサル プロバイダーでは、データベース スキーマもかなりクリーンアップされました。
ユニバーサル プロバイダーは、ASP.NET メンバーシップ インフラストラクチャ上に構築されているため、SqlMembership プロバイダーと同じ制限が引き続き適用されます。 つまり、リレーショナル データベース用に設計されており、プロファイルとユーザー情報をカスタマイズするのは困難です。 これらのプロバイダーでは、サインインとサインアウトの機能にもフォーム認証が引き続き使用されます。
ASP.NET アイデンティティ
ASP.NET のメンバーシップストーリーが長年にわたって進化するにつれて、ASP.NET チームは顧客からのフィードバックから多くのことを学びました。
ユーザーが自分のアプリケーションに登録したユーザー名とパスワードを入力してサインインするという前提は無効です。 Web はよりソーシャルになっています。 ユーザーは、Facebook、Twitter、その他のソーシャル Web サイトなどのソーシャル チャネルを通じて、リアルタイムで相互にやり取りしています。 開発者は、ユーザーが自分の Web サイトで豊富なエクスペリエンスを得ることができるように、ソーシャル ID を使用してサインインできるようにする必要があります。 最新のメンバーシップ システムでは、Facebook、Twitter などの認証プロバイダーへのリダイレクト ベースのログインを有効にする必要があります。
Web 開発が進化するにつれて、Web 開発のパターンも進化しました。 アプリケーション コードの単体テストは、アプリケーション開発者にとって重要な問題になりました。 2008 年 ASP.NET モデルView-Controller (MVC) パターンに基づく新しいフレームワークが追加され、開発者が単体テスト可能な ASP.NET アプリケーションを構築するのに役立ちます。 アプリケーション ロジックを単体テストする必要がある開発者も、メンバーシップ システムでこれを行えるようにしたいと考えていました。
Web アプリケーション開発におけるこれらの変更を考慮して、ASP.NET Identity は次の目標を持って開発されました。
One ASP.NET アイデンティティ システム
- ASP.NET ID は、ASP.NET MVC、Web フォーム、Web ページ、Web API、SignalR など、すべての ASP.NET フレームワークで使用できます。
- ASP.NET ID は、Web、電話、ストア、またはハイブリッド アプリケーションを構築するときに使用できます。
ユーザー に関するプロファイル データを簡単に接続できます
- ユーザー情報とプロファイル情報のスキーマを制御できます。 たとえば、ユーザーがアプリケーションにアカウントを登録するときに入力した生年月日をシステムで簡単に保存できます。
永続化コントロール
- 既定では、ASP.NET ID システムは、すべてのユーザー情報をデータベースに格納します。 ASP.NET ID では、Entity Framework Code First を使用して、その永続化メカニズムをすべて実装します。
- データベース スキーマを制御するため、テーブル名の変更や主キーのデータ型の変更などの一般的なタスクは簡単に実行できます。
System.NotImplementedExceptions
例外をスローすることなく、SharePoint、Azure Storage Table Service、NoSQL データベースなどのさまざまなストレージ メカニズムを簡単にプラグインできます。
ユニット テストが可能
- ASP.NET ID を使用すると、Web アプリケーションの単体テストが可能になります。 ASP.NET ID を使用するアプリケーションの部分の単体テストを記述できます。
ロール プロバイダー
- ロール プロバイダーがあり、ロールによってアプリケーションの一部へのアクセスを制限できます。 "管理者" などのロールを簡単に作成し、ロールにユーザーを追加できます。
クレームベース
- ASP.NET ID はクレーム ベースの認証をサポートします。ここで、ユーザーの ID はクレームのセットとして表されます。 クレームを使用することで、開発者はロールを使用するよりも、ユーザーのアイデンティティをより表現豊かに記述することができます。 ロール メンバーシップはブール値 (メンバーまたは非メンバー) に過ぎませんが、要求にはユーザーの ID とメンバーシップに関する豊富な情報を含めることができます。
ソーシャル ログイン プロバイダー
- Microsoft アカウント、Facebook、Twitter、Google などのソーシャル ログインをアプリケーションに簡単に追加し、ユーザー固有のデータをアプリケーションに格納できます。
OWIN 統合
- ASP.NET 認証は、任意の OWIN ベースのホストで使用できる OWIN ミドルウェアに基づいています。 ASP.NET ID は System.Web に依存しません。 これは完全に準拠した OWIN フレームワークであり、OWIN でホストされている任意のアプリケーションで使用できます。
- ASP.NET Id は、Web サイト内のユーザーのログイン/ログアウトに OWIN 認証を使用します。 つまり、FormsAuthentication を使用して Cookie を生成する代わりに、アプリケーションは OWIN CookieAuthentication を使用してこれを行います。
NuGet パッケージ
- ASP.NET ID は、Visual Studio 2017 に付属する ASP.NET MVC、Web フォーム、Web API テンプレートにインストールされている NuGet パッケージとして再配布されます。 この NuGet パッケージは、NuGet ギャラリーからダウンロードできます。
- ASP.NET ID を NuGet パッケージとしてリリースすると、ASP.NET チームは新機能やバグ修正を簡単に繰り返し実行でき、アジャイルな方法で開発者に提供できます。
ASP.NET Identity の使い始め方
ASP.NET ID は、ASP.NET MVC、Web フォーム、Web API、SPA 用の Visual Studio 2017 プロジェクト テンプレートで使用されます。 このチュートリアルでは、プロジェクト テンプレートで ASP.NET ID を使用して、ユーザーを登録、サインイン、サインアウトする機能を追加する方法について説明します。
ASP.NET ID は、次の手順を使用して実装されます。 この記事の目的は、ASP.NET ID の概要を説明することにあります。あなたはステップバイステップでそれに従うか、単に詳細を読むことができます。 新しい API を使用してユーザー、ロール、プロファイル情報を追加するなど、ASP.NET ID を使用してアプリを作成する方法の詳細については、この記事の最後にある「次の手順」セクションを参照してください。
個々のアカウントを使用して ASP.NET MVC アプリケーションを作成します。 ASP.NET ID は、ASP.NET MVC、Web フォーム、Web API、SignalR などで使用できます。この記事では、ASP.NET MVC アプリケーションから始めます。
の画像
作成されたプロジェクトには、ASP.NET ID 用の次の 3 つのパッケージが含まれています。
Microsoft.AspNet.Identity.EntityFramework
このパッケージには、ASP.NET ID データとスキーマを SQL Server に保持する、ASP.NET ID の Entity Framework 実装が含まれています。Microsoft.AspNet.Identity.Core
このパッケージには、ASP.NET ID のコア インターフェイスがあります。 このパッケージを使用して、Azure Table Storage、NoSQL データベースなど、さまざまな永続化ストアを対象とする ASP.NET ID の実装を記述できます。Microsoft.AspNet.Identity.OWIN
このパッケージには、ASP.NET アプリケーションで OWIN 認証と ASP.NET ID を接続するために使用される機能が含まれています。 これは、アプリケーションにサインイン機能を追加し、OWIN Cookie 認証ミドルウェアを呼び出して Cookie を生成するときに使用されます。
ユーザーの作成。
アプリケーションを起動し、[ 登録] リンクをクリックしてユーザーを作成します。 次の図は、ユーザー名とパスワードを収集する [登録] ページを示しています。の画像
ユーザーが [Register] ボタンを選択すると、アカウント コントローラーの
Register
アクションによって、次に示すように、ASP.NET Identity API を呼び出してユーザーが作成されます。[HttpPost] [AllowAnonymous] [ValidateAntiForgeryToken] public async Task<ActionResult> Register(RegisterViewModel model) { if (ModelState.IsValid) { var user = new ApplicationUser() { UserName = model.UserName }; var result = await UserManager.CreateAsync(user, model.Password); if (result.Succeeded) { await SignInAsync(user, isPersistent: false); return RedirectToAction("Index", "Home"); } else { AddErrors(result); } } // If we got this far, something failed, redisplay form return View(model); }
サインイン。
ユーザーが正常に作成された場合は、SignInAsync
メソッドによってサインインされます。[HttpPost] [AllowAnonymous] [ValidateAntiForgeryToken] public async Task<ActionResult> Register(RegisterViewModel model) { if (ModelState.IsValid) { var user = new ApplicationUser { UserName = model.Email, Email = model.Email }; var result = await UserManager.CreateAsync(user, model.Password); if (result.Succeeded) { await SignInManager.SignInAsync(user, isPersistent:false, rememberBrowser:false); // For more information on how to enable account confirmation and password reset please visit https://go.microsoft.com/fwlink/?LinkID=320771 // Send an email with this link // string code = await UserManager.GenerateEmailConfirmationTokenAsync(user.Id); // var callbackUrl = Url.Action("ConfirmEmail", "Account", new { userId = user.Id, code = code }, protocol: Request.Url.Scheme); // await UserManager.SendEmailAsync(user.Id, "Confirm your account", "Please confirm your account by clicking <a href=\"" + callbackUrl + "\">here</a>"); return RedirectToAction("Index", "Home"); } AddErrors(result); } // If we got this far, something failed, redisplay form return View(model); }
SignInManager.SignInAsync
メソッドは、ClaimsIdentityを生成します。 ASP.NET ID と OWIN Cookie 認証はクレーム ベースのシステムであるため、フレームワークではアプリがユーザーの ClaimsIdentity を生成する必要があります。 ClaimsIdentity には、ユーザーが属しているロールなど、ユーザーのすべての要求に関する情報があります。ログアウトする。
[ログオフ] リンクを選択して、アカウント コントローラーで LogOff アクションを呼び出します。// POST: /Account/LogOff [HttpPost] [ValidateAntiForgeryToken] public ActionResult LogOff() { AuthenticationManager.SignOut(); return RedirectToAction("Index", "Home"); }
上で強調表示されているコードは、OWIN
AuthenticationManager.SignOut
メソッドを示しています。 これは、Web フォームの FormsAuthentication モジュールで使用される FormsAuthentication.SignOut メソッドに似ています。
ASP.NET ID のコンポーネント
次の図は、ASP.NET ID システムのコンポーネントを示しています (この
前に説明していない NuGet パッケージの簡単な説明を次に示します。
- Microsoft.Owin.Security.Cookies
ASP.NET のフォーム認証に似て、アプリケーションでクッキーを用いた認証が可能になるミドルウェア。 - EntityFramework
Entity Framework は、リレーショナル データベースに対して Microsoft が推奨するデータ アクセス テクノロジです。
メンバーシップから ASP.NET ID への移行
ASP.NET メンバーシップまたはシンプル メンバーシップを使用する既存のアプリを新しい ASP.NET ID システムに移行するためのガイダンスを間もなく提供したいと考えています。
次の手順
- Facebook と Google OAuth2 と OpenID のサインオン を使用して ASP.NET MVC 5 アプリを作成する
このチュートリアルでは、ASP.NET Identity API を使用して、プロファイル情報をユーザー データベースに追加し、Google と Facebook で認証する方法について説明します。 - 認証と SQL DB を使用して ASP.NET MVC アプリを作成し、Azure App Service にデプロイする
このチュートリアルでは、Identity API を使用してユーザーとロールを追加する方法について説明します。 - https://github.com/rustd/AspnetIdentitySample
基本的なロールとユーザー サポートを追加する方法と、ロールとユーザー管理を行う方法を示すサンプル アプリケーション。