4

これは、stackoverflow に関する私の最初の質問なので、お手柔らかにお願いします。MVC4、Entity Framework、SimpleMembership を使用して、倉庫アプリケーションへのカスタマー ポータルを作成しています。倉庫は、複数の企業のコンテンツをホストしています。各企業には、部門と部門があります。ユーザーは、会社、部門、部門の情報にさまざまなアクセス権を持ちます。アクセス制御のためのエレガントなソリューションを探しています。これまでのところ、私のモデルは次のようになります。

public class UserProfile
{
    UserProfile()
    {
        this.AccessControl = new HashSet<AccessControl>();
    }

    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int UserId { get; set; }
    public string UserName { get; set; }
    public Nullable<int> CompanyId { get; set; }
    public virtual ICollection<AccessControl> { get; set; }
    public virtual Company Company { get; set; }
}

public class AccessControl
{
    public int AccessControlId { get; set; }
    public int UserId { get; set; }
    public int CompanyId { get; set; }
    public Nullable<int> DivisionId { get; set; }
    public Nullable<int> DepartmentId { get; set; }
    public Boolean ReadAccess { get; set; }
    public Boolean WriteAccess { get; set; }

    // other properties for access control

    public virtual UserProfile UserProfile { get; set; }
    public virtual Company Company { get; set; }
    public virtual Division Division { get; set; }
    public virtual Department Department { get; set; }
}

public class Content
{
    public int ContentId { get; set; }
    public int CompanyId { get; set; }
    public int DivisionId { get; set; }
    public int DepartmentId { get; set; }

    // Various other properties

    public virtual Company Company { get; set; }
    public virtual Division Division { get; set; }
    public virtual Department { get; set; }
}

私の考えでは、NULL Division はすべての部門を意味し、NULL Department はすべての部門を意味します。私の質問は次のとおりです。

  1. アクセス制御リストに基づいてユーザーのコンテンツ オブジェクトのリストを取得し、CRUD ビューで部門と部門の選択リストを入力するためのリポジトリ メソッドを作成するエレガントな方法は何ですか?
  2. このアクセス制御リストをモデル化するより良い方法はありますか?
4

2 に答える 2

0

アプリに依存しないポリシーベースおよび属性ベースのソリューションを検討する必要があります。このソリューションでは、承認ポリシーを記述できます。

content.department == user.department && content.company == user.companyの場合、ユーザーはウェアハウス内のコンテンツにアクセスできます。

XACMLは完璧なモデルのように聞こえます。このデモを作成しました。ここでは、購入者、金額、場所、およびPOのステータスに基づいて発注書のアクセス制御を行います。XACMLを外部で使用しているため、アプリコードを変更する必要はありません。

于 2013-03-03T04:08:24.490 に答える
0

これですべての質問に対応できるとは思いませんが、次のようなリポジトリがあると思います。

public class accessRepository
{
    accessContext context = new accessContext();

    public IQueryable<Content> GetAccessibleContentFor(int userId)
    {
        var up = context.UserProfiles.Single(u => u.UserId == userId);
        var companyId = up.CompanyId;

        return from c in context.Content 
               where c.CompanyId == companyId 
               && (up.AccessControl.Any(
                    a=> 
                        a.CompanyId == c.CompanyId && 
                        a.DivisionId == c.DivisionId && 
                        a.DepartmentId == c.DepartmentId) 
               || up.AccessControl.Any(
                    a=>a.CompanyId == c.CompanyId && 
                        a.DivisionId == c.DivisionId && 
                        a.DepartmentId == null)
               || up.AccessControl.Any(
                    a=>
                        a.CompanyId == c.CompanyId && 
                        a.DivisionId == null)
               select c;
    }
}

次の場合にアクセス可能なコンテンツを取り戻すことができます。

  1. コンテンツはユーザーの会社に帰属します。
  2. ユーザーは、会社、部門、および部門のコンテンツにアクセスできます
  3. または、ユーザーは会社と部門(すべての部門)のコンテンツにアクセスできます
  4. または、ユーザーは会社(すべての部門)のコンテンツにアクセスできます[この場合はすべての部門が想定されます。]
于 2013-03-02T18:17:30.703 に答える