use*_*430 5 c# asp.net-core asp.net-core-identity
好的,ASP.NET核心中基于自定义策略的授权.我有点理解这个新的身份框架的想法,但仍然没有100%清楚你可以用这个来实现.假设我们在HomeController中有一个名为List的Action.此操作将查询并显示数据库中的产品列表.必须访问此列表的用户必须是Marketing部门的一部分.因此,在我们的政策中,我们检查用户是否有一个名为Division的声明,其值是Marketing.如果是,那么他将被允许查看列表,否则不会.我们可以像这样装饰我们的动作:
[Authorize(Policy = "ProductsAccess")]
public IActionResult List()
{
//do query and return the products view model
return View();
}
Run Code Online (Sandbox Code Playgroud)
这一切都很好.它会很完美.
场景1:如果我想在产品级别添加策略,并且根据策略,用户将只看到其部门的产品,该怎么办?所以营销人员会看到他的产品,研发人员会看到他的等等.我怎样才能做到这一点?是否可以通过政策完成?如果有,怎么样?
场景2:在现场级访问怎么样?让我们说也许我想要隐藏某些字段?示例:所有产品都有某些必须对Managers可见且对其他用户隐藏的列?可以使用自定义策略完成吗?如果有,怎么样?
对于场景 1,您可以使用基于资源的授权。
本质上,您将注入IAuthorizationService
到您的服务或控制器中,然后拥有一个或多个授权处理程序,这些处理程序派生形式AuthorizationHandler<TRequirement, TDocument>
,然后调用
if(await _authorizationService.AuthorizeAsync(User, document, "MyPolicy"))
{
// Success, user has access to it
}
Run Code Online (Sandbox Code Playgroud)
缺点:您必须从数据库中获取所有产品,然后在内存中进行过滤,因此它适用于不需要分页的单个文档或较小的数据。即使对于较小的数据,分页也会破坏它(即,如果您请求 50 个产品,但用户无权访问其中的 40 个,则仅返回 10 个,尽管页面大小为 50)。
EF Core 2.0 可以作为替代方案(如果您使用 EF Core 作为 ORM)。您可以添加全局过滤器,这将应用于特定实体的所有查询。
有关更多信息,请参阅Entity Framework Core 2.0 公告博客文章:
public class BloggingContext : DbContext
{
public DbSet<Blog> Blogs { get; set; }
public DbSet<Post> Posts { get; set; }
public int TenantId {get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Post>()
.HasQueryFilter(p => !p.IsDeleted &&
p.TenantId == this.TenantId );
}
}
Run Code Online (Sandbox Code Playgroud)
它可能适合也可能不适合您的情况,这取决于您是否有可以使用的行级数据(即某种“资源所有者”字段)。
据我所知,场景 2不可能使用 Identity 开箱即用,您必须自己实现一些东西,但这是一个非常复杂的主题(如果您曾经使用过 Dynamics CRM,您就知道我的意思) 。
更新
只是为了快速实现,您可以尝试将您的响应包装在 an ExpandoObject
(这是您使用dynamic
关键字时底层使用的内容)并对其进行迭代,在从控制器操作返回或写入之前删除用户无权访问的属性授权过滤器,它将自动为特定或所有控制器执行此操作。
对于一个粗略的想法(关于如何构造/使用 Expando 对象),请参阅我的回答here。
归档时间: |
|
查看次数: |
561 次 |
最近记录: |