Microsoft .NETのASP.NET Identityテクノロジーの出現により、開発者はWebアプリケーションの作成にますますそれを使用しています。 テクノロジーについて簡単に説明するために、
記事を読むことをお勧め
します 。 このテクノロジーは標準プロジェクトテンプレートに含まれており、認証およびユーザー認証機能の標準実装を使用できます。
デフォルトでは、ASP.NET IdentityのデータプロバイダーはMSSQLですが、Identity認証システムは他のリレーショナルDBMSと対話できるため、InterSystemsCachéのこの機能を調査して実装しました。
まず、これは何のためですか? プロジェクトで.NET上のCachéDBMSを使用し、完全で信頼性の高い認証システムが必要だと想像してください。 もちろん、このようなシステムを手作業でゼロから作成することは非常に非現実的であり、.NET-ASP.NET Identityの既存のアナログを使用する必要があります。 しかし、その純粋な形式では、フレームワークはネイティブのMicrosoft DBMS-MS SQLでのみ機能します。 私たちのタスクは、わずかな手を動かすだけでIdentityをシステム間キャッシュDBMSに移植できるアダプターを実装することでした。 タスクは、ASP.NET IdentityCachéプロバイダーに実装されました。
ASP.NET IdentityCachéプロバイダープロジェクトの本質は、ASP.NET IdenityのCachéデータプロバイダーを実装することです。 主なタスクは、テーブル
AspNetRoles 、
AspNetUserClaims 、
AspNetUserLogins 、
AspNetUserRoles 、および
AspNetUsersを 格納し 、
それらへのアクセスを提供すること
でした 。これらのテーブルを操作する標準ロジックに違反することはあり
ませんでした 。
ASP.NET IDアーキテクチャに関するいくつかの言葉Asp.Net Identityの主要なオブジェクトは、ユーザーとロールです。 ユーザーを作成および削除し、ユーザーリポジトリと対話するためのすべての機能は、
UserManagerクラスに格納されます。 ロールを使用して管理するには、Asp.Net Identityで
RoleManagerクラスを定義します。 以下は、Microsoft.AspNet.Identity.Coreクラス図です。
UserManagerの各ユーザーは、
IUserインターフェイス
オブジェクトを提供し
ます 。 同時に、すべてのユーザー管理操作は、
IUserStoreオブジェクトによって表されるストレージを介して実行されます。 各役割は
IRoleインターフェイスの実装を表し、役割の操作(追加、変更、削除)はRoleManagerを使用して実行されます。
IUser 、
IRole 、
IUserStore 、および
IRoleStoreインターフェースの直接実装は、Microsoft.AspNet.Identity EntityFramework名前空間を提供します。ここでは、
IdentityUser 、
UserStore 、
IdentityRole 、
RoleStore 、
IdentityDbContextなどのクラスを使用できます。
デフォルトで指定されたテーブルにないユーザーに関する追加情報を保存する必要がある場合、
IdentityUserClaimクラス(ホールマーク)があります。これにより、ユーザーの登録などに必要なフィールドを追加して使用できます。
ASP.NET IdentityのCachéデータプロバイダの実装に進みましょう。 次の2段階で行われました。
-データストレージクラス(状態の格納を担当)と
IdentityDbContextクラスの実装。これは、データウェアハウスを操作するためのすべての低レベルロジックをカプセル化します。
IdentityDbInitializerクラスも実装され、CachéデータベースをIdentityで動作するように適合させました。
-UserStoreおよび
RoleStoreクラスの実装(統合とともに)
テスト)。 デモンストレーションプロジェクト。
最初の段階で、次のクラスが実装されました。
-IdentityUser -
IUserインターフェイスの実装。
-IdentityUserRole-ユーザー-ロール通信の関連エンティティ。
-IdentityUserLogin-ユーザーのログインに関するデータ。
UserLoginInfoクラスの拡張可能なバージョン。
-IdentityUserClaim-ユーザーのブランド情報。
-IdentityDbContext <TUser、TRole、TKey、TUserLogin、TUserRole、TUserClaim>-Entity Frameworkデータベースコンテキスト。
IdentityUserのIDをより詳細に検討します。これは、ユーザー、ロール、ログイン、ブランド、およびユーザーとロールの関係のリポジトリです。
IdentityUserの共通および汎用バージョンの実装例。
namespace InterSystems.AspNet.Identity.Cache {
Identityにアクセス権の制限を実装するために、特別なオブジェクト(ロール)が設計されています。 構成内のロールは、さまざまなユーザーグループのロールまたはアクティビティに対応する場合があります。
namespace InterSystems.AspNet.Identity.Cache {
IdentityDbContext-接続の作成をカプセル化するエンティティ。データベースからエンティティをロードし、ユーザーオブジェクトと関連テーブルおよびフィールド値の構造との対応を検証します。 例として、ID要件に従ってテーブルを検証する
OnModelCreatingメソッドを考えます。
protected override void OnModelCreating(DbModelBuilder modelBuilder) {
DbModelBuilderは、CLRクラスをデータベーススキーマにマップするために使用されます。 EDMモデルを構築するこのコードベースのアプローチは、コードファーストと呼ばれます。
DbModelBuilderは通常、
OnModelCreating(DbModelBuilder)をオーバーライドしてモデルをカスタマイズするために使用されます。 ただし、
DbModelBuilderを
DbContextから独立して使用してモデルを構築し、
DbContextまたは
ObjectContextを構築することもでき
ます 。
IdentityDbInitializerクラスは、
Identityで使用するCachéデータベースを準備します。
public void InitializeDatabase(DbContext context) { using (var connection = BuildConnection(context)) { var tables = GetExistingTables(connection); CreateTableIfNotExists(tables, AspNetUsers, connection); CreateTableIfNotExists(tables, AspNetRoles, connection); CreateTableIfNotExists(tables, AspNetUserRoles, connection); CreateTableIfNotExists(tables, AspNetUserClaims, connection); CreateTableIfNotExists(tables, AspNetUserLogins, connection); CreateIndexesIfNotExist(connection); } }
CreateTableIfNotExistsメソッドは、必要なテーブルを作成します(まだ存在しない場合)。 テーブルの存在の確認は、既存のテーブルに関する情報を保存する
Cacheテーブル-Dictionary.CompiledClassにクエリを実行することで行われます。 テーブルがまだ作成されていない場合は、作成されます。
第2段階では、IdentityUserStoreやIdentityRoleStoreなどのエンティティが実装され、ユーザーとロールの追加、編集、削除のロジックがカプセル化されます。 これらのエンティティには、単体テストで100%のカバレッジが必要でした。
要約すると、ASP.NET IdentityテクノロジーのコンテキストでEntity Frameworkを使用してCachéDBMSを操作するためのデータプロバイダーを実装しました。 アプリケーションは別のNugetパッケージで設計されており、必要に応じてCachéDBMSで動作し、同時に標準のMicrosoft認証を使用するので、Nuget Package Managerを介してIdentityCachéプロバイダーアセンブリをプロジェクトに実装するだけで十分です。
ソースコード、サンプル、およびテストを含むプロジェクトの実装は、
GitHubで入手でき
ます 。