【问题标题】:Can Policy Based Authorization be more dynamic?基于策略的授权可以更加动态吗?
【发布时间】:2016-09-11 20:09:47
【问题描述】:

Net Core 策略授权,但对我来说它看起来非常静态。因为在企业应用程序中,经常需要新角色,这需要新策略(据我了解),或者如果您想为特定客户端实施新类型的策略。例如,如果我们正在构建一个由这些策略驱动的 CMS,我们希望每个客户都能够定义自己的。那么这种新的政策基础机制能否更加动态,或者它的想法完全不同?

谢谢:))

【问题讨论】:

  • 在问以下问题之前,我和你一样想。 (stackoverflow.com/questions/36445780/…)。但是@Tseng 的回答改变了我的想法。答案表明policy authorization可以动态使用。看看答案,它可能对您的情况有用。
  • 你不应该再使用“角色”(就像之前在 ASP.NET 4.5 / MVC 5 中使用的那样),而是使用声明。角色不是很灵活,每次添加新角色时都需要更改代码。声明是基于您的应用程序功能的特定权限,即“ReadArticle”或“WriteArticle”、“DeleteArticle”、“CreateUser”等。这样您只需添加策略,当您添加新功能时(如管理用户或发布文章的能力)。 “角色只是用户登录时拥有的声明的集合。然后在策略中检查它
  • 请记住,以前没有动态策略时,您无法创建动态策略。 IE。如果后端没有处理它的代码(即检查用户年龄的AgeOver18 策略和处理程序),则不能允许用户指定“超过 18 岁”策略。因此,非开发人员或无权访问源代码的人无法创建策略(因为您需要在代码中为该特定策略添加检查)。您无需创建新策略,而是创建一个现有策略/权限集合的角色。

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


【解决方案1】:

我总是建议人们看看@least privilege repo,因为它提供了一些很好的示例,展示了使用新的 ASP.NET Core 身份验证和授权范例可以采用的所有各种方法。

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

是的,事实上它比以前基于角色的概念更具动态性。它允许您定义可以由数据驱动的策略。 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();
    }
}

这个想法完全不同吗?

它应该与您习惯使用 auth8authz 的先前概念非常相似。

【讨论】:

  • 谢谢你,这真的是我需要知道的一切:)))
  • 最低年龄在某个时间点从 21 岁变为 18 岁怎么样?授权如何相应更改?是否需要重启服务器?
  • 这取决于,如果它是 static 选中是 - Web 服务器将不得不重新启动。但是,如果每次都从数据库或IOptionsSnapshot&lt;T&gt; 动态检索它 - 那么不会。
  • 我感兴趣的是我是否应该将数据库中的所有权限存储为声明,然后编写我的处理程序来检查声明?还是我应该去数据库并查找用户是否有权限?我想尽可能避免访问数据库,但我也不想引入安全漏洞。我考虑过将所有权限加载为声明并将它们也存储在 cookie 中。任何帮助将不胜感激。
  • 那么使用这种方法我们需要为每个权限创建处理程序并添加服务?没有更通用的解决方案吗?
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-08
    • 1970-01-01
    • 2016-09-13
    • 2020-02-16
    • 2021-12-27
    • 2021-09-17
    • 2014-12-25
    • 1970-01-01
    相关资源
    最近更新 更多