実装しようとしているアーキテクチャに関するアドバイスと支援を探しています。私が構築しているアプリケーションは、内部で使用する複数の ASP.NET Web サイトに SSO と中央認証を提供します。私が直面している問題は、意味のあるエンティティ フレームワークでデータを構造化する方法が思いつかないことです。
概要: 1) アカウントは多くのアプリケーションに関連付けることができます 2) ロールは各アプリケーションに固有です 3) 機能は各アプリケーションに固有です 4) 以下には示されていませんが、関連付けをさらに分解してアカウントをメンバーにしたいと思います「ディレクトリ」とアプリケーションは、アプリケーションに関連付けられたディレクトリのリスト内のユーザーにアクセスできます (これは理にかなっていますか?) ユーザー「Joe」には、次のような権限があります。
Application 1:
Role | Feature 1 | Feature 2 | Feature 3
=============================================
Role1 | x | | x
Role2 | | x | x
Role3 | x | x | x
Application 2:
Role | Feature 1 | Feature 2 | Feature 3
=============================================
Role1 | | | x
Role2 | | x |
Role3 | x | x | x
これらのアクセス許可には、次のような API を介してアクセスします。
CheckAccountPermission(Role, Feature), IsAccountInRole(Role)
現在、次のモデルを試しています。
Application.cs
public int ApplicationId { get; set; }
public Guid ApplicationGuid { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public bool IsEnabled { get; set; }
public DateTime DateCreated { get; set; }
public DateTime? LastModified { get; set; }
public virtual ICollection<Directory> Directories { get; set; }
public virtual ICollection<Feature> Features { get; set; }
public virtual ICollection<AccountPermission> AccountPermissions { get; set; }
Account.cs
public int AccountId { get; set; }
public string Username { get; set; }
public string Password { get; set; }
public string PasswordSalt { get; set; }
public string FirstName { get; set; }
public string MiddleName { get; set; }
public string LastName { get; set; }
public string EmailAddress { get; set; }
public string AvatarUrl { get; set; }
public string AccountNotes { get; set; }
public DateTime? LastLogin { get; set; }
public DateTime DateCreated { get; set; }
public DateTime? LastModified { get; set; }
public DateTime? LastActivity { get; set; }
public bool IsEnabled { get; set; }
//-------------------//
public int DirectoryId { get; set; }
public virtual Directory Directory { get; set; }
public virtual ICollection<Session> Sessions { get; set; }
public virtual ICollection<AccountPermission> AccountPermissions { get; set; }
Directory.cs
public string Name { get; set; }
public string Description { get; set; }
public bool IsEnabled { get; set; }
public virtual ICollection<Account> Accounts { get; set; }
public virtual ICollection<Role> Roles { get; set; }
public virtual ICollection<Application> Applications { get; set; }
Role.cs
public int RoleId { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public int? PrimaryRoleId { get; set; }
public Role PrimaryRole { get; set; }
public DateTime DateCreated { get; set; }
public DateTime? LastModified { get; set; }
public virtual int DirectoryId { get; set; }
public virtual Directory Directory { get; set; }
public virtual ICollection<AccountPermission> AccountPermissions { get; set; }
AccountPermission.cs
[Key, Column(Order = 0)]
public int AccountId { get; set; }
public virtual Account Account { get; set; }
[Key, Column(Order = 1)]
public int RoleId { get; set; }
public virtual Role Role { get; set; }
[Key, Column(Order = 2)]
public int FeatureId { get; set; }
public virtual Feature Feature { get; set; }
[Key, Column(Order = 3)]
public int ApplicationId { get; set; }
public virtual Application Application { get; set; }
ここで私がベースから外れていたり、道に迷ったりしている場合は、お気軽に正しい方向に向けてください。私は本当にこれを正しくしたいです。私が提供できる明確な情報があれば、お知らせください!みんな、ありがとう!