基于策略的授权可以更加动态吗?

时间:2016-05-16 05:12:26

标签: asp.net-core asp.net-core-mvc

Net Core政策授权,但对我而言看起来非常不稳定。因为在企业应用程序中,经常需要新的角色,这些角色需要新的策略(据我所知)或者您想要实现特定于某个客户端的新类型的策略。例如,如果我们正在构建一个由这些策略驱动的CMS,我们将希望每个客户端能够定义他自己的策略。那么这个新的政策基础机制能否更具活力,或者它的想法完全不同?

谢谢:))

2 个答案:

答案 0 :(得分:18)

我总是建议人们看一下@ least privilege repo,因为它有一些很好的例子,说明了使用新的 ASP.NET核心身份验证和授权范例可以采取的各种方法

  

这种新的政策基础机制能否更具活力?

是的,实际上它比以前基于角色的概念更具动态性。它允许您定义可以由数据驱动的策略。 Here是另一个有关此细节的重要资源。例如,您可以指定API入口点受策略保护(例如),该策略可以有一个处理程序,该处理程序可以执行任何需要的操作,即;检查上下文中的当前User,将声明与数据库中的值进行比较,比较角色,确实是什么。考虑following

使用Policy

定义一个入口点
[Authorize(Policy = "DataDrivenExample")]
public IActionResult GetFooBar()
{
    // Omitted for brevity...
}

使用添加策略的选项添加授权。

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc();    
    services.AddAuthorization(options =>
    {
        options.AddPolicy("DataDrivenExample",
                          policy => 
                          policy.Requirements.Add(new DataDrivenRequirement()));
    });    
    services.AddSingleton<IAuthorizationHandler, DataDrivenHandler>();
}

然后定义处理程序。

public class MinimumAgeHandler : AuthorizationHandler<DataDrivenRequirement>
{
    protected override void Handle(AuthorizationContext context, 
                                   DataDrivenRequirement requirement)
    {
        // Do anything here, interact with DB, User, claims, Roles, etc.
        // As long as you set either:
        //    context.Succeed(requirement);
        //    context.Fail();
    }
}
  

这个想法完全不同吗?

它应该与您以前使用 auth8 authz 习惯的概念非常相似。

答案 1 :(得分:8)

接受的答案仍然非常有限。它不允许在Controller和Action级别使用动态值。可以添加自定义值的唯一位置是添加策略时的要求。有时您需要对授权过程进行更细粒度的控制。一种非常常见的方案是基于权限的安全性每个控制器和操作都应该能够指定访问它们所需的权限。请参阅我的回答here,以获得更强大的解决方案,该解决方案允许您使用自定义属性来装饰您的控制器和操作,并获得授权时所需的任何信息。