ASP.NET MVC 4とWebMatrixの出現により、mvcチームは開発者にとって物事を簡単にするよう努めています。 レビューに基づいて、改善すべき分野の1つはasp.netセキュリティでした。
ASP.NET MVC 4インターネットプロジェクトテンプレートには、SimpleMembershipを使用して構築される非常に便利な新しい機能がいくつか追加されています。 SimpleMembershipは、ロールとユーザーの簡単なカスタマイズをもたらし、OAuthのサポートを追加しました。 ただし、新しいプロバイダーは、既存のASP.NETメンバーシッププロバイダーと互換性がありません。
この投稿では、SimpleMembershipとは何か、ASP.NET MVC 4プロジェクトでSimpleMembershipを使用する方法について説明します。
SimpleMembershipとは
- SimpleMembershipは、以前のバージョンのASP.NET Membership Provider(ASP.NET Role)を置き換えるように設計されています
- SimpleMembershipは同じタスクを解決しますが、開発者にとっては簡単になり、最新のセキュリティ要件に適合します。
AccountController
ASP.NET MVC 4プロジェクトテンプレートのAccountControllerにはSimpleMembershipが必要であり、古いバージョンと互換性がありません- 迷惑なニュースは、Webサイト管理ツール(WSAT)がSimpleMembershipと互換性がないことです。
ASP.NETメンバーシップシステムは2005年に導入されました。 多数のログインとパスワードを使用してサイトに登録する、SQL Serverデータベースにプロファイルを保存するなど、一般的な問題を解決するために開発されました。 また、MembershipProviderおよびRoleProviderの標準ロジックをオーバーライドする拡張メカニズムが追加されました。 8年前、このメカニズムはそのタスクに対処しましたが、今日では不便なツールです。 ユーザープロファイルに追加のフィールドが必要な場合、それらはすべて1つの列に格納され、アクセスのために適切なプロバイダーのAPI呼び出しにアクセスする必要があります。
ASP.NET WebPagesとWebMatrixは、RazorビューエンジンやSimpleMembershipなど、多くのものを再定義します。
ASP.NETメンバーシップの使用が推奨されない理由
次の条件が満たされている場合、標準プロバイダーは正常に動作します。すべての情報はSQL Serverデータベースのフルバージョンに格納され、必要なすべてのデータは属性セット(UserName、Password、IsApproved、CreationDate ...)として提示され、その他の情報が提供されますプロファイルプロバイダーを使用します。
完全なデフォルトSQL Serverが必要
ほとんどのフル機能のASP.NETプロバイダーには、フルバージョンのSQL Serverが必要です(ストアドプロシージャ、SQL Serverキャッシュ、およびその他のサーバー機能の作業に依存しているため)。 また、既定のプロバイダーはSQL Azureでは機能しません。
別のデータベースでの作業の難しさ
SQL Server以外のデータベースを使用するには、リレーショナルデータベースにデータを保存することに重点を置いたプロバイダーメソッドのセットを再定義する必要があります。 第一に、これはこれらのメソッドを再定義するための大量の作業であり、第二に、ほとんどの場合、コードを描画しない
System.NotImplementedException
を含む多くの未定義のメソッドがあります。
ユーザーの方向ユーザー>ロール
既存のデータプロバイダーは、ユーザーがユーザー名とパスワードを持っているこのモデルに厳密に焦点を合わせています。 もちろん、APIを介して追加情報を追加できますが、このようなモデルはOAuthには適していません(ユーザーはそこにパスワードを持っていません)。
役割指向システムは常に適切であるとは限りません;個々のオブジェクトまたはアクションへのアクセス権のモデルを使用する方が便利な場合があります(クレーム)
多数のblob列を持つ堅牢なデータベーススキーマも必要です。
SimpleMembership拡張ユーザーシステム
SimpleMembershipは、上記の問題を解決するために開発されました。
Matthew Osbornの
投稿で、
ASP.NET WebPagesでSimpleMembershipを使用することで、SimpleMembershipはデータベースとシームレスに統合するように設計されている
と説明しています。
SimpleMembershipでは、ユーザーテーブルに「ID」と「UserName」の2つの列が必要です。 ここで重要なのは、これらの列に任意の名前を付けることができることです。
次に、これについてSimpleMembershipに指示する必要があります。接続文字列をデータベースに追加します。
<connectionStrings> <add name="DefaultConnection" connectionString="Data Source=ARCTURUS\SQLEXPRESS;Initial Catalog=MembershipDemoDB;Integrated Security=True;Pooling=False" providerName="System.Data.SqlClient" /> </connectionStrings>
そして、初期化を決定します。
WebSecurity.InitializeDatabaseConnection("DefaultConnection", "Users", "Id", "Name", autoCreateTables: true);
サイトを開始して初期化属性を処理した後、SimpleMembershipはそのサイトが機能するために必要なテーブルを作成します。 ユーザー表はユーザー表として使用されます。
SimpleMembershipは、SQL Serverの全ライン(SQL Azure、SQL Server CE、SQL Server Express、およびLocalDB)で動作します。 すべてがSQL呼び出しとして実装され、ストアドプロシージャを使用するよりもはるかに優れています。
Code FirstでのEntityFrameworkの使用
ASP.NETメンバーシップの問題は、アカウント自体に関する追加情報が保存されることです。 これは、プロファイルデータに直接アクセスできないことを意味します。 SimpleMembershipは、どのテーブルとどのようにユーザーデータが保存されるかを気にしません。 テーブルをユーザーで簡単に変更できます。たとえば、アドレスを追加します。
[Table("Users")] public class UserProfile { [Key] [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] public int Id { get; set; } public string Name { get; set; } public string Address { get; set; } }
これで、プロバイダー自体ではなく、データベースから直接このフィールドに簡単にアクセスできます。 これにより、SimpleMembershipをデータベースとASP.NETメンバーシップシステム間のレイヤーとして受け入れることができます。
実装方法は省略します。元の
SimpleMembershipレコードで確認できます。 SimpleMembershipはExtendedMembershipProviderから継承されることを知っておくことが重要です。
ASP.NET MVC 4インターネットテンプレート
デフォルトのテンプレートでは、SimpleMembershipを操作するための次のメカニズムが実装されています。
- AccountModel.csは、基本的なユーザーアカウントを記述し、データベースの属性を含みます
- InitializeSimpleMembershipAttribute.csには、プロバイダーを初期化するための情報(使用するデータベース、フィールド、その他の設定)のみが含まれています。
- AccountController.csには、WebMatrixライブラリのWebSecurityクラスへの呼び出しが含まれています。
WebSecurityは、ExtendedMembershipProviderで動作します。 デフォルトでは、SimpleMembershipProviderが使用されますが、独自に実装することもできます。
SimpleMembershipのセットアップ
SimpleMembershipを既存のプロジェクトに追加する
このプロバイダーは、ASP.NET MVC 4インターネットテンプレートを使用するプロジェクトで既定で機能しますが、一部(自分を含む)は空のテンプレートからプロジェクトを作成します。 2つのリンクを追加する必要があります:WebMatrix.DataとWebMatrix.WebData。 または、同じ名前の識別子でNuGetを介してこれらのライブラリをインストールします)。
ここで、プロバイダーを追加し、WebMatrixの使用を示す必要があります
<roleManager enabled="true" defaultProvider="SimpleRoleProvider"> <providers> <clear /> <add name="SimpleRoleProvider" type="WebMatrix.WebData.SimpleRoleProvider,WebMatrix.WebData" /> </providers> </roleManager> <membership defaultProvider="SimpleMembershipProvider"> <providers> <clear /> <add name="SimpleMembershipProvider" type="WebMatrix.WebData.SimpleMembershipProvider, WebMatrix.WebData" /> </providers> </membership>
WSATは使用できないため、ユーザーとロールを作成するには2つの方法があります。 EntityFramework Code Firstモデルを使用する場合、デフォルトユーザーの作成にMicragionを追加すると便利です。
public partial class AddDefaultUser : DbMigration { public override void Up() { if (!WebSecurity.Initialized) { WebSecurity.InitializeDatabaseConnection("DefaultConnection", "Users", "Id", "UserName", autoCreateTables: true); } var roles = (SimpleRoleProvider)Roles.Provider; var membership = (SimpleMembershipProvider)Membership.Provider; if (!roles.RoleExists("Admin")) { roles.CreateRole("Admin"); } if (membership.GetUser("Admin", false) == null) { membership.CreateUserAndAccount("Admin", "SuperAdminPassword"); } if (!roles.GetRolesForUser("Admin").Contains("Admin")) { roles.AddUsersToRoles(new[] { "Admin" }, new[] { "Admin" }); } } public override void Down() { throw new NotImplementedException(); } }
または、データベースエディターでユーザー、ロールを直接作成し、ユーザーにロールを割り当てることができます。
参照資料