首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于ASP.NET核心自定义策略的授权-不明确

基于ASP.NET核心自定义策略的授权-不明确
EN

Stack Overflow用户
提问于 2017-07-30 14:25:20
回答 2查看 789关注 0票数 5

好,在ASP.NET核中基于自定义策略的授权。我有点理解这个新的身份框架的想法,但仍然没有100%清楚你可以用它实现什么。假设我们在HomeController中有一个动作名为List。此操作将查询和显示数据库中的产品列表。必须访问此列表的用户必须是市场部的一部分。因此,在我们的策略中,我们检查用户是否有一个被称为“部门”的索赔,其价值就是市场营销。如果是的话,他将被允许看名单,否则不会。我们可以这样装饰我们的行为:

代码语言:javascript
复制
[Authorize(Policy = "ProductsAccess")]
public IActionResult List()  
{
    //do query and return the products view model
    return View();
}

这都很好。它会完美地运作。

场景1:如果我想在产品级别添加策略,并且基于策略,用户将只看到他所在部门的产品,那么怎么办?所以营销人员会看到他的产品,研发人员会看到他的产品等等。我怎样才能做到这一点?是否可以用政策来完成呢?如果是,怎么做?

场景2:在字段级别上的访问怎么样?比方说也许我想隐藏某些领域?所有产品都会有特定的列,这些列必须对管理人员可见,并对其他用户隐藏?这可以使用自定义策略来完成吗?如果是,怎么做?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-07-30 21:43:57

对于场景1,您可以使用基于资源的授权

本质上,您会将IAuthorizationService注入到服务或控制器中,然后拥有一个或多个授权处理程序,这些处理程序派生自AuthorizationHandler<TRequirement, TDocument>,然后调用

代码语言:javascript
复制
if(await _authorizationService.AuthorizeAsync(User, document, "MyPolicy"))
{
    // Success, user has access to it
}

缺点:您必须从数据库中获取所有产品,然后在内存中进行筛选,这样,对于不需要分页的单个文档或较小的数据,它将很好地工作。即使在较小的数据上,分页也会破坏它(也就是说,如果您请求50个产品,但是用户无法访问其中的40个,那么尽管页面大小为50),也只能返回10个)。

使用EFCore2.0(如果您使用EF作为您的ORM),还有一种可能的选择。您可以添加全局筛选器,它将应用于对特定实体的所有查询。

有关更多信息,请参见实体框架核心2.0公告博客文章:

代码语言:javascript
复制
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 );
    }
}

它可能适合您的情况,也可能不适合您的情况,这取决于您是否有可以使用的行级数据(即某种类型的“资源所有者”字段)。

据我所知,场景2是不可能的,您必须自己实现一些东西,但这是一个非常复杂的主题(如果您曾经使用Dynamics,您知道我的意思)。

更新

为了快速实现,您可以尝试将响应封装在ExpandoObject (这是使用dynamic关键字时底层使用的)和迭代它,删除用户在从控制器操作中返回它之前无法访问的属性,或者编写授权筛选器,这将自动对特定或所有控制器执行此操作。

有关一个粗略的想法(关于如何构造/使用扩张型对象),请参见我的答案这里

票数 4
EN

Stack Overflow用户

发布于 2017-07-30 15:27:58

我不认为政策是为了解决你的案子而设计的。我不确定这是否有可能,即使有可能,我也觉得代码本身会受到它所带来的复杂性和混乱的影响。我不会给我的授权过滤器太多的责任。

至于第二个场景,您可以跳过根据当前用户的角色、声明或其他因素在视图中输出某些数据。用政策来解决这个问题似乎是不必要的复杂。

使用策略为它的目的,授权如果用户被允许甚至运行一个方法。返回的内容有什么不同吗?在正常的代码流中处理它。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45400835

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档