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

Pet*_*nev 15 asp.net-core-mvc asp.net-core

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

谢谢 :))

Dav*_*ine 18

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

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

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

用.定义一个入口点 Policy

[Authorize(Policy = "DataDrivenExample")]
public IActionResult GetFooBar()
{
    // Omitted for brevity...
}
Run Code Online (Sandbox Code Playgroud)

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

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

然后定义处理程序.

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

这个想法完全不同吗?

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


Sha*_*awn 8

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


归档时间:

查看次数:

8365 次

最近记录:

8 年,9 月 前