如何控制用户对实体的读/写访问?

时间:2017-02-05 11:59:42

标签: c# .net entity-framework authorization

我有一个基于dotnet核心+ entityframework核心,身份服务器和MS SQL Server构建的web应用程序作为数据库(前端的Angular 2)。我已经用角色实现了用户身份验证。现在我正在使用Authorize属性来控制对我的应用程序的不同部分的访问。这里我们有一个api函数的例子可用于3个不同的角色:

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

如果您的用户没有这些角色,那么您将无法访问此产品列表。

我现在面临的问题是我工作的客户希望能够控制对每个Product对象的角色访问。创建时,可能应该为对象分配某种标准的角色集。但是“admin”用户应该能够控制对每个对象/实体的访问。

例如,我们可以让这个对象具有一些角色:

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"] 
};

你现在可能已经明白了。如何才能最好地控制路由级别的访问权限到对象级别?是否有任何关于此的文章(我的谷歌搜索没有成果)?

1 个答案:

答案 0 :(得分:2)

将权限概念从\\u041e\\u043f\\u0438\\u0441\\u0430\\u043d\\u0438\\u0435 \\u0442\\u043e\\u0432\\u0430\\u0440\\u0430中抽象出来。您可能希望稍后将权限应用于其他对象。

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);
}

您可以修改public IActionResult Get(int productId) { try { Product product = _service.GetProduct(productId, currentUserRole); return Ok(product); } catch (AuthorizationException ex) { return NotAuthorized(ex); } } 以向您提供用户有权使用的产品。

Service