2017-02-05 13 views
0

私はデータベースとしてdotnet core + entityframeworkコア、IDサーバ、MS SQL Serverを構築しました(フロントエンドのAngular 2)。私はすでにロールでユーザー認証を実装しています。今、私はアプリケーションの異なる部分へのアクセスを制御するためにAuthorize属性を使用しています。ここでは、3つの異なる役割で使用可能なAPI関数の例があります。エンティティへのユーザーの読み取り/書き込みアクセスを制御する方法は?

[Authorize(Roles = "ProductAdministrator, WebEditor, Manager")] 
public IActionResult Get() 
{ 
    IList<Product> products = _service.GetProducts(); 
    return Ok(products); 
} 

あなたのユーザーにこれらの役割のいずれかを持っていない場合は、あなたが製品のこのリストにアクセスすることはできません。

私が直面している問題は、私が働いている顧客が各Productオブジェクトへのロールアクセスを制御できるようにすることです。作成されると、オブジェクトに割り当てられた標準的な一連の役割が存在するはずです。しかし、「管理者」ユーザーは、各オブジェクト/エンティティへのアクセスを制御できる必要があります。例えば

、我々はいくつかの役割を持つこのオブジェクトかもしれない:

var carProduct1 = new Product() { 
    Name = "Volvo XE 90", 
    Category = "Car", 
    Price = 51.600, 
    Roles = ["CarSeller", "ProductAdministrator", "Insurance", "VolvoExpert"] 
}; 

をそして、これはおそらく、今のアイデアを得る別のオブジェクト

var carProduct2 = new Product() { 
    Name = "Ford Fiesta", 
    Category = "Car", 
    Price = 15000, 
    Roles = ["ProductAdministrator", "CarDealer", "FordExpert", "CarWorkshop"] 
}; 

である可能性があります。ルートレベルでのアクセス制御からオブジェクトレベルへのアクセスを最善にするにはどうすればよいですか?これに関する書き込みはありますか(私のGoogle検索は実りありませんでした)?

答えて

1

概要Productからのアクセス許可の概念。後で他のオブジェクトにも権限を適用することができます。

public interface IPermissionProtected 
{ 
    string[] AllowedGroups { get; } 
} 

Productは許可されたエンティティです。

public class Product : IPermissionProtected 
{ 
    ... 

    public Product(..., string[] allowedGroups) 
    { 
     this.AllowedGroups = allowedGroups; 
    } 

    public string[] AllowedGroups { get; private set;} 
} 

おそらくProductを作成するときに、アクセス許可を指定します。後でこれらの権限を変更することを止めるものはありません。

var carProduct1 = new Product(new [] {"CarSeller", "ProductAdministrator", "Insurance", "VolvoExpert"}) { 
    Name = "Volvo XE 90", 
    Category = "Car", 
    Price = 51.600 
}; 

コントローラーProductに誰でもアクセスできるようにすることができます。この時点から、どのようにしたいのかははっきりしていませんが、たとえば、現在のユーザーに許可されている製品のみを返すことができます。

public IActionResult Get() 
{ 
    IList<Product> products = _service.GetProducts(currentUserRole); 
    return Ok(products); 
} 

また、あなたはあなたのユーザーが権限を持っていた製品を、与えることServiceを変更することができ、この

public IActionResult Get(int productId) 
{ 
    try 
    { 
    Product product = _service.GetProduct(productId, currentUserRole); 
    return Ok(product); 
    } 
    catch (AuthorizationException ex) 
    { 
    return NotAuthorized(ex); 
    } 
} 

を持つことができます。

public class Service 
{ 
    public IList<Product> GetProducts(string currentUserRole) 
    { 
     // compare against Product's AllowedGroups 
     return this.dataRepo.Products.Where(product => product.AllowedGroups.Contains(currentUserRole)).ToList(); 
    } 

    public Product GetProduct(int productId, string currentUserRole) 
    { 
     // compare against Product's AllowedGroups 
     var product = this.dataRepo.Products.FirstOrDefault(product => product.Id == productId); 

     if (!product.AllowedGroups.Contains(currentUserRole)) 
     { 
      throw new AuthorizationException("{0} not allowed on {1}", currentUserRole, product.Name); 
     } 
    } 
} 
関連する問題