ASP.NET MVC 4のSimpleMembershipガイド

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とは





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が作成したテーブル



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を操作するための次のメカニズムが実装されています。



ASP.NET MVC 4インターネットテンプレート





WebSecurityは、ExtendedMembershipProviderで動作します。 デフォルトでは、SimpleMembershipProviderが使用されますが、独自に実装することもできます。



SimpleMembershipのセットアップ



SimpleMembershipを既存のプロジェクトに追加する



このプロバイダーは、ASP.NET MVC 4インターネットテンプレートを使用するプロジェクトで既定で機能しますが、一部(自分を含む)は空のテンプレートからプロジェクトを作成します。 2つのリンクを追加する必要があります:WebMatrix.DataとWebMatrix.WebData。 または、同じ名前の識別子でNuGetを介してこれらのライブラリをインストールします)。



Webmatrixデータ



ここで、プロバイダーを追加し、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(); } }
      
      







または、データベースエディターでユーザー、ロールを直接作成し、ユーザーにロールを割り当てることができます。



参照資料






All Articles