基于角色或声明的授权?还是混血儿?
Role or claim based authorization? Or hybrid?
我有一个 ASP.NET MVC 项目,客户需要不同角色的单独访问权限。他想拥有很多角色,但其中一些角色具有非常相似的访问权限(除了一些东西)。当然,我可以像下面这样:
if (User.IsInRole("Superadmin") || User.IsInRole("CompanyAdmin") || ...)
{
// bla-bla-bla
}
else if (....)
{
}
然而,在我看来,它并没有达到应有的灵活性。权利的任何微小变化都需要脚本审查整个项目并进行更改。
我想采用 "hybrid" 方法,即像现在一样为用户设置角色,并设置声明。因此,事后只检查声明,而不检查角色列表。如果需要更改任何角色的访问权限,则只需 add/remove 登录后在一个地方声明(甚至不需要将其保存到数据库)。
你怎么看?
对一切都使用声明。有些声明可以简单地是 - 角色。因此,您可以拥有一个拥有 Claim: role > CompanyAdmin 的用户,但同一用户也可以拥有 Claim: canAccessSuperadminDashboard > true(或者您想要定义其他权限的任何方式)。
当您将两者结合使用时,您将获得非常精细的方法,您可以首先检查角色声明,然后检查特定声明的更精细的内容。
这种方法的一个好处是您的角色声明被映射到主要用户,因此您的授权(角色="Admin")直接与角色声明一起工作。
我有一个 ASP.NET MVC 项目,客户需要不同角色的单独访问权限。他想拥有很多角色,但其中一些角色具有非常相似的访问权限(除了一些东西)。当然,我可以像下面这样:
if (User.IsInRole("Superadmin") || User.IsInRole("CompanyAdmin") || ...)
{
// bla-bla-bla
}
else if (....)
{
}
然而,在我看来,它并没有达到应有的灵活性。权利的任何微小变化都需要脚本审查整个项目并进行更改。
我想采用 "hybrid" 方法,即像现在一样为用户设置角色,并设置声明。因此,事后只检查声明,而不检查角色列表。如果需要更改任何角色的访问权限,则只需 add/remove 登录后在一个地方声明(甚至不需要将其保存到数据库)。
你怎么看?
对一切都使用声明。有些声明可以简单地是 - 角色。因此,您可以拥有一个拥有 Claim: role > CompanyAdmin 的用户,但同一用户也可以拥有 Claim: canAccessSuperadminDashboard > true(或者您想要定义其他权限的任何方式)。
当您将两者结合使用时,您将获得非常精细的方法,您可以首先检查角色声明,然后检查特定声明的更精细的内容。
这种方法的一个好处是您的角色声明被映射到主要用户,因此您的授权(角色="Admin")直接与角色声明一起工作。